Daftar Isi:

Jam Teks Bergulir Arduino: 3 Langkah
Jam Teks Bergulir Arduino: 3 Langkah

Video: Jam Teks Bergulir Arduino: 3 Langkah

Video: Jam Teks Bergulir Arduino: 3 Langkah
Video: ARDUINO PROJECT INDONESIA - MEMBUAT JAM DIGITAL DENGAN RUNNING TEXT - ARDUINO INDONESIA 2024, Juli
Anonim
Jam Teks Bergulir Arduino
Jam Teks Bergulir Arduino

Tujuan dari proyek ini adalah untuk membuat jam teks bergulir yang menampilkan waktu saat diucapkan (misalnya, "ini tengah malam").

Ini adalah proyek cepat – kami memberi Anda cukup untuk memulai dengan perangkat keras dan sketsa, dan kemudian Anda dapat membawanya lebih jauh sesuai dengan kebutuhan Anda.

Langkah 1: Perangkat Keras

Perangkat keras
Perangkat keras

Anda akan membutuhkan tiga item utama –

  • papan yang kompatibel dengan Arduino Uno
  • sirkuit atau modul jam waktu nyata menggunakan IC DS1307 atau DS3231
  • dan layar LED bergaya P10 monokrom

Anda mungkin menginginkan catu daya eksternal, tetapi kita akan membahasnya nanti.

Tahap pertama adalah menyesuaikan jam real-time Anda. Klik di sini untuk tutorial jika Anda memerlukan bantuan dengan itu.

Sekarang saya harap Anda berpikir "bagaimana Anda mengatur waktu?".

Ada dua jawaban untuk pertanyaan itu. Jika Anda menggunakan DS3231 cukup atur dalam sketsa (lihat di bawah) karena akurasinya sangat baik, Anda hanya perlu mengunggah sketsa dengan waktu baru dua kali setahun untuk menutupi penghematan siang hari.

Jika tidak, tambahkan antarmuka pengguna yang sederhana – beberapa tombol dapat melakukannya. Terakhir Anda hanya perlu meletakkan perangkat keras di bagian belakang DMD. Ada banyak ruang untuk memenuhi kebutuhan Anda sendiri, solusi sederhana mungkin adalah menyelaraskan papan kontrol sehingga Anda dapat mengakses soket USB dengan mudah – dan kemudian menempelkannya dengan beberapa Sugru.

Berkenaan dengan menyalakan jam – Anda dapat menjalankan SATU tampilan LED dari Arduino, dan ini berjalan pada kecerahan yang baik untuk penggunaan di dalam ruangan. Jika Anda ingin DMD berjalan penuh, kecerahan yang membakar retina, Anda perlu menggunakan catu daya DC 5V 4A terpisah. Jika Anda menggunakan dua DMD – itu berlaku untuk 8A, dan seterusnya. Cukup sambungkan daya eksternal ke salah satu terminal DMD (hubungkan DMD kedua atau lebih ke terminal ini).

Jika Anda tidak suka memotong ujung kabel catu daya, gunakan pemutus soket DC.

Langkah 2: Sketsa Arduino

Anda perlu menginstal dua perpustakaan Arduino berikut - TimerOne dan DMD. Kemudian unggah sketsa:

// untuk RTC#include "Wire.h" #define DS1307_I2C_ADDRESS 0x68 // RTC DS1307 adalah 0x68

// untuk tampilan LED

#sertakan "SPI.h" #sertakan "DMD.h" #sertakan "TimerOne.h" #sertakan "SystemFont5x7.h" #sertakan "Arial_black_16.h" #define DISPLAYS_ACROSS 1 // Anda dapat memiliki lebih dari satu DMD dalam satu baris #define DISPLAYS_DOWN 1 DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);

String akhirString; // digunakan untuk menahan kalimat terakhir untuk ditampilkan di DMD

void ScanDMD() // diperlukan untuk DMD

{ dmd.scanDisplayBySPI(); }

batalkan pengaturan()

{ // untuk DMD Timer1.initialize(5000); Timer1.attachInterrupt(ScanDMD); dmd.clearScreen(benar);

// untuk RTC

Kawat.mulai(); // jalankan bus I2C byte detik, menit, jam, hari Minggu, hari Bulan, bulan, tahun; // ubah variabel dan batalkan komentar pada setDateDs1307 untuk mengatur waktu // lalu komentari ulang fungsi dan unggah sketsa lagi detik = 0; menit = 13; jam = 23; hariMinggu = 4; hariBulan = 19; bulan = 5; tahun = 13; // setDateDs1307(detik, menit, jam, hariMinggu, hariBulan, bulan, tahun); }

// fungsi RTC biasa

// Konversi bilangan desimal normal ke byte desimal berkode biner decToBcd(byte val) { return ((val/10*16) + (val%10)); }

// Konversi desimal berkode biner ke bilangan desimal normal

byte bcdToDec(byte val) { kembali ((val/16*10) + (val%16)); }

void setDateDs1307(byte detik, // 0-59

byte menit, // 0-59 byte jam, // 1-23 byte hariMinggu, // 1-7 byte hariBulan, // 1-28/29/byte bulan, // 1-12 byte tahun) // 0- 99 { Wire.beginTransmission(DS1307_I2C_ADDRESS); 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); // mengirimkan 0x10 (hex) 00010000 (biner) ke register kontrol - menyalakan gelombang persegi Wire.endTransmission(); }

// Mendapatkan tanggal dan waktu dari ds1307

void getDateDs1307(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) { // 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

*kedua = 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()); }

void drawText(String oldString)

{ dmd.clearScreen(benar); dmd.selectFont(Arial_Black_16); char newString[256]; int sLength = oldString.length(); oldString.toCharArray(newString, sLength+1); dmd.drawMarquee(newString, sLength, (32*DISPLAYS_ACROSS)-1, 0); mulai lama=milis(); timer lama = mulai; timer2 panjang=mulai; boolean ret=salah; while(!ret){ if ((timer+20) < milis()) { ret=dmd.stepMarquee(-1, 0); pengatur waktu=milis(); } } }

void createTextTime(int jj, int mm)

// ini menggabungkan semua data waktu menjadi teks sebagai satu kalimat { finalString=" "; // hapus kalimat untuk kasus khusus (di bawah) finalString=finalString+"It's ";

// sekarang tambahkan jamnya

if (hh==1 || hh==13) { finalString=finalString+"satu "; } if (hh==2 || jj==14) { finalString=finalString+"dua"; } if (hh==3 || jj==15) { finalString=finalString+"tiga "; } if (hh==4 || jj==16) { finalString=finalString+"empat "; } if (hh==5 || jj==17) { finalString=finalString+"five "; } if (hh==6 || jj==18) { finalString=finalString+"enam "; } if (hh==7 || jj==19) { finalString=finalString+"seven "; } if (hh==8 || jj==20) { finalString=finalString+"delapan"; } if (hh==9 || jj==21) { finalString=finalString+"sembilan "; } if (hh==10 || jj==22) { finalString=finalString+"ten "; } if (hh==11 || jj==23) { finalString=finalString+"sebelas"; }

// sekarang tambahkan menit

switch(mm){ case 1: finalString=finalString+"oh satu"; merusak; kasus 2: finalString=finalString+"oh dua"; merusak; kasus 3: finalString=finalString+"oh tiga"; merusak; kasus 4: finalString=finalString+"oh empat"; merusak; kasus 5: finalString=finalString+"oh lima"; merusak; kasus 6: finalString=finalString+"oh enam"; merusak; kasus 7: finalString=finalString+"oh tujuh"; merusak; kasus 8: finalString=finalString+"oh delapan"; merusak; kasus 9: finalString=finalString+"oh sembilan"; merusak; kasus 10: finalString=finalString+"sepuluh"; merusak; kasus 11: finalString=finalString+"sebelas"; merusak; kasus 12: finalString=finalString+"dua belas"; merusak; kasus 13: finalString=finalString+"tiga belas"; merusak; kasus 14: finalString=finalString+"empat belas"; merusak; kasus 15: finalString=finalString+"lima belas"; merusak; kasus 16: finalString=finalString+"enam belas"; merusak; kasus 17: finalString=finalString+"tujuh belas"; merusak; kasus 18: finalString=finalString+"delapan belas"; merusak; kasus 19: finalString=finalString+"sembilan belas"; merusak; kasus 20: finalString=finalString+"dua puluh"; merusak; kasus 21: finalString=finalString+"dua puluh satu"; merusak; kasus 22: finalString=finalString+"dua puluh dua"; merusak; kasus 23: finalString=finalString+"dua puluh tiga"; merusak; kasus 24: finalString=finalString+"dua puluh empat"; merusak; kasus 25: finalString=finalString+"dua puluh lima"; merusak; kasus 26: finalString=finalString+"dua puluh enam"; merusak; kasus 27: finalString=finalString+"dua puluh tujuh"; merusak; kasus 28: finalString=finalString+"dua puluh delapan"; merusak; kasus 29: finalString=finalString+"dua puluh sembilan"; merusak; kasus 30: finalString=finalString+"tiga puluh"; merusak; kasus 31: finalString=finalString+"tiga puluh satu"; merusak; kasus 32: finalString=finalString+"tiga puluh dua"; merusak; kasus 33: finalString=finalString+"tiga puluh tiga"; merusak; kasus 34: finalString=finalString+"tiga puluh empat"; merusak; kasus 35: finalString=finalString+"tiga puluh lima"; merusak; kasus 36: finalString=finalString+"tiga puluh enam"; merusak; kasus 37: finalString=finalString+"tiga puluh tujuh"; merusak; kasus 38: finalString=finalString+"tiga puluh delapan"; merusak; kasus 39: finalString=finalString+"tiga puluh sembilan"; merusak; kasus 40: finalString=finalString+"empat puluh"; merusak; kasus 41: finalString=finalString+"empat puluh satu"; merusak; kasus 42: finalString=finalString+"empat puluh dua"; merusak; kasus 43: finalString=finalString+"empat puluh tiga"; merusak; kasus 44: finalString=finalString+"empat puluh empat"; merusak; kasus 45: finalString=finalString+"empat puluh lima"; merusak; kasus 46: finalString=finalString+"empat puluh enam"; merusak; kasus 47: finalString=finalString+"empat puluh tujuh"; merusak; kasus 48: finalString=finalString+"empat puluh delapan"; merusak; kasus 49: finalString=finalString+"empat puluh sembilan"; merusak; kasus 50: finalString=finalString+"fifty"; merusak; kasus 51: finalString=finalString+"lima puluh satu"; merusak; kasus 52: finalString=finalString+"lima puluh dua"; merusak; kasus 53: finalString=finalString+"lima puluh tiga"; merusak; kasus 54: finalString=finalString+"lima puluh empat"; merusak; kasus 55: finalString=finalString+"lima puluh lima"; merusak; kasus 56: finalString=finalString+"lima puluh enam"; merusak; kasus 57: finalString=finalString+"lima puluh tujuh"; merusak; kasus 58: finalString=finalString+"lima puluh delapan"; merusak; kasus 59: finalString=finalString+"lima puluh sembilan"; merusak; }

// pagi menjelang siang?

if (hh==12 && mm==0) { finalString=finalString+"tengah hari "; } // Tengah malam? if (hh==00 && mm==0) { finalString=finalString+"midnight "; }

}

lingkaran kosong()

{ // dapatkan waktu dari byte RTC detik, menit, jam, hari Minggu, hari Bulan, bulan, tahun; getDateDs1307(&detik, &menit, &jam, &hariPekan, &hariBulan, &bulan, &tahun);

// mengubah waktu menjadi string kalimat

createTextTime(jam, menit);

// sekarang kirim teks ke DMD

drawText(string akhir); }

Sketsa memiliki fungsi biasa untuk mengatur dan mengambil waktu dari IC jam real-time DS1307/3232, dan seperti biasa dengan semua jam kami, Anda dapat memasukkan informasi waktu ke dalam variabel di void setup(), lalu batalkan komentar setDateDs1307(), unggah sketsa, komentari ulang setDateDs1307, lalu unggah sketsa sekali lagi. Ulangi proses itu untuk mengatur ulang waktu jika Anda tidak menambahkan antarmuka pengguna berbasis perangkat keras.

Langkah 3:

Setelah waktu diambil di void loop(), itu diteruskan ke fungsi createTextTime(). Fungsi ini membuat string teks untuk ditampilkan dengan memulai dengan "Ini", dan kemudian menentukan kata mana yang harus diikuti tergantung pada waktu saat ini. Akhirnya fungsi drawText() mengubah string yang menahan teks untuk ditampilkan menjadi variabel karakter yang dapat diteruskan ke DMD.

Direkomendasikan: