Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Membuat Jam 7‑Segment dengan Arduino Nano, DS3231 RTC, dan Pencahayaan Otomatis Berbasis LDR

Komponen dan Perlengkapan

Membuat Jam 7‑Segment dengan Arduino Nano, DS3231 RTC, dan Pencahayaan Otomatis Berbasis LDR
Arduino Nano R3
berfungsi baik dengan Arduino Uno atau Elegoo Uno
×1
Adafruit 7-Segment Backpack - Digit 1.2" Tinggi
- Digit 1.2" Tinggi dalam kasus saya (opsional jika Anda membeli bundel)
×1
Adafruit 1.2 4-Digit 7-Segment Display w/I2C Backpack - Hijau
×1
Adafruit DS3231
atau DS1307 jika Anda lebih suka
×1
Membuat Jam 7‑Segment dengan Arduino Nano, DS3231 RTC, dan Pencahayaan Otomatis Berbasis LDR
Resistor 100k ohm
×1
Membuat Jam 7‑Segment dengan Arduino Nano, DS3231 RTC, dan Pencahayaan Otomatis Berbasis LDR
Resistor cahaya (Photo resistor)
×1
Membuat Jam 7‑Segment dengan Arduino Nano, DS3231 RTC, dan Pencahayaan Otomatis Berbasis LDR
Breadboard (generik)
×1
Membuat Jam 7‑Segment dengan Arduino Nano, DS3231 RTC, dan Pencahayaan Otomatis Berbasis LDR
Kabel jumper (generik)
10-14 potong
×1
Baterai sel koin CR1220
×1

Aplikasi dan Layanan Online

Membuat Jam 7‑Segment dengan Arduino Nano, DS3231 RTC, dan Pencahayaan Otomatis Berbasis LDR
Arduino IDE

Tentang Proyek Ini

Pendahuluan

Di zaman di mana Anda selalu memiliki jam di pergelangan tangan Anda, baik itu jam tangan atau ponsel pintar, Arduino Uno/Nano agak membosankan. Anda sebaliknya memiliki perangkat sinkronisasi server NTP di artikel ini di luar sana, yang terus-menerus online melalui koneksi Internet Anda.

Cerita

Salah satu teman saya menolak alasan pribadi perangkat dengan koneksi WiFi di kamar tidur dan jadi saya memiliki Arduino yang dilengkapi dengan jam terpisah.

Pilih Produk yang Tepat

Saya terkejut betapa banyak produk yang berbeda bahkan Adafruit telah tersedia: tergantung pada tegangan yang diinginkan, serta dengan presisi yang berbeda! Di sini saya memutuskan untuk dua produk: yang lebih murah DS1307 dan yang mungkin lebih akurat DS3231.

Untuk jelasnya: kedua produk dapat digunakan dalam jam ini. Untuk menggunakan DS1307, perhatikan penugasan PIN yang benar dan pembatasan pada opsi tampilan suhu: catatan "//" fungsi displayTemp(); di dalam loop().

Sesuaikan Sketsa

Saya mencari sketsa dan menemukan sesuatu dengan anggota lain. Saya mengstruktur ulang dan menyesuaikan sketsa ini, tetapi tetap mempertahankan komentar bahasa Czech dan menambahkan catatan bahasa Inggris.

Iklan seharusnya besar mungkin dan jadi saya memutuskan untuk iklan 7-segment: bagaimanapun, saya hanya ingin memiliki waktu dalam pikiran.

Kejutan positif berikutnya yang saya alami saat meninjau sketsa: di sini, DS3231 menyediakan opsi untuk menggunakan suhu, yang DS1307 - selain ketidaktercakapannya - tidak memiliki.

Inisialisasi Jam

Jika Anda memiliki baterai sel koin CR1220, Anda dapat mengikuti tutorial singkat Adafruit tentang penyiapan jam. Secara ringkas, waktu tidak diunduh dari Internet, tetapi seiring waktu dari PC lokal. Stempel waktu unggahan ditransfer ke timer.

Fungsi

Selanjutnya saya menambahkan matriks LED ke rangkaian untuk keluaran waktu dan suhu. Periode untuk pergantian waktu dan suhu dapat diatur melalui variabel.

Secara khusus, bagaimana kontrol titik-titik dan digit individu - berkedip - pada matriks LED bekerja dan dikontrol, dijelaskan dengan baik dalam sketsa.

Di sini saya merujuk ke sumber Adafruit lainnya.

Sketsa diselesaikan oleh penyesuaian waktu panas/dingin dan kecerahan matriks LED tergantung pada cahaya sekitar (pada malam hari tampilan harus lebih gelap dari pada di siang hari).

Dalam video, Anda pasti memperhatikan pergantian waktu dan suhu. Apakah Anda memperhatikan titik di sebelah kiri dalam gambar? Ini mengubah posisinya (atas atau bawah) tergantung pada detik.

Berikan saya masukan jika Anda tahu cara mengeluarkan "ERR" pada matriks LED dalam hal kegagalan jam. Saat ini "bEEF" akan muncul:

Membuat Jam 7‑Segment dengan Arduino Nano, DS3231 RTC, dan Pencahayaan Otomatis Berbasis LDR
 // oh no, no data! Serial.println("DS3231 Sensor Error - cant read temperature"); matrix.print(0xBEEF, HEX); // inform the user with BEEF matrix.writeDisplay(); delay(5000); 

Ekspansi

Alarm atau waktu alarm juga belum terintegrasi.

Mungkin juga berhasil ekstensi melalui modul Bluetooth dan Blynk.

Update 01.02.2019:

Transfer dari breadboard ke taruhan permanen pada kartu lubang telah selesai hari ini. Beberapa gambar untuk yang tertarik:

Membuat Jam 7‑Segment dengan Arduino Nano, DS3231 RTC, dan Pencahayaan Otomatis Berbasis LDR
Membuat Jam 7‑Segment dengan Arduino Nano, DS3231 RTC, dan Pencahayaan Otomatis Berbasis LDR
Membuat Jam 7‑Segment dengan Arduino Nano, DS3231 RTC, dan Pencahayaan Otomatis Berbasis LDR
Membuat Jam 7‑Segment dengan Arduino Nano, DS3231 RTC, dan Pencahayaan Otomatis Berbasis LDR
Membuat Jam 7‑Segment dengan Arduino Nano, DS3231 RTC, dan Pencahayaan Otomatis Berbasis LDR

Anda akan menemukan kode terbaru v1.1 dalam lampiran serta gambar frizing yang disesuaikan.

Kode

MyClock v1.0C/C++
// MyClock v1.0 // Ingo Lohs // Hardware: tested with Arduino Uno and Arduino Nano (ATmega328P [Old Bootloader]) by using Arduino IDE v1.8.8 /* Theory for the Matrix ht16k33 The easiest is to just call print - just like you do with Serial print(variable,HEX) - this will print a hexidecimal number, from 0000 up to FFFF print(variable,DEC) or print(variable) - this will print a decimal integer, from 0000 up to 9999 If you need more control, you can call writeDigitNum(location, number) - this will write the number (0-9) to a single location. Location #0 is all the way to the left, location #2 is the colon dots so you probably want to skip it, location #4 is all the way to the right. To control the colon and decimal points, use the writeDigitRaw(location, bitmap) function. (Note that both dots of the center colon are wired together internal to the display, so it is not possible to address them separately.) Specify 2 for the location and the bits are mapped as follows: 0x02 - center colon (both dots) 0x04 - left colon - lower dot 0x08 - left colon - upper dot 0x10 - decimal point If you want a decimal point, call writeDigitNum(location, number, true) which will paint the decimal point. To draw the colon, use drawColon(true or false) If you want full control of the segments in all digits, you can call writeDigitRaw(location,bitmask) to draw a raw 8-bit mask (as stored in a uint8_t) to any location. All the drawing routines only change the display memory kept by the Arduino. Don't forget to call writeDisplay() after drawing to 'save' the memory out to the matrix via I2C. Source: https://www.mouser.com/ds/2/737/adafruit-led-backpack-932846.pdf */ #include <Wire.h> // Enable this line if using Arduino Uno, Mega, etc. #include <Adafruit_GFX.h> #include "Adafruit_LEDBackpack.h" #define DS3231_I2C_ADDRESS 0x68 int ldr_sensor = A0; // LDR Photoresistor with 100k Ohm to GND, other leg 5V int ldr_value = 0; // LDR value - var store value int brightness_matrix; // LED Matrix brightness - var store value int threshold_brightness = 400; // Threshold int blinkrate_value = 0; // LED Matrix blink rate int delay_matrix_time = 20; // how long display time (20 sec) int delay_matrix_temp = 2000; // how long display temp (2 sec) int blinky_dot = 2; // blinks nothing - on the left side 2 single dots Adafruit_7segment matrix = Adafruit_7segment(); byte decToBcd(byte val){ return ( (val/10*16) + (val%10) ); } byte bcdToDec(byte val){ return ( (val/16*10) + (val%16) ); } void setup() { Serial.begin(9600); Wire.begin(); matrix.begin(0x70); } void loop() { lightBrightness(); // Matrix-Brightness Justierung matrixBlinkrate(); // Mattrix-Blinkrate Jusitierung displayTime(); // display the real-time clock data displayTemp(); // display the temperature } void lightBrightness() { // setBrightness(brighness) - will let you change the overall brightness of the entire display. 0 is least bright, 15 is brightest and is what is initialized by the display when you start ldr_value = analogRead(ldr_sensor); Serial.print("LDR: "); Serial.println(ldr_value); if (ldr_value <= threshold_brightness) { // measurement of brightness vs Threshold brightness_matrix = 0; // bright at daylight } else { brightness_matrix = 15; // dark at night } } void matrixBlinkrate() { // blinkRate(rate) - You can blink the entire display. 0 is no blinking. 1, 2 or 3 is for display blinking. matrix.blinkRate(blinkrate_value); } void displayTime(){ matrix.setBrightness(brightness_matrix); matrix.clear(); // how long display time on matrix in seconds for (uint16_t i = 0; i < delay_matrix_time; i++) { byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; getDateDs3231(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); byte se = second; byte mi = minute; byte ho = hour; byte we = dayOfWeek; byte dm = dayOfMonth; byte mo = month; byte ye = year; // perubahan waktu ke musim panas - Minggu terakhir di Maret pukul 02.00 // >> Change to summer time - last Sunday in March at 2 o'clock if ((dayOfWeek == 7) && (dayOfMonth >= 25)&& (month == 3) && (hour == 2)) { // pengaturan jam ke 3 jam // set the clock to 3 hours setDS3231time(se,mi,3,we,dm,mo,ye); } // perubahan waktu ke musim dingin // >> Change to winter time if ((dayOfWeek == 7) && (dayOfMonth >= 25) && (month == 10) && (hour == 1)&& (year != 1)) { // tahun digunakan sebagai indikasi bahwa itu musim panas // year used as an indication that it was summer setDS3231time(se,mi,ho,we,dm,mo,1); } if ((dayOfWeek == 7) && (dayOfMonth >= 25) && (month == 10) && (hour == 3) &&(year == 1)) { // pengaturan jam ke 2 jam dan tanda tahun ke 0 // set the clock to 2 hours and flag year to 0 setDS3231time(se,mi,2,we,dm,mo,0); } /* Tentukan 2 untuk lokasi dan bit dipetakan sebagai berikut: 0x02 - titik dua tengah (kedua titik) 0x04 - titik dua kiri - titik bawah 0x08 - titik dua kiri - titik atas 0x10 - titik desimal */ /* lokasi #2 juga mengontrol 2 titik tunggal di sebelah kiri seperti ini (=blinky_dot): 2 = tidak berkedip 3 = tidak berkedip 4 = berkedip kiri atas (titik tunggal atas) 5 = berkedip kiri atas (titik tunggal atas) 6 = berkedip kiri atas (titik tunggal atas) + kedua titik dua di tengah 7 = berkedip kiri atas (titik tunggal atas) + kedua titik dua di tengah 8 = berkedip kiri bawah (titik tunggal bawah) 9 = berkedip kiri bawah (titik tunggal bawah) 10 = berkedip kiri bawah (titik tunggal bawah) + kedua titik dua di tengah 11 = berkedip kiri bawah (titik tunggal bawah) + kedua titik dua di tengah 12 = berkedip kedua titik dua (kedua titik tunggal di kiri) tanpa kedua titik dua di tengah */ // format jam: _0:mm if (hour > 9) { matrix.writeDigitNum(0, (hour / 10), false); matrix.writeDigitNum(1, (hour % 10), false); // ini akan menulis angka (0-9) ke satu lokasi dengan menggunakan modulo https://www.arduino.cc/reference/en/language/structure/arithmetic-operators/modulo/ } else { matrix.writeDigitNum(1, hour, false); } // matrix.drawColon(true); // kedua titik dua di tengah aktif: jika Anda tidak ingin titik di kiri berkedip Anda dapat mengaktifkan kedua titik dua di sini // berikan detik kesempatan untuk muncul di lokasi titik di kiri if (se <= 30) { blinky_dot = 10; // berkedip kiri bawah (titik tunggal bawah) + kedua titik dua di tengah } else if (se > 30) { blinky_dot = 6; // berkedip kiri atas (titik tunggal atas) + kedua titik dua di tengah } matrix.writeDigitRaw(2, blinky_dot); matrix.writeDigitNum(3, (minute / 10), false); matrix.writeDigitNum(4, (minute % 10), false); matrix.writeDisplay(); // titik dua berkedip untuk setengah detik delay(500); matrix.drawColon(false); matrix.writeDisplay(); delay(500); } } void displayTemp(){ matrix.setBrightness(brightness_matrix); matrix.clear(); byte temp = get3231Temp(); int abs_temp = abs(temp); // nilai absolut dari suatu nilai matrix.writeDigitNum(1,(abs_temp % 10), false); // posisi 1, nilai 9, tampilkan desimal) if (temp < 0) matrix.writeDigitRaw(0,64); if (temp <= -10) matrix.writeDigitRaw(2,12); // dan jika suhu negatif, kita menempatkan tanda minus di posisi pertama. if (temp >= 10) matrix.writeDigitNum(0, (abs_temp/10), false); // posisi 0, nilai 1, tampilkan desimal) if (temp <= -10) matrix.writeDigitNum(0, (abs_temp/10), false); // posisi 0, nilai 1, tampilkan desimal) // matrix.writeDigitRaw(2,0x10); // titik desimal matrix.writeDigitRaw(3,99); // 99 = "°" matrix.writeDigitRaw(4,57); // 57 = "C" matrix.writeDisplay(); // menampilkan nilai suhu pada baris serial // zobrazí hodnoty teploty na seriove lince Serial.print("Suhu dalam C: "); Serial.println(get3231Temp()); // +/- 3 derajat Celsius // berapa lama menampilkan suhu pada matrix dalam detik delay(delay_matrix_temp); } void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year){ // set waktu dan tanggal data ke DS3231 Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); // set input berikutnya untuk mulai di register detik Wire.write(decToBcd(second)); // set detik Wire.write(decToBcd(minute)); // set menit Wire.write(decToBcd(hour)); // set jam Wire.write(decToBcd(dayOfWeek)); // set hari dalam seminggu (1=Minggu, 7=Sabtu) Wire.write(decToBcd(dayOfMonth)); // set tanggal (1 hingga 31) Wire.write(decToBcd(month)); // set bulan Wire.write(decToBcd(year)); // set tahun (0 hingga 99) Wire.endTransmission(); } void getDateDs3231 (byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) { Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 7); *second = bcdToDec(Wire.read() & 0x7f); *minute = bcdToDec(Wire.read()); *hour = bcdToDec(Wire.read() & 0x3f); *dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read()); *month = bcdToDec(Wire.read()); *year = bcdToDec(Wire.read()); } float get3231Temp(){ byte tMSB, tLSB; float temp3231; Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0x11); Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 2); if (Wire.available()) { tMSB = Wire.read(); // 2's complement int portion tLSB = Wire.read(); // fraction portion temp3231 = (tMSB & B01111111); // do 2's math on Tmsb temp3231 += ( (tLSB >> 6) * 0.25 ); // only care about bits 7 & 8 return temp3231; } else { // oh no, no data! Serial.println("DS3231 Sensor Error - cant read temperature"); matrix.print(0xBEEF, HEX); // inform the user with BEEF matrix.writeDisplay(); delay(5000); } } 
MyClock v1.1C/C++
Update Musim Panas/Dingin
// MyClock v1.1 // Ingo Lohs // Hardware: tested with Arduino Uno and Arduino Nano (ATmega328P [Old Bootloader]) by using Arduino IDE v1.8.8 // Change v1.0 > v1.1 // dayOfWeek == 1 instead of 7 changed in displayTime() untuk menentukan Minggu yang benar untuk pergantian waktu /* Theory for the Matrix ht16k33 The easiest is to just call print - just like you do with Serial print(variable,HEX) - this will print a hexidecimal number, from 0000 up to FFFF print(variable,DEC) or print(variable) - this will print a decimal integer, from 0000 up to 9999 If you need more control, you can call writeDigitNum(location, number) - this will write the number (0-9) to a single location. Location #0 is all the way to the left, location #2 is the colon dots so you probably want to skip it, location #4 is all the way to the right. To control the colon and decimal points, use the writeDigitRaw(location, bitmap) function. (Note that both dots of the center colon are wired together internal to the display, so it is not possible to address them separately.) Specify 2 for the location and the bits are mapped as follows: 0x02 - center colon (both dots) 0x04 - left colon - lower dot 0x08 - left colon - upper dot 0x10 - decimal point If you want a decimal point, call writeDigitNum(location, number, true) which will paint the decimal point. To draw the colon, use drawColon(true or false) If you want full control of the segments in all digits, you can call writeDigitRaw(location,bitmask) to draw a raw 8-bit mask (as stored in a uint8_t) to any location. All the drawing routines only change the display memory kept by the Arduino. Don't forget to call writeDisplay() after drawing to 'save' the memory out to the matrix via I2C. Source: https://www.mouser.com/ds/2/737/adafruit-led-backpack-932846.pdf */ #include <Wire.h> // Enable this line if using Arduino Uno, Mega, etc. #include <Adafruit_GFX.h> #include "Adafruit_LEDBackpack.h" #define DS3231_I2C_ADDRESS 0x68 int ldr_sensor = A0; // LDR Photoresistor with 100k Ohm to GND, other leg 5V int ldr_value = 0; // LDR value - var store value int brightness_matrix; // LED Matrix brightness - var store value int threshold_brightness = 400; // Threshold int blinkrate_value = 0; // LED Matrix blink rate int delay_matrix_time = 20; // how long display time (20 sec) int delay_matrix_temp = 2000; // how long display temp (2 sec) int blinky_dot = 2; // blinks nothing - on the left side 2 single dots Adafruit_7segment matrix = Adafruit_7segment(); byte decToBcd(byte val){ return ( (val/10*16) + (val%10) ); } byte bcdToDec(byte val){ return ( (val/16*10) + (val%16) ); } void setup() { Serial.begin(9600); Wire.begin(); matrix.begin(0x70); } void loop() { lightBrightness(); // Matrix-Brightness Justierung matrixBlinkrate(); // Mattrix-Blinkrate Jusitierung displayTime(); // display the real-time clock data displayTemp(); // display the temperature } void lightBrightness() { // setBrightness(brighness) - will let you change the overall brightness of the entire display. 0 is least bright, 15 is brightest and is what is initialized by the display when you start ldr_value = analogRead(ldr_sensor); Serial.print("LDR: "); Serial.println(ldr_value); if (ldr_value <= threshold_brightness) { // measurement of brightness vs Threshold brightness_matrix = 0; // bright at daylight } else { brightness_matrix = 15; // dark at night } } void matrixBlinkrate() { // blinkRate(rate) - You can blink the entire display. 0 is no blinking. 1, 2 or 3 is for display blinking. matrix.blinkRate(blinkrate_value); } void displayTime(){ matrix.setBrightness(brightness_matrix); matrix.clear(); // how long display time on matrix in seconds for (uint16_t i = 0; i < delay_matrix_time; i++) { byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; getDateDs3231(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); byte se = second; byte mi = minute; byte ho = hour; byte we = dayOfWeek; byte dm = dayOfMonth; byte mo = month; byte ye = year; // perubahan waktu ke musim panas - Minggu terakhir di Maret pukul 02.00 // >> Change to summer time - last Sunday in March at 2 o'clock if ((dayOfWeek == 1) && (dayOfMonth >= 25)&& (month == 3) && (hour == 2)) { // pengaturan jam ke 3 jam // set the clock to 3 hours setDS3231time(se,mi,3,we,dm,mo,ye); } // perubahan waktu ke musim dingin // >> Change to winter time if ((dayOfWeek == 1) && (dayOfMonth >= 25) && (month == 10) && (hour == 1)&& (year != 1)) { // tahun digunakan sebagai indikasi bahwa itu musim panas // year used as an indication that it was summer setDS3231time(se,mi,ho,we,dm,mo,1); } if ((dayOfWeek == 1) && (dayOfMonth >= 25) && (month == 10) && (hour == 3) &&(year == 1)) { // pengaturan jam ke 2 jam dan tanda tahun ke 0 // set the clock to 2 hours and flag year to 0 setDS3231time(se,mi,2,we,dm,mo,0); } /* Tentukan 2 untuk lokasi dan bit dipetakan sebagai berikut: 0x02 - titik dua tengah (kedua titik) 0x04 - titik dua kiri - titik bawah 0x08 - titik dua kiri - titik atas 0x10 - titik desimal */ /* lokasi #2 juga mengontrol 2 titik tunggal di sebelah kiri seperti ini (=blinky_dot): 2 = tidak berkedip 3 = tidak berkedip 4 = berkedip kiri atas (titik tunggal atas) 5 = berkedip kiri atas (titik tunggal atas) 6 = berkedip kiri atas (titik tunggal atas) + kedua titik dua di tengah 7 = berkedip kiri atas (titik tunggal atas) + kedua titik dua di tengah 8 = berkedip kiri bawah (titik tunggal bawah) 9 = berkedip kiri bawah (titik tunggal bawah) 10 = berkedip kiri bawah (titik tunggal bawah) + kedua titik dua di tengah 11 = berkedip kiri bawah (titik tunggal bawah) + kedua titik dua di tengah 12 = berkedip kedua titik dua (kedua titik tunggal di kiri) tanpa kedua titik dua di tengah */ // format jam: _0:mm if (hour > 9) { matrix.writeDigitNum(0, (hour / 10), false); matrix.writeDigitNum(1, (hour % 10), false); // ini akan menulis angka (0-9) ke satu lokasi dengan menggunakan modulo https://www.arduino.cc/reference/en/language/structure/arithmetic-operators/modulo/ } else { matrix.writeDigitNum(1, hour, false); } // matrix.drawColon(true); // kedua titik dua di tengah aktif: jika Anda tidak ingin titik di kiri berkedip Anda dapat mengaktifkan kedua titik dua di sini // berikan detik kesempatan untuk muncul di lokasi titik di kiri if (se <= 30) { blinky_dot = 10; // berkedip kiri bawah (titik tunggal bawah) + kedua titik dua di tengah } else if (se > 30) { blinky_dot = 6; // berkedip kiri atas (titik tunggal atas) + kedua titik dua di tengah } matrix.writeDigitRaw(2, blinky_dot); matrix.writeDigitNum(3, (minute / 10), false); matrix.writeDigitNum(4, (minute % 10), false); matrix.writeDisplay(); // titik dua berkedip untuk setengah detik delay(500); matrix.drawColon(false); matrix.writeDisplay(); delay(500); } } void displayTemp(){ matrix.setBrightness(brightness_matrix); matrix.clear(); byte temp = get3231Temp(); int abs_temp = abs(temp); // nilai absolut dari suatu nilai matrix.writeDigitNum(1,(abs_temp % 10), false); // posisi 1, nilai 9, tampilkan desimal) if (temp < 0) matrix.writeDigitRaw(0,64); if (temp <= -10) matrix.writeDigitRaw(2,12); // dan jika suhu negatif, kita menempatkan tanda minus di posisi pertama. if (temp >= 10) matrix.writeDigitNum(0, (abs_temp/10), false); // posisi 0, nilai 1, tampilkan desimal) if (temp <= -10) matrix.writeDigitNum(0, (abs_temp/10), false); // posisi 0, nilai 1, tampilkan desimal) // matrix.writeDigitRaw(2,0x10); // titik desimal matrix.writeDigitRaw(3,99); // 99 = "°" matrix.writeDigitRaw(4,57); // 57 = "C" matrix.writeDisplay(); // menampilkan nilai suhu pada baris serial // zobrazí hodnoty teploty na seriove lince Serial.print("Suhu dalam C: "); Serial.println(get3231Temp()); // +/- 3 derajat Celsius // berapa lama menampilkan suhu pada matrix dalam detik delay(delay_matrix_temp); } void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year){ // set waktu dan tanggal data ke DS3231 Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); // set input berikutnya untuk mulai di register detik Wire.write(decToBcd(second)); // set detik Wire.write(decToBcd(minute)); // set menit Wire.write(decToBcd(hour)); // set jam Wire.write(decToBcd(dayOfWeek)); // set hari dalam seminggu (1=Minggu, 7=Sabtu) Wire.write(decToBcd(dayOfMonth)); // set tanggal (1 hingga 31) Wire.write(decToBcd(month)); // set bulan Wire.write(decToBcd(year)); // set tahun (0 hingga 99) Wire.endTransmission(); } void getDateDs3231 (byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) { Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 7); *second = bcdToDec(Wire.read() & 0x7f); *minute = bcdToDec(Wire.read()); *hour = bcdToDec(Wire.read() & 0x3f); *dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read()); *month = bcdToDec(Wire.read()); *year = bcdToDec(Wire.read()); } float get3231Temp(){ byte tMSB, tLSB; float temp3231; Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0x11); Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 2); if (Wire.available()) { tMSB = Wire.read(); // 2's complement int portion tLSB = Wire.read(); // fraction portion temp3231 = (tMSB & B01111111); // do 2's math on Tmsb temp3231 += ( (tLSB >> 6) * 0.25 ); // only care about bits 7 & 8 return temp3231; } else { // oh no, no data! Serial.println("DS3231 Sensor Error - cant read temperature"); matrix.print(0xBEEF, HEX); // inform the user with BEEF matrix.writeDisplay(); delay(5000); } } 
Github
https://github.com/ILohs/MySketches

Skema Rangkaian

Jalur LDR telah diperbaikiMembuat Jam 7‑Segment dengan Arduino Nano, DS3231 RTC, dan Pencahayaan Otomatis Berbasis LDRMembuat Jam 7‑Segment dengan Arduino Nano, DS3231 RTC, dan Pencahayaan Otomatis Berbasis LDR

Proses manufaktur

  1. Jam POV Arduino: Buat Tampilan LED Persistensi Penglihatan
  2. Buat Jam Numitron Retro dengan Arduino: Sederhana, Andalan, dan Hemat Energi
  3. Buat Jam Dinding Stylish dengan Neopixel Ring 60-LED Adafruit & Arduino
  4. Membuat Jam Waktu Nyata Arduino untuk Waktu Sholat Islam
  5. Bangun Jam Master LED Kustom dengan Alarm – Terlihat dari Jarak 12 Meter
  6. Arduino Pemantau Suhu & Jam Real-Time dengan Layar TFT 3.2”
  7. Kendalikan Dua Motor Stepper dengan Arduino Nano dan Joystick – Tutorial Sederhana
  8. Jam Tangan Pintar DIY Arduino: Buat Jam Tangan Gaya Apple Watch Sendiri
  9. Membuat Jam 7-Segmen Akurat dengan Arduino Pro Mini & DS1302 RTC
  10. Membuat Jam Alarm Andalan dengan DS1302 RTC dan Arduino UNO