Ini adalah proyek untuk siapa saja yang menginginkan jam besar yang bagus yang dapat dilihat dari jarak 12 meter atau dari dekat. Anda dapat membuatnya sebesar yang Anda inginkan. Ini juga menggabungkan jam alarm internal yang dapat digunakan sebagai pengendali acara, misalnya untuk sistem penyiraman otomatis untuk taman atau untuk mengingatkan Anda tentang pertemuan mingguan yang ingin Anda datangi, atau apa pun yang dapat Anda sambungkan ke relai. .
● Buzzer (Opsional – sesuatu yang cukup keras untuk membangunkan Anda di pagi hari)
● Catu daya teregulasi 5VDC yang mampu 4 – 30 Amps (Opsional untuk kecerahan tinggi – Tidak diperlukan untuk pengoperasian normal)
Langkah 1:Hubungkan bel, tombol senyap, dan sakelar set alarm ke papan tempat memotong roti
Langkah 2:Hubungkan salah satu dari masing-masing pin sakelar ke ground dan pin GND buzzer ke pin GND di Arduino (Seperti yang ditunjukkan pada diagram)
Langkah 3:Pasang pin lain dari sakelar set alarm ke D2, pin diam ke D3 dan bel ke D4
Langkah 4:Hubungkan modul RTC Anda ke Arduino sesuai dengan jenisnya (baca data manufaktur – ikuti diagram dalam banyak kasus)
Langkah 6:Untuk kecerahan penuh DMD, sambungkan sumber 5V ke terminal Kecerahan Tinggi
Langkah 7:Jika Anda ingin membuat ini pada pelindung proto, solder semua bagian ke pelindung dan sambungkan dengan benar
Pertama, Anda perlu menginstal pustaka DMD yang tersedia dari sini dan menginstalnya di folder pustaka Anda.
Perangkat lunak ini dapat diunduh dari Prototyping Corner atau di bagian bawah halaman ini. Ini berisi operasi dasar untuk Jam Master.
Untuk menyetel waktu pada modul RTC, temukan baris 117 hingga 124 dan sesuaikan ini dengan waktu saat ini. Sekarang batalkan komentar pada baris 124 dan unggah ke Arduino. Sekarang komentari baris 124 lagi dan unggah lagi. Jika ini tidak dilakukan, RTC akan tetap pada waktu yang sama.
Pada saluran 593 dan 594 Anda menyetel waktu dan hari yang Anda inginkan agar alarm berbunyi. Baris 593 adalah hari dalam seminggu yang Anda inginkan. Hari-hari sesuai dengan angka-angka sebagai berikut:
Kemudian pada line 594 atur waktu alarm berbunyi dalam waktu 24 jam.
Anda dapat menambahkan lebih banyak tampilan DMD untuk membuat jam lebih besar. Baca ini untuk informasi lebih lanjut.
Untuk menambahkan lebih banyak alarm, tambahkan baris kode berikut ke sketsa dan panggil void di loop utama:
Kode
Kode untuk Jam MasterC/C++
/* Sketsa Jam Master. Dibuat 26/03/14 Ini adalah program arduino yang menggunakan DMD Freetronics sebagai output untuk tampilan. Ini berisi fungsi alarm. Hari, tanggal dan waktu tercetak di DMD. Tombol fungsi alarm ada pada pin 2 untuk alarm set, 3 untuk snooze dan 4 untuk output alarm. Waktu alarm dan hari dalam seminggu dapat diatur pada baris 551 dan 552. Jed Hodson 2014 */byte dayOfWeek=4;byte dayOfMonth=1;#include //SPI.h harus disertakan saat DMD ditulis oleh SPI (IDE mengeluh sebaliknya)#include //#include //#include "SystemFont5x7.h"#include "Wire.h"#define DS1307_I2C_ADDRESS 0x68int AlarmSetPin =2;int SnoozePin =3;int Alarm =4;int AlarmSet =0;int Snooze =0;// Mengonversi bilangan desimal normal ke desimal berkode biner decToBcd(byte val){ return ( (val/10*16) + (val%10) );}// Mengonversi desimal berkode biner ke angka desimal normalbyte bcdToDec(byte val){ return ( (val/16*10) + (val%16) );}// 1) Menyetel tanggal dan waktu pada ds1307// 2) Memulai jam// 3) Menyetel mode jam ke 24 jam// Mengasumsikan Anda memasukkan angka yang validvoid setDateDs1307(byte detik, // 0-59byte menit, // 0-59byte jam, // 1-23byte dayOfWeek, // 1-7byte dayOfMonth, // 1-28/29/30/31byte bulan, // 1-12byte tahun) // 0-99{ Wire.beginTransmission(DS1307_I2C_AD GAUN); Kawat.tulis(0); Wire.write(decToBcd(kedua)); // 0 hingga bit 7 memulai jam Wire.write(decToBcd(minute)); Wire.write(decToBcd(jam)); Wire.write(decToBcd(hariMinggu)); Wire.write(decToBcd(hariBulan)); Wire.write(decToBcd(bulan)); Wire.write(decToBcd(tahun)); Wire.write(00010000); // mengirim 0x10 (hex) 00010000 (biner) ke register kontrol - menyalakan gelombang persegi Wire.endTransmission();}// Mendapatkan tanggal dan waktu dari ds1307void getDateDs1307(byte *second,byte *minute,byte *hour, byte *hariMinggu,byte *hariBulan,byte *bulan,byte *tahun){ // Reset pointer register Wire.beginTransmission(DS1307_I2C_ADDRESS); Kawat.tulis(0); Kawat.endTransmisi(); Wire.requestFrom(DS1307_I2C_ADDRESS, 7); // Beberapa di antaranya membutuhkan topeng karena bit tertentu adalah bit kontrol *second =bcdToDec(Wire.read() &0x7f); *menit =bcdToDec(Wire.read()); *jam =bcdToDec(Wire.read() &0x3f); // Perlu mengubah ini jika 12 jam am/pm *dayOfWeek =bcdToDec(Wire.read()); *dayOfMonth =bcdToDec(Wire.read()); *bulan =bcdToDec(Wire.read()); *tahun =bcdToDec(Wire.read());}//Aktifkan perpustakaan DMD sebagai dmdDMD dmd(1,1);void ScanDMD(){ dmd.scanDisplayBySPI();}void setup(){ byte detik, menit , jam, hari Minggu, hari Bulan, bulan, tahun; //inisialisasi penggunaan interupsi/CPU TimerOne yang digunakan untuk memindai dan menyegarkan tampilan Timer1.initialize( 5000 ); //periode dalam mikrodetik untuk memanggil ScanDMD. Lebih dari 5000 (5ms) dan Anda dapat melihat kedipan. Timer1.attachInterrupt(ScanDMD); //lampirkan interupsi Timer1 ke ScanDMD yang masuk ke dmd.scanDisplayBySPI() //clear/init piksel DMD yang disimpan di RAM dmd.clearScreen( true ); //true normal (semua piksel mati), false negatif (semua piksel aktif) dmd.selectFont(System5x7); Kawat.mulai(); // Ubah nilai ini menjadi apa yang Anda inginkan untuk mengatur jam Anda. // Anda mungkin hanya ingin menyetel jam sekali dan kemudian menghapus // panggilan setDateDs1307. detik =0; menit =35; jam =11; // gunakan waktu 24 jam jika tidak, perhitungan hari/tanggal akan dinonaktifkan dayOfWeek =1; hariBulan =23; bulan =3; tahun =14; // batalkan komentar pada panggilan setDateDs1307 di bawah untuk menyetel waktu ke interval di atas. Ingat jika Anda mengatur waktu // Anda perlu menghapus komentar pada baris di bawah ini lagi jika tidak, sketsa hanya akan tetap pada waktu yang ditentukan. //setDateDs1307(detik, menit, jam, hariMinggu, hariBulan, bulan, tahun); pinMode(AlarmSetPin, INPUT_PULLUP); pinMode(SnoozePin, INPUT_PULLUP); pinMode(Alarm, OUTPUT); digitalWrite(Alarm, LOW);}void drawDay()// menunjukkan hari dalam seminggu{ byte detik, menit, jam, dayOfWeek, dayOfMonth, bulan, tahun; getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); switch(hariPekan) { kasus 1:dmd.drawString( 1,0, "Minggu,", 3, GRAPHICS_NORMAL ); merusak; kasus 2:dmd.drawString( 1,0, "Senin,", 3, GRAPHICS_NORMAL ); merusak; kasus 3:dmd.drawString( 1,0, "Selasa,", 3, GRAPHICS_NORMAL ); merusak; kasus 4:dmd.drawString( 1,0, "Rabu",, 3, GRAPHICS_NORMAL ); merusak; kasus 5:dmd.drawString( 1,0, "Kamis,", 3, GRAPHICS_NORMAL ); merusak; kasus 6:dmd.drawString( 1,0, "Jumat",, 3, GRAPHICS_NORMAL ); merusak; kasus 7:dmd.drawString( 1,0, "Sabtu,", 3, GRAPHICS_NORMAL ); merusak; }}void drawDate()// menunjukkan tanggal numerik{ byte detik, menit, jam, hari Minggu, hari Bulan, bulan, tahun; getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); switch(hariBulan) { kasus 1:dmd.drawString( 20,0, "01", 2, GRAPHICS_NORMAL ); merusak; kasus 2:dmd.drawString( 20,0, "02", 2, GRAPHICS_NORMAL ); merusak; kasus 3:dmd.drawString( 20,0, "03", 2, GRAPHICS_NORMAL ); merusak; kasus 4:dmd.drawString( 20,0, "04", 2, GRAPHICS_NORMAL ); merusak; kasus 5:dmd.drawString( 20,0, "05", 2, GRAPHICS_NORMAL ); merusak; kasus 6:dmd.drawString( 20,0, "06", 2, GRAPHICS_NORMAL ); merusak; kasus 7:dmd.drawString( 20,0, "07", 2, GRAPHICS_NORMAL ); merusak; kasus 8:dmd.drawString( 20,0, "08", 2, GRAPHICS_NORMAL ); merusak; kasus 9:dmd.drawString( 20,0, "09", 2, GRAPHICS_NORMAL ); merusak; kasus 10:dmd.drawString( 20,0, "10", 2, GRAPHICS_NORMAL ); merusak; kasus 11:dmd.drawString( 20,0, "11", 2, GRAPHICS_NORMAL ); merusak; kasus 12:dmd.drawString( 20,0, "12", 2, GRAPHICS_NORMAL ); merusak; kasus 13:dmd.drawString( 20,0, "13", 2, GRAPHICS_NORMAL ); merusak; kasus 14:dmd.drawString( 20,0, "14", 2, GRAPHICS_NORMAL ); merusak; kasus 15:dmd.drawString( 20,0, "15", 2, GRAPHICS_NORMAL ); merusak; kasus 16:dmd.drawString( 20,0, "16", 2, GRAPHICS_NORMAL ); merusak; kasus 17:dmd.drawString( 20,0, "17", 2, GRAPHICS_NORMAL ); merusak; kasus 18:dmd.drawString( 20,0, "18", 2, GRAPHICS_NORMAL ); merusak; kasus 19:dmd.drawString( 20,0, "19", 2, GRAPHICS_NORMAL ); merusak; kasus 20:dmd.drawString( 20,0, "20", 2, GRAPHICS_NORMAL ); merusak; kasus 21:dmd.drawString( 20,0, "21", 2, GRAPHICS_NORMAL ); merusak; kasus 22:dmd.drawString( 20,0, "22", 2, GRAPHICS_NORMAL ); merusak; kasus 23:dmd.drawString( 20,0, "23", 2, GRAPHICS_NORMAL ); merusak; kasus 24:dmd.drawString( 20,0, "24", 2, GRAPHICS_NORMAL ); merusak; kasus 25:dmd.drawString( 20,0, "25", 2, GRAPHICS_NORMAL ); merusak; kasus 26:dmd.drawString( 20,0, "26", 2, GRAPHICS_NORMAL ); merusak; kasus 27:dmd.drawString( 20,0, "27", 2, GRAPHICS_NORMAL ); merusak; kasus 28:dmd.drawString( 20,0, "28", 2, GRAPHICS_NORMAL ); merusak; kasus 29:dmd.drawString( 20,0, "29", 2, GRAPHICS_NORMAL ); merusak; kasus 30:dmd.drawString( 20,0, "30", 2, GRAPHICS_NORMAL ); merusak; kasus 31:dmd.drawString( 20,0, "31", 2, GRAPHICS_NORMAL ); merusak; }}void drawHour()// menggambar jarum jam{ byte detik, menit, jam, dayOfWeek, dayOfMonth, bulan, tahun; getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); if (jam>12) //Hapus perintah if ini selama 24 jam { hour=hour-12; // Ini adalah Jam 12 jam } sakelar(jam) { kasus 1:dmd.drawString( 1,8, "01", 2, GRAPHICS_NORMAL ); merusak; kasus 2:dmd.drawString( 1,8, "02", 2, GRAPHICS_NORMAL ); merusak; kasus 3:dmd.drawString( 1,8, "03", 2, GRAPHICS_NORMAL ); merusak; kasus 4:dmd.drawString( 1,8, "04", 2, GRAPHICS_NORMAL ); merusak; kasus 5:dmd.drawString( 1,8, "05", 2, GRAPHICS_NORMAL ); merusak; kasus 6:dmd.drawString( 1,8, "06", 2, GRAPHICS_NORMAL ); merusak; kasus 7:dmd.drawString( 1,8, "07", 2, GRAPHICS_NORMAL ); merusak; kasus 8:dmd.drawString( 1,8, "08", 2, GRAPHICS_NORMAL ); merusak; kasus 9:dmd.drawString( 1,8, "09", 2, GRAPHICS_NORMAL ); merusak; kasus 10:dmd.drawString( 1,8, "10", 2, GRAPHICS_NORMAL ); merusak; kasus 11:dmd.drawString( 1,8, "11", 2, GRAPHICS_NORMAL ); merusak; kasus 12:dmd.drawString( 1,8, "12", 2, GRAPHICS_NORMAL ); merusak; kasus 13:dmd.drawString( 1,8, "13", 2, GRAPHICS_NORMAL ); merusak; kasus 14:dmd.drawString( 1,8, "14", 2, GRAPHICS_NORMAL ); merusak; kasus 15:dmd.drawString( 1,8, "15", 2, GRAPHICS_NORMAL ); merusak; kasus 16:dmd.drawString( 1,8, "16", 2, GRAPHICS_NORMAL ); merusak; kasus 17:dmd.drawString( 1,8, "17", 2, GRAPHICS_NORMAL ); merusak; kasus 18:dmd.drawString( 1,8, "18", 2, GRAPHICS_NORMAL ); merusak; kasus 19:dmd.drawString( 1,8, "19", 2, GRAPHICS_NORMAL ); merusak; kasus 20:dmd.drawString( 1,8, "20", 2, GRAPHICS_NORMAL ); merusak; kasus 21:dmd.drawString( 1,8, "21", 2, GRAPHICS_NORMAL ); merusak; kasus 22:dmd.drawString( 1,8, "22", 2, GRAPHICS_NORMAL ); merusak; kasus 23:dmd.drawString( 1,8, "23", 2, GRAPHICS_NORMAL ); merusak; kasus 24:dmd.drawString( 1,8, "24", 2, GRAPHICS_NORMAL ); merusak; }}void drawMinute(){ byte detik, menit, jam, hariPekan, hariBulan, bulan, tahun; getDateDs1307(&detik, &menit, &jam, &hariPekan, &hariBulan, &bulan, &tahun); switch(menit) { kasus 0:dmd.drawString( 20,8, "00", 2, GRAPHICS_NORMAL ); merusak; kasus 1:dmd.drawString( 20,8, "01", 2, GRAPHICS_NORMAL ); merusak; kasus 2:dmd.drawString( 20,8, "02", 2, GRAPHICS_NORMAL ); merusak; kasus 3:dmd.drawString( 20,8, "03", 2, GRAPHICS_NORMAL ); merusak; kasus 4:dmd.drawString( 20,8, "04", 2, GRAPHICS_NORMAL ); merusak; kasus 5:dmd.drawString( 20,8, "05", 2, GRAPHICS_NORMAL ); merusak; kasus 6:dmd.drawString( 20,8, "06", 2, GRAPHICS_NORMAL ); merusak; kasus 7:dmd.drawString( 20,8, "07", 2, GRAPHICS_NORMAL ); merusak; kasus 8:dmd.drawString( 20,8, "08", 2, GRAPHICS_NORMAL ); merusak; kasus 9:dmd.drawString( 20,8, "09", 2, GRAPHICS_NORMAL ); merusak; kasus 10:dmd.drawString( 20,8, "10", 2, GRAPHICS_NORMAL ); merusak; kasus 11:dmd.drawString( 20,8, "11", 2, GRAPHICS_NORMAL ); merusak; kasus 12:dmd.drawString( 20,8, "12", 2, GRAPHICS_NORMAL ); merusak; kasus 13:dmd.drawString( 20,8, "13", 2, GRAPHICS_NORMAL ); merusak; kasus 14:dmd.drawString( 20,8, "14", 2, GRAPHICS_NORMAL ); merusak; kasus 15:dmd.drawString( 20,8, "15", 2, GRAPHICS_NORMAL ); merusak; kasus 16:dmd.drawString( 20,8, "16", 2, GRAPHICS_NORMAL ); merusak; kasus 17:dmd.drawString( 20,8, "17", 2, GRAPHICS_NORMAL ); merusak; kasus 18:dmd.drawString( 20,8, "18", 2, GRAPHICS_NORMAL ); merusak; kasus 19:dmd.drawString( 20,8, "19", 2, GRAPHICS_NORMAL ); merusak; kasus 20:dmd.drawString( 20,8, "20", 2, GRAPHICS_NORMAL ); merusak; kasus 21:dmd.drawString( 20,8, "21", 2, GRAPHICS_NORMAL ); merusak; kasus 22:dmd.drawString( 20,8, "22", 2, GRAPHICS_NORMAL ); merusak; kasus 23:dmd.drawString( 20,8, "23", 2, GRAPHICS_NORMAL ); merusak; kasus 24:dmd.drawString( 20,8, "24", 2, GRAPHICS_NORMAL ); merusak; kasus 25:dmd.drawString( 20,8, "25", 2, GRAPHICS_NORMAL ); merusak; kasus 26:dmd.drawString( 20,8, "26", 2, GRAPHICS_NORMAL ); merusak; kasus 27:dmd.drawString( 20,8, "27", 2, GRAPHICS_NORMAL ); merusak; kasus 28:dmd.drawString( 20,8, "28", 2, GRAPHICS_NORMAL ); merusak; kasus 29:dmd.drawString( 20,8, "29", 2, GRAPHICS_NORMAL ); merusak; kasus 30:dmd.drawString( 20,8, "30", 2, GRAPHICS_NORMAL ); merusak; kasus 31:dmd.drawString( 20,8, "31", 2, GRAPHICS_NORMAL ); merusak; kasus 32:dmd.drawString( 20,8, "32", 2, GRAPHICS_NORMAL ); merusak; kasus 33:dmd.drawString( 20,8, "33", 2, GRAPHICS_NORMAL ); merusak; kasus 34:dmd.drawString( 20,8, "34", 2, GRAPHICS_NORMAL ); merusak; kasus 35:dmd.drawString( 20,8, "35", 2, GRAPHICS_NORMAL ); merusak; kasus 36:dmd.drawString( 20,8, "36", 2, GRAPHICS_NORMAL ); merusak; kasus 37:dmd.drawString( 20,8, "37", 2, GRAPHICS_NORMAL ); merusak; kasus 38:dmd.drawString( 20,8, "38", 2, GRAPHICS_NORMAL ); merusak; kasus 39:dmd.drawString( 20,8, "39", 2, GRAPHICS_NORMAL ); merusak; kasus 40:dmd.drawString( 20,8, "40", 2, GRAPHICS_NORMAL ); merusak; kasus 41:dmd.drawString( 20,8, "41", 2, GRAPHICS_NORMAL ); merusak; kasus 42:dmd.drawString( 20,8, "42", 2, GRAPHICS_NORMAL ); merusak; kasus 43:dmd.drawString( 20,8, "43", 2, GRAPHICS_NORMAL ); merusak; kasus 44:dmd.drawString( 20,8, "44", 2, GRAPHICS_NORMAL ); merusak; kasus 45:dmd.drawString( 20,8, "45", 2, GRAPHICS_NORMAL ); merusak; kasus 46:dmd.drawString( 20,8, "46", 2, GRAPHICS_NORMAL ); merusak; kasus 47:dmd.drawString( 20,8, "47", 2, GRAPHICS_NORMAL ); merusak; kasus 48:dmd.drawString( 20,8, "48", 2, GRAPHICS_NORMAL ); merusak; kasus 49:dmd.drawString( 20,8, "49", 2, GRAPHICS_NORMAL ); merusak; kasus 50:dmd.drawString( 20,8, "50", 2, GRAPHICS_NORMAL ); merusak; kasus 51:dmd.drawString( 20,8, "51", 2, GRAPHICS_NORMAL ); merusak; kasus 52:dmd.drawString( 20,8, "52", 2, GRAPHICS_NORMAL ); merusak; kasus 53:dmd.drawString( 20,8, "53", 2, GRAPHICS_NORMAL ); merusak; kasus 54:dmd.drawString( 20,8, "54", 2, GRAPHICS_NORMAL ); merusak; kasus 55:dmd.drawString( 20,8, "55", 2, GRAPHICS_NORMAL ); merusak; kasus 56:dmd.drawString( 20,8, "56", 2, GRAPHICS_NORMAL ); merusak; kasus 57:dmd.drawString( 20,8, "57", 2, GRAPHICS_NORMAL ); merusak; kasus 58:dmd.drawString( 20,8, "58", 2, GRAPHICS_NORMAL ); merusak; kasus 59:dmd.drawString( 20,8, "59", 2, GRAPHICS_NORMAL ); merusak; }}void drawCol(){ dmd.drawString( 14,8, ":", 1, GRAPHICS_NORMAL );}void runClock(){ drawDay(); drawDate(); drawHour(); drawCol(); drawMinute(); CheckAlarm();}void AlarmSequence() { drawDay(); drawDate(); drawHour(); drawCol(); drawMinute(); digitalWrite(Alarm, TINGGI); penundaan (1000); dmd.clearScreen(benar); digitalWrite(Alarm, RENDAH); delay(1000);}void CheckAlarm() { AlarmSet =digitalRead(AlarmSetPin); Tunda =digitalRead(SnoozePin); byte detik, menit, jam, hari Minggu, hari Bulan, bulan, tahun; getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); /* Only Trigger Alarm Jika ini adalah hari yang tercantum di bawah ini. Ini dapat diubah dengan mengubah angka menjadi salah satu dari berikut ini:1 =Minggu 2 =Senin 3 =Selasa 4 =Rabu 5 =Kamis 6 =Jumat 7 =Sabtu */ if(dayOfWeek ==2 || dayOfWeek ==3 | | dayOfWeek ==4 || dayOfWeek ==5 ||dayOfWeek ==6) { //Ini adalah hari-hari yang DIPERBOLEHKAN untuk membunyikan alarm jika(jam ==18 &&menit ==05 ) { //Setel Waktu Di Sini (Dalam 24 jam Time) if(AlarmSet ==LOW) { //Jika pin alarm aktif Snooze =digitalRead(SnoozePin); while(Tunda ==TINGGI) { Tunda =digitalBaca(SnoozePin); Urutan Alarm(); } } } }}loop kosong(){ runClock(); }
Skema