Isi kandungan:

Jam Teks Arduino Scrolling: 3 Langkah
Jam Teks Arduino Scrolling: 3 Langkah

Video: Jam Teks Arduino Scrolling: 3 Langkah

Video: Jam Teks Arduino Scrolling: 3 Langkah
Video: TUTORIAL RUNNING TEXT LED DOT MATRIX MAX7219 ARDUINO TULISAN BERJALAN MUDAH 2024, Julai
Anonim
Jam Teks Arduino Scrolling
Jam Teks Arduino Scrolling

Objektif projek ini adalah untuk membina jam teks bergulir yang memaparkan waktu seperti yang diucapkan (misalnya, "sudah tengah malam").

Ini adalah projek pantas - kami memberi anda cukup banyak untuk meneruskan perkakasan dan lakaran, dan kemudian anda dapat mengambilnya lebih jauh untuk memenuhi keperluan anda.

Langkah 1: Perkakasan

Perkakasan
Perkakasan

Anda memerlukan tiga item utama -

  • papan serasi Arduino Uno
  • litar jam sebenar atau modul menggunakan IC DS1307 atau DS3231
  • dan paparan LED gaya P10 monokrom

Anda mungkin mahukan bekalan kuasa luaran, tetapi kita akan mendapatkannya kemudian.

Peringkat pertama adalah sesuai dengan jam masa nyata anda. Klik di sini untuk tutorial jika anda memerlukan bantuan untuk itu.

Sekarang saya harap anda berfikir "bagaimana anda menetapkan masa?".

Terdapat dua jawapan untuk soalan itu. Sekiranya anda menggunakan DS3231 tetapkannya dalam lakaran (lihat di bawah) kerana ketepatannya sangat baik, anda hanya perlu memuat naik lakaran dengan waktu baru dua kali setahun untuk menampung penjimatan siang.

Jika tidak, tambahkan antara muka pengguna yang mudah - beberapa butang boleh melakukannya. Akhirnya anda hanya perlu meletakkan perkakasan di bahagian belakang DMD. Terdapat banyak ruang lingkup untuk memenuhi keperluan anda sendiri, penyelesaian yang mudah adalah dengan menyelaraskan papan kawalan sehingga anda dapat mengakses soket USB dengan mudah - dan kemudian pasangkannya dengan beberapa Sugru.

Berkenaan dengan menghidupkan jam - anda boleh menjalankan SATU paparan LED dari Arduino, dan ia berjalan dengan kecerahan yang baik untuk kegunaan dalaman. Sekiranya anda mahu DMD berjalan sepenuhnya, kecerahan pembakar retina anda perlu menggunakan bekalan kuasa 5V 4A DC yang berasingan. Sekiranya anda menggunakan dua DMD - iaitu 8A, dan seterusnya. Cukup sambungkan kuasa luaran ke satu terminal DMD (sambungkan DMD kedua atau lebih ke terminal ini).

Sekiranya anda tidak suka memotong hujung kabel bekalan kuasa anda, gunakan pemutus soket DC.

Langkah 2: Lakaran Arduino

Anda perlu memasang dua perpustakaan Arduino berikut - TimerOne dan DMD. Kemudian muat naik lakaran:

// untuk RTC # sertakan "Wire.h" #tentukan DS1307_I2C_ADDRESS 0x68 // RTC DS1307 ialah 0x68

// untuk paparan LED

#include "SPI.h" #include "DMD.h" #include "TimerOne.h" #include "SystemFont5x7.h" #include "Arial_black_16.h" # tentukan DISPLAYS_ACROSS 1 // anda boleh mempunyai lebih dari satu DMD dalam baris # tentukan DISPLAYS_DOWN 1 DMD dmd (DISPLAYS_ACROSS, DISPLAYS_DOWN);

String finalString; // digunakan untuk menahan ayat terakhir untuk dipaparkan di DMD

batal ScanDMD () // diperlukan untuk DMD

{dmd.scanDisplayBySPI (); }

persediaan tidak sah ()

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

// untuk RTC

Wire.begin (); // aktifkan bas byte I2C kedua, minit, jam, dayOfWeek, dayOfMonth, bulan, tahun; // ubah pemboleh ubah dan lepaskan setDateDs1307 untuk menetapkan waktu // kemudian komen semula fungsi dan muat naik lakarannya lagi kedua = 0; minit = 13; jam = 23; dayOfWeek = 4; dayOfMonth = 19; bulan = 5; tahun = 13; // setDateDs1307 (kedua, minit, jam, dayOfWeek, dayOfMonth, bulan, tahun); }

// fungsi RTC biasa

// Tukarkan nombor perpuluhan normal menjadi bait perpuluhan berkod binari decToBcd (byte val) {return ((val / 10 * 16) + (val% 10)); }

// Tukar perpuluhan berkod binari ke nombor perpuluhan normal

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

batal setDateDs1307 (bait kedua, // 0-59

minit bait, // 0-59 jam bait, // 1-23 hari baitOfWeek, // 1-7 bait hariOfMonth, // 1-28 / 29 / bulan bait, // 1-12 tahun bait) // 0- 99 {Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.write (decToBcd (kedua)); // 0 hingga bit 7 memulakan jam Wire.write (decToBcd (minit)); Wire.write (decToBcd (jam)); Wire.write (decToBcd (dayOfWeek)); Wire.write (decToBcd (dayOfMonth)); Wire.write (decToBcd (bulan)); Wire.write (decToBcd (tahun)); Wire.write (00010000); // menghantar 0x10 (hex) 00010000 (binari) untuk mengawal daftar - menghidupkan Wire.endTransmission gelombang persegi (); }

// Mendapat tarikh dan masa dari ds1307

batal getDateDs1307 (bait * kedua, bait * minit, bait * jam, bait * hariOfWeek, bait * hariOfMonth, bait * bulan, bait * tahun) {// Tetapkan semula penunjuk daftar Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (0); Wire.endTransmission ();

Wire.requestFrom (DS1307_I2C_ADDRESS, 7);

// Sebilangan ini memerlukan topeng kerana bit tertentu adalah bit kawalan

* kedua = bcdToDec (Wire.read () & 0x7f); * minit = bcdToDec (Wire.read ()); * jam = bcdToDec (Wire.read () & 0x3f); // Perlu mengubahnya jika 12 jam am / pm * dayOfWeek = bcdToDec (Wire.read ()); * dayOfMonth = bcdToDec (Wire.read ()); * bulan = bcdToDec (Wire.read ()); * tahun = bcdToDec (Wire.read ()); }

kekosongan 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); permulaan panjang = milis (); pemasa panjang = mula; pemasa panjang2 = mula; boolean ret = salah; sementara (! ret) {if ((pemasa + 20) <millis ()) {ret = dmd.stepMarquee (-1, 0); pemasa = milis (); }}}

batal createTextTime (int hh, int mm)

// ini menggabungkan data sepanjang masa ke dalam teks sebagai satu kalimat {finalString = ""; // hapuskan hukuman untuk kes khas (di bawah) finalString = finalString + "It's";

// sekarang tambah jam

jika (hh == 1 || hh == 13) {finalString = finalString + "satu"; } jika (hh == 2 || hh == 14) {finalString = finalString + "two"; } jika (hh == 3 || hh == 15) {finalString = finalString + "three"; } jika (hh == 4 || hh == 16) {finalString = finalString + "empat"; } jika (hh == 5 || hh == 17) {finalString = finalString + "lima"; } jika (hh == 6 || hh == 18) {finalString = finalString + "enam"; } jika (hh == 7 || hh == 19) {finalString = finalString + "tujuh"; } jika (hh == 8 || hh == 20) {finalString = finalString + "lapan"; } jika (hh == 9 || hh == 21) {finalString = finalString + "sembilan"; } jika (hh == 10 || hh == 22) {finalString = finalString + "sepuluh"; } jika (hh == 11 || hh == 23) {finalString = finalString + "sebelas"; }

// sekarang tambahkan minit

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

// tengah hari?

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

}

gelung kosong ()

{// dapatkan masa dari RTC bait kedua, minit, jam, dayOfWeek, dayOfMonth, bulan, tahun; getDateDs1307 (& kedua, & minit, & jam, & dayOfWeek, & dayOfMonth, & bulan, & tahun);

// ubah masa menjadi rentetan ayat

createTextTime (jam, minit);

// sekarang hantarkan teks ke DMD

drawText (finalString); }

Sketsa mempunyai fungsi biasa untuk mengatur dan mengambil masa dari IC jam masa nyata DS1307 / 3232, dan seperti biasa dengan semua jam kami, anda dapat memasukkan maklumat masa ke dalam pemboleh ubah dalam penyediaan kosong (), dan kemudian tidak menetapkan setDateDs1307 (), muat naik lakaran, komen semula setDateDs1307, kemudian muat naik lakaran sekali lagi. Ulangi proses itu untuk menetapkan semula waktu jika anda tidak menambahkan antara muka pengguna berasaskan perkakasan.

Langkah 3:

Setelah masa diambil dalam gelung void (), ia akan diteruskan ke fungsi createTextTime (). Fungsi ini membuat rentetan teks untuk ditampilkan dengan memulai dengan "It's", dan kemudian menentukan kata-kata mana yang harus diikuti bergantung pada waktu saat ini. Akhirnya fungsi drawText () menukar rentetan memegang teks untuk dipaparkan menjadi pemboleh ubah watak yang boleh disalurkan ke DMD.

Disyorkan: