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

Jam Alarm LCD dengan banyak wajah

Komponen dan persediaan

Arduino UNO
Jika menggunakan PCB yang disertakan, gunakan mikroprosesor ATmega328 DIL, kristal 16MHz, kapasitor 2x22pf, regulator 7805, Kapasitor 100uF 16V, capaitor 3 x 0,1uF, dan kapasitor 1uF.
× 1
Resistor 10k ohm
× 4
Melalui Resistor Lubang, 470 ohm
× 1
Adafruit LCD Standar - 16x2 Putih di Atas Biru
× 1
Buzzer
× 1
Kapasitor 10 F
× 1
Jam Waktu Nyata (RTC)
DS1302 RTC
× 1
Kristal 32,768 kHz
× 1
Baterai Sel Koin CR2032
+ pemegang. Jika menggunakan PCB, gunakan baterai dan dudukan CR1220
× 1
Sakelar Miring, Terenkapsulasi
Saklar merkuri
× 1
Potensiometer Pemangkas, 10 kohm
× 1

Alat dan mesin yang diperlukan

Printer 3D (generik)

Aplikasi dan layanan online

Arduino IDE

Tentang proyek ini

Versi baru dengan 10 tampilan jam dapat ditemukan di sini .


Mencari-cari sesuatu untuk dibangun, saya memutuskan pada jam LCD 1602. Setelah meneliti Web dan menemukan banyak implementasi yang berbeda, saya memutuskan mengapa tidak membuat satu jam yang menggabungkan semuanya.

Fitur Jam

  • Delapan gaya tampilan berbeda
  • Setel waktu, tanggal saat ini, tanggal lahir, dan alarm
  • Tombol merkuri untuk mematikan alarm
  • Kontrol lampu latar
  • Sensor Suhu dan Kelembaban DHT21

Versi papan tempat memotong roti

Elektronik sebenarnya cukup sederhana.

Setelah kabel, muat sketsa ke IDE Arduino Anda dan unggah ke Arduino UNO. (Tidak ditampilkan adalah DHT21 disambungkan ke D9)

Menggunakan jam

Jam memiliki tiga tombol - SETUP, INCREMENT, DECREMENT, dan tombol TILT.

Saat lampu latar mati, menekan tombol apa saja akan menyalakan lampu latar. Jika tidak ada tombol yang ditekan saat lampu latar menyala, lampu akan mati dengan sendirinya setelah 5 detik. Saat lampu latar menyala, tombol akan melakukan tugas berikut:

PENYIAPAN - Ini menampilkan layar SETUP. Karakter kurung siku kanan adalah kursor. Menekan tombol INCREMENT atau DECREMENT masing-masing akan menambah atau mengurangi nilai kursor. Menekan tombol SETUP lagi akan menggilir kursor antara Jam, Menit, Hari, Bulan, Tahun, Hari Lahir, Bulan Lahir, Tahun Lahir, Jam Alarm, Menit Alarm dan kembali ke mode JAM.

PENINGKATAN - Saat tidak berada di layar SETUP, tombol ini beralih di antara berbagai gaya jam.

PENURUNAN - Saat tidak berada di layar SETUP, tombol ini mengaktifkan atau menonaktifkan Alarm.

SAKLAR KEMIRING - Saat alarm berbunyi, memiringkan jam atau menekan tombol apa saja akan mematikan alarm.

Membangun jam yang telah selesai sepenuhnya

Mengambil bangunan Anda dari papan tempat memotong roti ke jam yang sepenuhnya selesai akan membutuhkan papan sirkuit tercetak dan beberapa komponen tambahan. File Eagle terlampir jika Anda ingin membuat PCB secara komersial atau melakukan seperti yang saya lakukan dan membuatnya sendiri. Saya menggunakan metode Toner.

CATATAN:Karena layar LCD 1602 terhubung ke PCB utama menggunakan pin header sudut kanan, akan sangat sulit untuk memasukkan papan dan layar ke dalam casing jika sudah disolder bersama. Memiliki papan dua sisi dengan pelapis lubang tembus akan memungkinkan Anda untuk menyolder layar ke papan di tempatnya.

Menggunakan suku cadang yang saya miliki di sekitar bengkel, Arduino UNO diganti dengan chip ATMega328 DIL, kristal 16MHz, dan dua kapasitor keramik 22pf. Regulator 5V adalah tipe 7805 TO-220 dan kapasitor 100uF 16V untuk menghaluskan. RTC adalah DS1302 dengan kristal arloji 32,768 KHz. Speaker adalah buzzer pasif yang diisolasi DC dengan kapasitor 10uF 16V. Kapasitor 0.1uF dan 1uF adalah kapasitor keramik monolitik (jarak lubang 5mm). Resistor 5% 1/8 watt atau Anda dapat menggunakan 1/4 watt jika diinginkan. Saklar merkuri bisa dalam berbagai ukuran. Milik saya berdiameter 5mm tetapi yang lebih kecil sudah cukup. Tiga tombol taktil yang dipasang di bagian belakang papan berukuran 6mmx6mm dengan poros 13mm.

Kasing ini dicetak 3D menggunakan ketinggian lapisan 0,2 mm dan tanpa penyangga. Bor lubang pemasangan PCB dengan bor 2,5 mm dan buat ulir menggunakan keran 3 mm. Gunakan sekrup M3 6mm untuk menahan papan pada tempatnya. Saya juga mengebor empat lubang pemasangan pada PCB hingga 4mm untuk memungkinkan penyesuaian yang diperlukan agar tombol tidak menempel pada casing saat mengamankan papan.

Kredit

Jam ini merupakan gabungan dari sejumlah jam yang telah dibuat oleh berbagai pembuat selama bertahun-tahun.

Dasar dari jam ini adalah Arduino Digital Clock With Alarm Function (custom PCB). Saya memodifikasi kasingnya sehingga dicetak menjadi dua bagian dan bukan empat.

  • Desain layar standar oleh Michalis Vasilakis
  • Font Tebal Ganda oleh Arduino World
  • Font Miring Ganda oleh Forum Arduino
  • font Dual Trek oleh Carrie Sundra
  • Font Tipis Ganda oleh Arduino World
  • Konsep kata oleh LAGSILVA
  • Jam bioritme oleh John Bradnam
  • Jam Cuaca oleh ARDUinoautoMOTIVE

Pembaruan

29/06/20

- Memperbaiki kesalahan ejaan di jam WORD
- Menambahkan #defines untuk mengontrol lampu latar
- Meningkatkan batas waktu lampu latar dari 5 menjadi 10 detik

23/11/20

- Menambahkan pengaturan tanggal lahir dan penyimpanan EEPROM
- Menambahkan tampilan jam Biorhythm
- Membersihkan pengkodean layar Pengaturan

Dihipotesiskan bahwa berdasarkan tanggal lahir kita, bioritme mungkin menentukan pasang surut kehidupan kita. Bioritme terdiri dari tiga siklus:siklus fisik 23 hari, siklus emosional 28 hari, dan siklus intelektual 33 hari. Jam bioritme menunjukkan setiap status sebagai bilah.

Bilah menunjukkan bahwa bioritme berada dalam siklus positif (bilah atas) atau siklus negatif (batang bawah). Panjang bilah menunjukkan seberapa positif atau negatifnya siklus tersebut.

12/06/20

- Menambahkan Dukungan DHT21
- Menambahkan tampilan jam Termometer dan Kelembaban

Wajah jam cuaca baru telah ditambahkan. Bunyinya sensor suhu dan kelembaban DHT21 ditambahkan ke bagian belakang kasing. PCB telah diperbarui untuk menyertakan konektor 3-pin ke sensor DHT21.


Kode

  • DigitalClockAlarmV7.ino
DigitalClockAlarmV7.inoC/C++
/* 1602 Jam alarm LCD * oleh John Bradnam ([email protected]) * * Tampilan 16x2:Pengaturan:Pengaturan Alarm * +----------------+ +- ---------------+ +----------------+ * |HH:MM:SS | HH:MM| |>HH :>MM | | Setel Alarm | * |DD/MM/YY | ALARM| |>DD />MM />YYYY | |>HH :>MM | * +----------------+ +----------------+ +------------ ----+ * * 25/06/2020 * - Mengambil jam Michalis Vasilakis sebagai basis kode (https://www.instructables.com/id/Arduino-Digital-Clock-With-Alarm-Function-custom-P/ ) * - Dimodifikasi agar sesuai dengan perangkat keras - DS1302 RTC dan lampu latar LCD * - Dukungan tambahan untuk gaya tampilan yang berbeda * - Desain layar standar oleh Michalis Vasilakis * - Font Tebal Ganda oleh Arduino World (https://www.hackster.io/thearduinoworld/ arduino-digital-clock-version-1-b1a328) * - Font Dual Trek oleh Forum Arduino (https://forum.arduino.cc/index.php/topic,8882.0.html) * - Font Dual Trek oleh Carrie Sundra ( https://www.alpenglowindustries.com/blog/the-big-numbers-go-marching-2x2) * - Font Dual Thin oleh Arduino World (https://www.hackster.io/thearduinoworld/arduino-digital-clock -version-2-5bab65) * - Konsep Word oleh LAGSILVA (https://www.hackster.io/lagsilva/text-clock-bilingual-en-pt-with-arduino-881a6e) * 29/06/20 * - Memperbaiki kesalahan ejaan di jam WORD * - Menambahkan #defines ke cont rol backlight * - Peningkatan batas waktu lampu latar dari 5 menjadi 10 detik * 22/11/20 * - Menambahkan pengaturan tanggal lahir dan penyimpanan EEPROM * - Menambahkan tampilan jam Biorhythm * - Membersihkan pengkodean layar Pengaturan * xx/xx/21 * - Menambahkan DHT21 Dukungan * - Menambahkan tampilan jam Termometer dan Kelembaban *///Libraries#include #include #include #include #include # sertakan //batalkan komentar jika Anda ingin varian layar tebal atau tipis ganda menampilkan format 12 jam//#define DUAL_THICK_12HR//#define DUAL_THIN_12HR//batalkan komentar untuk mengontrol lampu latar//#define NO_BACKLIGHT//#define BACKLIGHT_ALWAYS_ON# tentukan BACKLIGHT_TIMEOUT 10000//batalkan komentar untuk menguji grafik bioritme//#define TEST_BIO_GRAPHS#define LIGHT 2 //PD2#define LCD_D7 3 //PD3#define LCD_D6 4 //PD4#define LCD_D5 5 //PD5#define LCD_D4 6 //PD6 #define LCD_E 7 //PD7#define LCD_RS 8 //PB0#define BTN_SET A0 //PC0#define BTN_ADJUST A1 //PC1#define BTN_ALARM A2 //PC2#define BTN_TILT A3 //PC3#define SPEAKER 11 //PB3# tentukan DHT 21 9 //PB1#define RTC_CE 10 //PB2#define RTC_IO 12 //PB4#define RTC_SCLK 13 //PB5//Koneksi dan konstanta LiquidCrystal lcd(LCD_RS, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7);DS1302RTC rtc( RTC_CE, RTC_IO, RTC_SCLK);dht DHT;char daysOfTheWeek[7][12] ={"Minggu",,"Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"};const int bulanHari[12] ={ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };interval panjang =300; int melodi[] ={ 600, 800, 1000.1200 };//Variablesint DD, MM, YY, H, M, S, temp, hum, set_state, adjust_state, alarm_state, AH, AM, shake_state, BY, BM, BD;int shakeTimes =0;int i =0;String sDD;String sMM;String sYY;String sH;String sM;String sS;String sBD;String sBM;String sBY;String aH="12";String aM=" 00";String sTMP;String sHUM;//String alarm =" ";long prevAlarmMillis =0;long prevDhtMillis =0;//Boolean flagsboolean setupScreen =false;boolean alarmON=false;boolean turnItOn =false;enum STYLE { STANDAR, DUAL_THICK, DUAL_BEVEL, DUAL_TREK, DUAL_THIN, WORD, BIO, THERMO };STYLE currentStyle =STANDARD;enum SETUP { CLOCK, TIME_HOUR, TIME_MIN, TIME_DAY, TIME_MONTH, TIME_YEAR, TIME_MONYOUR, BIRALA_MONYDAY, BULAN_SETULAN =MIN.;bool backlightOn =false;long backlightTimeout =0;byte customChar[8];//--------------------- EEPROM --------- ---------------------------------#menentukan EEPROM_AH 0 //Jam Alarm#menentukan EEPROM_AM 1 //Menit Alarm# tentukan EEPROM_AO 2 //Alarm Aktif/Nonaktif#define EEPROM_CS 3 //Gaya saat ini#define EEPROM_BY 4 //Tahun Lahir#define EEPROM_BM 6 //Bulan Lahir#define EEPROM_BD 7 //Hari Lahir//--------- ------------ Jam kata ------------------------------------ --String unit[] ={"RATUSAN", "SATU", "DUA", "TIGA", "EMPAT", "LIMA", "ENAM", "TUJUH", "DELAPAN", "SEMBILAN"};String remaja[] ={"TEN", "ELEVEN", "TWELVE", "THIRTEEN", "FOURTEEN", "FIFTEEN", "SIXTEEN", "SEVENTEEN", "DELAPAN BELAS", "SEMBILAN BELAS"};String puluhan[] ={"", "", "DUA PULUH", "TIGA PULUH", "EMPAT PULUH", "LIMA PULUH"};//---------------------- Jam pasir animasi ----------------------------#define HOURGLASS_FRAMES 8#define HOURGLASS_CHAR 0#define FRAME_TIMEOUT 200;int nextFrame =0;long frameTimeout =0;const byte jam pasir[HOURGLASS_FRAMES][8] PROGMEM ={ { B11111, B11111, B01010, B01010, B01010, B01010, B10001, B11111 }, { B11111, B11011, B01110, B01010, B01010, B01010, B10001, B11111 }, { B11111, B10001, B01110, B01110, B01010, B01010, B10001, B11111 }, { B11111, B10001, B01010, B01110, B01110 , B01010, B10001, B11111 }, { B11111, B10001, B01010, B01010, B01110, B01110, B10001, B11111 }, { B11111, B10001, B01010, B01010, B01010, B01110, B10101, B11111 }, { B11111, B10001, B01010 , B01010, B01010, B01110, B11011, B11111 }, { B11111, B10001, B01010, B01010, B01010, B01010, B11111, B11111 }, //{ B11111, B10001, B01010, B01010, B01010, B01010, B10001, B11111 }};//---------------------- Alarm, jam, dan karakter khusus DHT ------------------ ----------#define BELL_CHAR 1#define CLOCK_CHAR 2#define THERMOMETER_CHAR 3#define DROPLET_CHAR 4const byte bell[8] PROGMEM ={0x4, 0xe, 0xe, 0xe, 0x1f, 0x0, 0x4};const jam byte[8] PROGMEM ={0x0, 0xe, 0x15, 0x17, 0x11, 0xe, 0x0};const byte thermometer[8] PROGMEM ={0x4, 0xa, 0xa, 0xe, 0xe, 0x1f, 0x1f, 0xe};const byte droplet[8] PROGMEM ={0x4, 0x4, 0xa, 0xa, 0x11, 0x11, 0x11, 0xe};#define DHT_UPDATE_INTERVAL 6000//------------------- --- Jam BioRhythm ----------------------------//Konstanta karakter khusus (M adalah MSB atau karakter batang atas r, L adalah LSB atau karakter batang bawah#define PHYSICAL_M 3#define PHYSICAL_L 4#define EMOTIONAL_M 5#define EMOTIONAL_L 6#define INTELLECTUAL_M 7#define INTELLECTUAL_L 8//--------------- ------- Huruf Persegi Tebal ----------------------------#define C0 3#define C1 4#define C2 5 #define C3 6const byte C_0[8] PROGMEM ={0x1F,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00};const byte C_1[8] PROGMEM ={0x1F,0x1F,0x1F,0x00,0x00,0x 0x1F,0x1F};const byte C_2[8] PROGMEM ={0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x1F};const byte C_3[8] PROGMEM ={0x00,0x00,0x0E,0x0A,0x0x0x 0x0E,0x00,0x00};const byte blockChar[11][2][3] ={ {{ 255, C0, 255}, {255, C2, 255}}, //0 {{ C0, 255, 32} , {C2, 255, C2}}, //{{ C0, C0, 255}, {255, C1, C2}}, //2 {{ C1, C1, 255}, {C1, C1, 255} }, //3 {{ 255, C2, 255}, {32, 32, 255}}, //4 {{ 255, C1, C1}, {C2, C2, 255}}, //5 {{ 255 , C0, C0}, {255, C1, 255}}, //6 {{ C0, C1, 255}, {32, C0, 255}}, //7 {{ 255, C1, 255}, {255 , C1, 255}}, //8 {{ 255, C1, 255}, {C2, C2, 255}}, //9 {{ 32, 32, 32}, {32, 32, 32}}, //Kosong};//---------------------- Font Bevel Tebal -------------- --------------#define LT 0#define UB 1#define RT 2#define LL 3#define LB 4#define LR 5#define UMB 6#define LMB 7const byte _LT[8 ] PROGMEM ={ B00111, B01111, B11111, B11111, B11111, B11111, B11111, B11111};const byte _UB[8] PROGMEM ={ B11111, B11111, B11111, B00000, B00000, B00000, B00000, B00000};const byte _RT [8] PROGMEM ={ B11100, B11110, B11111, B11111, B11111, B11111, B11111, B11111};const byte _LL[8] PROGMEM ={ B11111, B11111, B11111, B11111, B11111, B11111, B01111, B00111};const byte _LB[8] PROGMEM ={ B00000, B00000, B00000, B00000, B00000, B11111, B11111, B11111};const byte _LR[8] PROGMEM ={ B11111, B11111, B11111, B11111, B11111, B11111, B11110, B11100};const byte _UMB[8] PROGMEM ={ B11111, B11111, B11111, B00000, B00000, B00000, B11111, B11111};const byte _LMB[8] PROGMEM ={ B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111};const byte bevelChar[11][2][3] ={ {{LT, UB, RT}, {LL, LB, LR} }, //0 {{UB, RT, 32}, {LB, LMB, LB}}, //1 {{UMB, UMB, RT}, {LL, LB, LB}}, //2 {{UMB , UMB, RT}, {LB, LB, LR}}, //3 {{LL, LB, LMB}, {32, 32, LMB}}, //4 {{LT, UMB, UMB}, {LB , LB, LR}}, //5 {{LT, UMB, UMB}, {LL, LB, LR}}, //6 {{UB, UB, RT}, {32, 32, LT}}, / /7 {{LT, UMB, RT}, {LL, LB, LR}}, //8 {{LT, UMB, RT}, {32, 32, LR}}, //9 {{ 32, 32, 32}, {32, 32, 32}} //Kosong};//---------------------- Trek Font -------- --------------------#define K0 0#define K1 1#define K2 2#define K3 3#define K4 4#define K5 5#define K6 6#define K7 7const byte K_0[8] PROGMEM ={0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00};const byte K_1[8] PROGMEM ={0x18,0x18,0x18,0x18,0x18,0x18,0x18, 0x18};const byte K_2[8] PROGMEM ={0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F};const byte K_3[8] PROGMEM ={0x1F,0x1F,0x03,0x03,0x03,0x03, 0x1F,0x1F};const byte K_4[8] PROGMEM ={0x1F,0x1F,0x18,0x18,0x18,0x18,0x1F,0x1F};const byte K_5[8] PROGMEM ={0x1F,0x1F,0x18,0x18,0x 0x18,0x18,0x18};const byte K_6[8] PROGMEM ={0x03,0x03,0x03,0x03, 0x03,0x03,0x1F,0x1F};const byte K_7[8] PROGMEM ={0x1F,0x1F,0x03,0x03,0x03,0x03,0x03,0x03};const byte trekChar[11][2][2] ={ { { K5, K7}, {255, K6}}, //0 {{ K0, K1}, {K2, 255}}, //{{ K0, K3}, {255, K2}}, //2 {{ K0, K3}, {K2, 255}}, //3 {{ K1, 255}, {K0, K1}}, //4 {{ K4, K0}, {K2, 255}}, // 5 {{ K5, K0}, {K4, 255}}, //6 {{ K0, 255}, {32, K1}}, //7 {{ 255, K3}, {K4, 255}}, / /8 {{ 255, K3}, {K2, K6}}, //9 {{ 32, 32}, {32, 32}}, //Kosong};//---------- ------------ Font Tipis ----------------------------#define T0 0#define T1 1 #define T2 2#define T3 3#define T4 4#define T5 5#define T6 6#define T7 7const byte T_0[8] PROGMEM ={0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02};const byte T_1[8] PROGMEM ={0x0E,0x02,0x02,0x02,0x02,0x02,0x02,0x0E};konst byte T_2[8] PROGMEM ={0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x0E};const byte T_3[8] PROGMEM ={0x0E,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0E};const byte T_5[8] PROGMEM ={0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A 0x0E};const byte T_4[8] PROGMEM ={0x0E,0x0A,0x0A,0x0A,0x0 A,0x0A,0x0A,0x0A};const byte T_6[8] PROGMEM ={0x0E,0x02,0x02,0x02,0x02,0x02,0x02,0x02};const byte T_7[8] PROGMEM ={0x18,0x18,0x18, 0x18,0x18,0x1E,0x1F,0x1F};//lcd menggambar fungsi karakterconst byte thinChar[11][2] ={ {T4, T5}, //0 {T0, T0}, ///1 {T1, T2} , //2 {T1, T1}, //3 {T5, T6}, //4 {T2, T1}, //5 {T2, T3}, //6 {T6, T0}, //7 { T3, T3}, //8 {T3, T1}, //9 {32, 32} //kosong}; //---------------------- Inisialisasi umum ------------------------ ----void setup() { Serial.begin(115200); //Mengatur output/input pinMode(BTN_SET,INPUT); pinMode(BTN_ADJUST,INPUT); pinMode(BTN_ALARM, INPUT); pinMode(BTN_TILT, INPUT); pinMode(SPEAKER, OUTPUT); pinMode(CAHAYA, OUTPUT); //Periksa apakah RTC memiliki waktu/tanggal yang valid, jika tidak atur ke 00:00:00 01/01/2018. //Ini hanya akan berjalan saat pertama kali atau jika baterai koin hampir habis. //setSyncProvider() menyebabkan pustaka Waktu menyinkronkan dengan // RTC eksternal dengan memanggil RTC.get() setiap lima menit secara default. setSyncProvider(rtc.get); if (timeStatus() !=timeSet) { Serial.println("Mengatur waktu default"); //Mengatur RTC tmElements_t tm; tm.Tahun =KalenderYrToTm(2020); tm.Bulan =06; tm.Hari =26; tm.Jam =7; tm.Menit =52; tm.Kedua =0; waktu_t t =makeTime(tm); //gunakan nilai time_t untuk memastikan hari kerja yang benar disetel if (rtc.set(t) ==0) { // Success setTime(t); } else { Serial.println("Pengaturan RTC gagal!"); } } penundaan(100); //Membaca waktu alarm dari memori EEPROM AH =EEPROM.read(EEPROM_AH); AM =EEPROM.read(EEPROM_AM); byte ao =EEPROM.read(EEPROM_AO); alarmON =(ao !=0); byte cs =EEPROM.read(EEPROM_CS); //Periksa apakah angka yang Anda baca valid. (Jam:0-23 dan Menit:0-59) if (AH> 23) { AH =0; } jika (AM> 59){ AM =0; } //Baca Tanggal lahir dari EEPROM BY =(EEPROM.read(EEPROM_BY + 0) <<8) | EEPROM.read(EEPROM_BY+1); if (DENGAN <1900 || OLEH> 2099) { OLEH =2000; } BM =EEPROM.read(EEPROM_BM); if (BM <0 || BM> 12) { BM =1; } BD =EEPROM.read(EEPROM_BD); if (BD <0 || BD> 31) { BD =1; } //Setup gaya saat ini lcd.begin(16,2); currentStyle =(cs> (uint8_t)THERMO) ? STANDAR :(GAYA)cs; sakelar (gaya arus) { kasus STANDAR:lcdStandardSetup(); merusak; kasus DUAL_THICK:lcdDualThickSetup(); merusak; kasus DUAL_BEVEL:lcdDualBevelSetup(); merusak; kasus DUAL_TREK:lcdDualTrekSetup(); merusak; kasus DUAL_THIN:lcdDualThinSetup(); merusak; kasus KATA:lcdWordSetup(); merusak; kasus BIO:lcdBioRhythmSetup(); merusak; kasus TERMO:lcdThermometerSetup(); merusak; } #ifdef BACKLIGHT_ALWAYS_ON switchBacklight(true);#endif}//---------------------- Perulangan program utama ----------- -----------------void loop() { readBtns(); //Tombol Baca getTimeDate(); //Baca waktu dan tanggal dari RTC getTempHum(); //Baca suhu dan kelembapan if (!setupScreen) { lcdPrint(); //Biasanya mencetak waktu/tanggal/alarm saat ini ke LCD if (alarmON) { callAlarm(); // dan periksa alarm jika diaktifkan if (turnItOn) { switchBacklight(true); } } //Serial.println("backlightTimeout=" + String(backlightTimeout) + ", millis()=" + String(millis()) + ", backlightOn=" + String(backlightOn));#ifdef BACKLIGHT_TIMEOUT if ( backlightOn &&(millis()> backlightTimeout)) { switchBacklight(false); }#endif } else { timeSetup(); //Jika tombol set ditekan maka panggil fungsi pengaturan waktu switchBacklight(true); }}//--------------------------------------------- ----//Tombol Baca statevoid readBtns(){ set_state =digitalRead(BTN_SET); adjust_state =digitalRead(BTN_ADJUST); alarm_state =digitalRead(BTN_ALARM); if (!backlightOn &&!setupScreen) { if (set_state ==LOW || adjust_state ==LOW || alarm_state ==LOW) { //Nyalakan sakelar lampu latarBacklight(true); // perlu menahan tombol setidaknya 1/2 detik penundaan(500); } } else { if(!setupScreen) { if (alarm_state ==RENDAH) { alarmON =!alarmON; EEPROM.write(EEPROM_AO, (alarmON) ? 1 :0); penundaan (500); switchBacklight(benar); } else if (adjust_state ==LOW) { currentStyle =(currentStyle ==THERMO) ? STANDAR :(GAYA)((int)Gaya saat ini + 1); EEPROM.write(EEPROM_CS, (byte)currentStyle); sakelar (gaya arus) { kasus STANDAR:lcdStandardSetup(); merusak; kasus DUAL_THICK:lcdDualThickSetup(); merusak; kasus DUAL_BEVEL:lcdDualBevelSetup(); merusak; kasus DUAL_TREK:lcdDualTrekSetup(); merusak; kasus DUAL_THIN:lcdDualThinSetup(); merusak; kasus KATA:lcdWordSetup(); merusak; kasus BIO:lcdBioRhythmSetup(); merusak; kasus TERMO:lcdThermometerSetup(); merusak; } lcd.clear(); lcdPrint(); penundaan (500); switchBacklight(benar); } } if (set_state ==LOW) { setupMode =(setupMode ==ALARM_MIN) ? JAM :(SETUP)((int)setupMode + 1); if( setupMode !=CLOCK ) { setupScreen =true; if (mode pengaturan ==WAKTU_JAM) { lcd.clear(); lcd.setCursor(0,0); lcd.print("------SET------"); lcd.setCursor(0,1); lcd.print("-WAKTU dan TANGGAL-"); penundaan(2000); lcd.clear(); } } else { lcd.clear(); //Mengatur RTC tmElements_t tm; tm.Tahun =KalenderYrToTm(YY); tm.Bulan =MM; tm.Hari =DD; tm.Jam =H; tm.Menit =M; tm.Kedua =0; waktu_t t =makeTime(tm); //gunakan nilai time_t untuk memastikan hari kerja yang benar disetel if (rtc.set(t) ==0) { // Success setTime(t); } else { Serial.println("Pengaturan RTC gagal!"); } //rtc.adjust(TanggalWaktu(YY, MM, DD, H, M, 0)); //Simpan waktu dan tanggal ke RTC IC EEPROM.write(EEPROM_AH, AH); //Simpan jam alarm ke EEPROM EEPROM.write(EEPROM_AM, AM); //Simpan menit alarm ke EEPROM EEPROM.write(EEPROM_BY + 0, BY>> 8); //Simpan tahun lahir ke EEPROM EEPROM.write(EEPROM_BY + 1, BY &0xFF); //Simpan tahun lahir ke EEPROM EEPROM.write(EEPROM_BM, BM); //Simpan bulan lahir ke EEPROM EEPROM.write(EEPROM_BD, BD); //Simpan tanggal lahir ke EEPROM lcd.print("Menyimpan...."); penundaan(2000); lcd.clear(); setupScreen =salah; setupMode =JAM; switchBacklight(benar); } penundaan (500); } }}//-------------------------------------------------------- -----//Baca waktu dan tanggal dari rtc icvoid getTimeDate(){ if (!setupScreen) { //DateTime now =rtc.now(); waktu_t t =sekarang(); DD =hari(t); MM =bulan(t); YY =tahun(t); H =jam(t); M =menit(t); S =detik(t); } //Buat beberapa perbaikan... sDD =((DD <10) ? "0" :"") + String(DD); sMM =((MM <10) ? "0" :"") + String(MM); sYY =String(YY-2000); sH =((H <10) ? "0" :"") + String(H); sM =((M <10) ? "0" :"") + String(M); sS =((S <10) ? "0" :"") + String(S); sBD =((BD <10) ? "0" :"") + String(BD); sBM =((BM <10) ? "0" :"") + String(BM); sBY =String(BY); aH =((AH <10) ? "0" :"") + String(AH); aM =((AM <10) ? "0" :"") + String(AM);}//------------------------- -------------------------//Baca suhu dan kelembaban setiap 6 detik dari DHT sensorvoid getTempHum(){ unsigned long currentMillis =millis(); if (currentMillis - prevDhtMillis>=DHT_UPDATE_INTERVAL) { int chk =DHT.read21(DHT21); prevDhtMillis =saatMillis; hum =min(bulat(DHT.kelembaban),99); suhu =min(bulat(DHT.suhu),99); sTMP =((suhu> 9) ? "" :" ") + String(suhu); sHUM =((berdengung> 9) ? "" :" ") + String(berdengung); }}//--------------------------------------------- ----//Menyalakan atau mematikan lampu latarvoid switchBacklight(bool on){ #ifdef NO_BACKLIGHT digitalWrite(LIGHT, LOW); lampu latar Aktif =benar; //Menipu perangkat lunak dengan berpikir bahwa itu aktif meskipun tidak #else #ifdef BACKLIGHT_ALWAYS_ON digitalWrite(LIGHT, HIGH); lampu latar Aktif =benar; #else digitalWrite(LIGHT, (on) ? HIGH :LOW); lampu latar Hidup =hidup; backlightTimeout =milis() + BACKLIGHT_TIMEOUT; #endif #endif}//------------------------------------------- -------//Mencetak nilai ke sakelar displayvoid lcdPrint(){ (currentStyle) { case STANDAR:lcdStandardLayout(); merusak; kasus DUAL_THICK:lcdDualThickLayout(); merusak; kasus DUAL_BEVEL:lcdDualBevelLayout(); merusak; kasus DUAL_TREK:lcdDualTrekLayout(); merusak; kasus DUAL_THIN:lcdDualThinLayout(); merusak; kasus KATA:lcdWordLayout(); merusak; kasus BIO:lcdBioRhythmLayout(); merusak; kasus TERMO:lcdThermometerLayout(); merusak; }}//--------------------------------------------- -- Tata letak standar ---------------------------------------------- -----------------------void lcdStandardSetup(){}void lcdStandardLayout(){ String line1 =sH+":"+sM+":"+sS+" | "+aH+":"+aM; String baris2 =sDD+"/"+sMM+"/"+sYY +" | " + ((alarmON &&(S &0x01)) ? "ALARM" :" "); lcd.setCursor(0,0); //baris pertama lcd.print(baris1); lcd.setCursor(0,1); //baris kedua lcd.print(baris2); }//Buat karakter khusus dari program memoryvoid createCharP(byte slot, byte* p){ for (int i =0; i <8; i++) { customChar[i] =pgm_read_byte(p++); } lcd.createChar(slot, customChar);}//------------------------------------- ----------- Tata letak Tebal Ganda ------------------------------------ ---------------------------------void lcdDualThickSetup(){ createCharP(C0, C_0); createCharP(C1, C_1); createCharP(C2, C_2); createCharP(C3, C_3); createCharP(BELL_CHAR, bell);}void lcdDualThickLayout(){#ifdef DUAL_THICK_12HR int h =(H>=12) ? H - 12 :H; if (h ==0) { h =12; } lcdDualThickPrintNumber(8, M, benar); lcdDualThickPrintNumber(0, h, salah); lcd.setCursor(15,0); lcd.print((H>=12) ? "p" :"a"); lcd.setCursor(15,1); lcd.print("m"); #else lcdDualThickPrintNumber(8, M, benar); lcdDualThickPrintNumber(0, H, benar); alarm bool =(S &0x01); lcdWordShowBell(15, 0, alarm, BELL_CHAR); //pojok kanan bawah lcdWordShowBell(15, 1, !alarm, BELL_CHAR); //pojok kanan bawah #endif byte c =(S &1) ? C3 :32; lcd.setCursor(7,0); lcd.tulis(c); lcd.setCursor(7,1); m leadingZero){ int t =angka / 10; int u =angka % 10; if (t ==0 &&!leadingZero) { t =11; } lcdDualThickPrintDigit(pos, t); m <2; y++) { lcd.setCursor(pos, y); for (int x =0; x <3; x++) { lcd.write(blockChar[angka][y][x]); } }}//-------------------------------------------------------- --- Tata letak Bevel Ganda -------------------------------------------- ------------------------- void lcdDualBevelSetup(){ createCharP(LT, _LT); createCharP(UB, _UB); createCharP(RT, _RT); createCharP(LL, _LL); createCharP(LB, _LB); createCharP(LR, _LR); createCharP(UMB, _UMB); createCharP(LMB, _LMB);}void lcdDualBevelLayout(){#ifdef DUAL_THICK_12HR int h =(H>=12) ? H - 12 :H; if (h ==0) { h =12; } lcdDualBevelPrintNumber(8, M, benar); lcdDualBevelPrintNumber(0, h, salah); lcd.setCursor(15,0); lcd.print((H>=12) ? "p" :"a"); lcd.setCursor(15,1); lcd.print("m"); #else lcdDualBevelPrintNumber(8, M, benar); lcdDualBevelPrintNumber(0, H, benar); alarm bool =(S &0x01); lcdWordShowBell(15, 0, alarm, 65); //pojok kanan bawah lcdWordShowBell(15, 1, !alarm, 65); //pojok kanan bawah #endif byte c =(S &1) ? 58 :32; lcd.setCursor(7,0); lcd.tulis(c); lcd.setCursor(7,1); lcd.write(c);}//Gambar 2 nomor baris// pos - posisi x untuk menggambar nomor// nomor - nilai untuk menggambar// leadingZero - apakah nol di depan harus ditampilkanvoid lcdDualBevelPrintNumber(int pos, int nomor, int leadingZero){ int t =angka / 10; int u =angka % 10; if (t ==0 &&!leadingZero) { t =11; } lcdDualBevelPrintDigit(pos, t); m <2; y++) { lcd.setCursor(pos, y); for (int x =0; x <3; x++) { lcd.write(bevelChar[angka][y][x]); } }}//-------------------------------------------------------- --- Tata letak Trek Ganda -------------------------------------------- -------------------------void lcdDualTrekSetup(){ createCharP(K0, K_0); createCharP(K1, K_1); createCharP(K2, K_2); createCharP(K3, K_3); createCharP(K4, K_4); createCharP(K5, K_5); createCharP(K6, K_6); createCharP(K7, K_7);}void lcdDualTrekLayout(){ lcdDualTrekPrintNumber(10, S, benar); lcdDualTrekPrintNumber(5, M, benar); lcdDualTrekPrintNumber(0, H, benar); byte c =(S &1) ? 165 :32; lcd.setCursor(4,0); lcd.tulis(c); lcd.setCursor(4,1); lcd.tulis(c); lcd.setCursor(9,0); lcd.tulis(c); lcd.setCursor(9,1); lcd.tulis(c); bool alarm =(S &0x01); lcdWordShowBell(15, 0, alarm, 65); //bottonm right corner lcdWordShowBell(15, 1, !alarm, 65); //bottonm right corner}//Draw a 2 line number// pos - x position to draw number// number - value to draw// leadingZero - whether leading zeros should be displayedvoid lcdDualTrekPrintNumber(int pos, int number, int leadingZero){ int t =number / 10; int u =number % 10; if (t ==0 &&!leadingZero) { t =11; } lcdDualTrekPrintDigit(pos, t); lcdDualTrekPrintDigit(pos + 2, u);}//Draw a 2 line digit// pos - x position to draw number// number - value to drawvoid lcdDualTrekPrintDigit(int pos, int number){ for (int y =0; y <2; y++) { lcd.setCursor(pos, y); for (int x =0; x <2; x++) { lcd.write(trekChar[number][y][x]); } }}//------------------------------------------------ Dual Thin layout ---------------------------------------------------------------------void lcdDualThinSetup(){ createCharP(T0, T_0); createCharP(T1, T_1); createCharP(T2, T_2); createCharP(T3, T_3); createCharP(T4, T_4); createCharP(T5, T_5); createCharP(T6, T_6); createCharP(T7, T_7);}void lcdDualThinLayout(){ #ifdef DUAL_THIN_12HR int h =(H>=12) ? H - 12 :H; if (h ==0) { h =12; } lcdDualThinPrintNumber(6, S, true); lcdDualThinPrintNumber(3, M, true); lcdDualThinPrintNumber(0, h, false); lcd.setCursor(9,0); lcd.print((H>=12) ? "p" :"a"); lcd.setCursor(9,1); lcd.print("m"); #else lcdDualThinPrintNumber(6, S, true); lcdDualThinPrintNumber(3, M, true); lcdDualThinPrintNumber(0, H, true);#endif byte c =(S &1) ? 165 :32; lcd.setCursor(2,0); lcd.write(c); lcd.setCursor(2,1); lcd.write(c); lcd.setCursor(5,0); lcd.write(c); lcd.setCursor(5,1); lcd.write(c); String line1 =aH+":"+aM; String line2 =(alarmON &&(S &0x01)) ? "ALARM" :" "; lcd.setCursor(11,0); //First row lcd.print(line1); lcd.setCursor(11,1); //Second row lcd.print(line2); }//Draw a 2 line number// pos - x position to draw number// number - value to draw// leadingZero - whether leading zeros should be displayedvoid lcdDualThinPrintNumber(int pos, int number, int leadingZero){ int t =number / 10; int u =number % 10; if (t ==0 &&!leadingZero) { t =11; } lcdDualThinPrintDigit(pos, t); lcdDualThinPrintDigit(pos + 1, u);}//Draw a 2 line digit// pos - x position to draw number// number - value to drawvoid lcdDualThinPrintDigit(int pos, int number){ for (int y =0; y <2; y++) { lcd.setCursor(pos, y); lcd.write(thinChar[number][y]); }}//------------------------------------------------ Word layout ---------------------------------------------------------------------void lcdWordSetup(){ createCharP(BELL_CHAR, &bell[0]);}void lcdWordLayout(){ String line1 =numberToWord(H, false); String line2 =numberToWord(M, true); lcd.setCursor(0,0); //First row printClear(line1, 13); lcd.setCursor(0,1); //Second row printClear(line2, 14); if (millis()> frameTimeout) { frameTimeout =millis() + FRAME_TIMEOUT; //lcd.createChar(HOURGLASS_CHAR, &hourglass[nextFrame][0]); createCharP(HOURGLASS_CHAR, &hourglass[nextFrame][0]); nextFrame =(nextFrame + 1) % HOURGLASS_FRAMES; lcd.setCursor(13,0); //First row lcd.write((int)HOURGLASS_CHAR); lcd.print(sS); } bool alarm =(S &0x01); lcdWordShowBell(14, 1, alarm, BELL_CHAR); //Second row lcdWordShowBell(15, 1, !alarm, BELL_CHAR); //Second row}//Display the bell symbol if alarm is on// x - x position (0..15)// y - y position (0..1)// show - true to showvoid lcdWordShowBell(int x, int y, bool show, byte chr) { lcd.setCursor(x,y); lcd.print(""); if (alarmON &&show) { lcd.setCursor(x,y); lcd.write(chr); }}//Print character string and clear to right// s - String to print...This file has been truncated, please download it to see its full contents.

Suku cadang dan penutup khusus

stl_files_ZuDXHCHZCl.zip

Skema

Schematic and PCB in Eagle files eagle_files_ZN59zdeNf5.zip

Proses manufaktur

  1. Alarm air raspberry pi 2 dengan tukang sepatu plus
  2. Panel LCD dengan Arduino untuk Simulator Penerbangan
  3. Jam alarm yang benar-benar membuat Anda bangun dari tempat tidur di pagi hari
  4. Jam IV9 Numitron DIY paling sederhana dengan Arduino
  5. Jam Arduino dengan waktu sholat Islam
  6. Word Clock dengan Resolusi Menit Waktu dalam Words
  7. Suhu Arduino. Monitor Dan Jam Waktu Nyata Dengan Tampilan 3.2
  8. TM1637 Jam Digital dengan pengaturan waktu dan fungsi alarm
  9. Menampilkan Gambar Pada Layar TFT LCD Dengan Arduino UNO!
  10. Jam Alarm Sederhana dengan DS1302 RTC