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

Jam Matriks LED Mini

Komponen dan persediaan

Arduino Nano R3
× 1
Maxim Integrated DS3231M - ±5ppm, I2C Real-Time Clock
× 1
Sakelar Tombol Tekan, Sesaat
× 2
Modul matriks led 32x8
× 1

Alat dan mesin yang diperlukan

Besi solder (generik)

Aplikasi dan layanan online

Arduino IDE

Tentang proyek ini

Pada halaman "Proyek LED Nick" saya menemukan penyihir proyek jam menunjukkan waktu pada 4 matriks dengan 8x8 leds. Dia membuat jam dengan matriks dari toko "ICStation" yang menjual Kit DIY panel modul matriks.

Dengan sedikit perubahan kode, saya membuat jam saya dengan MAX7219 modul dot matrix icrocontroller Tampilan empat-dalam-satu yang benar-benar terlipat dan jauh lebih murah. Saya membelinya dari AliExpress.

Jam memiliki banyak fitur :

- Mode dasar dengan angka besar

- Mode geser di mana angka berguling dan mematikan layar

- Digit kecil dengan mode detik

- Waktu ditulis dengan kata-kata, mis. “sepuluh lewat dua belas”

- Tampilan tanggal

- Opsi 12/24 jam

- Opsi kecerahan

- Opsi mode jam acak yang mengubah mode tampilan setiap beberapa jam.

- Menu yang digerakkan oleh tombol tekan untuk pengaturan dan pemilihan tampilan.

Seperti yang Anda lihat di sirkuit, kecuali matriks, kami membutuhkan papan arduino, modul jam waktu nyata, dan dua tombol untuk pengaturan. Anda dapat mengunduh pustaka dan kode yang dimodifikasi di tautan di bawah ini.

Kode

  • kode
  • Perpustakaan
kodeArduino
/********************************************* *************************Mini Clock v1.0, Jul 2014 oleh Nick HallDidistribusikan di bawah ketentuan GPL.Untuk bantuan tentang cara membangun jam lihat blog saya:http://123led.wordpress.com/Diuji pada IDE v1.6.5 ***************************** ******************************************///termasuk perpustakaan:#sertakan "LedControl.h"#include // Font library#include // DS1307 clock#include "RTClib.h" // DS1307 clock#include // Pustaka tombol oleh Alexander Brevig// Setup LED Matrix// pin 12 terhubung ke DataIn di display// pin 11 terhubung ke CLK di display// pin 10 terhubung ke LOAD di displayLedControl lc =LedControl(12, 11, 10, 4); //set 3 pin sebagai 12, 11 &10 dan kemudian set 4 tampilan (maks adalah 8 tampilan)//variabel global intensitas byte =7; // Intensitas/kecerahan default (0-15)byte clock_mode =0; // Mode jam default. Default =0 (basic_mode)bool random_mode =0; // Tentukan mode acak - ubah jenis tampilan setiap beberapa jam. Default =0 (mati)byte old_mode =clock_mode; // Menyimpan mode jam sebelumnya, jadi jika kita pergi ke tanggal atau apa pun, kita tahu mode apa yang harus kembali ke after.bool ampm =0; // Tentukan waktu 12 atau 24 jam. 0 =24 jam. 1 =12 jam byte change_mode_time =0; // Menahan jam ketika mode jam selanjutnya akan berubah jika dalam mode acak.unsigned long delaytime =500; // Kami selalu menunggu sebentar di antara pembaruan displayint rtc[7]; // Memegang waktu nyata jam keluaranchar hari[7][4] ={ "Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"}; // array hari - digunakan dalam mode slide, basic_mode dan campur aduk (DS1307 menghasilkan nilai 1-7 untuk hari dalam seminggu)char daysfull[7][9] ={ "Sunday", "Monday", "Selasa", "Rabu ", "Kamis", "Jumat", "Sabtu"};akhiran char[4][3] ={ "st", "nd", "rd", "th"}; //array sufiks tanggal, digunakan dalam mode slide, basic_mode dan campur aduk. e,g, 1st 2nd ...//define constants#define NUM_DISPLAY_MODES 3 // Mode tampilan angka (melanjutkan nol sebagai mode pertama)#define NUM_SETTINGS_MODES 4 // Mode pengaturan angka =6 (melanjutkan nol sebagai mode pertama)# define SLIDE_DELAY 20 // Waktu dalam milidetik untuk efek slide per karakter dalam mode slide. Buat ini lebih tinggi untuk efek yang lebih lambat#define cls clear_display // Hapus tampilanRTC_DS1307 ds1307; // Buat objek RTCButton buttonA =Button(2, BUTTON_PULLUP); // Atur tombol A (menggunakan pustaka tombol)Tombol buttonB =Button(3, BUTTON_PULLUP); // Setup tombol B (menggunakan tombol library)void setup() { digitalWrite(2, HIGH); // nyalakan resistor pullup untuk tombol pada pin 2 digitalWrite(3, HIGH); // nyalakan resistor pullup untuk tombol pada pin 3 digitalWrite(4, HIGH); // nyalakan resistor pullup untuk tombol pada pin 4 Serial.begin(9600); //mulai serial //inisialisasi 4 panel matriks //kita telah menetapkan jumlah perangkat saat kita membuat LedControl int devices =lc.getDeviceCount(); //kita harus menginisialisasi semua perangkat dalam satu lingkaran for (int address =0; address =0 &&x <=7) { alamat =3; } if (x>=8 &&x <=15) { alamat =2; x =x - 8; } if (x>=16 &&x <=23) { alamat =1; x =x - 16; } if (x>=24 &&x <=31) { alamat =0; x =x - 24; } if (val ==1) { lc.setLed(alamat, y, x, benar); } else { lc.setLed(alamat, y, x, salah); }}//clear screenvoid clear_display() { for (alamat byte =0; alamat <4; alamat++) { lc.clearDisplay(alamat); }}//fade screen downvoid fade_down() { //memudar dari intensitas global ke 1 for (byte i =intensitas; i> 0; i--) { for (byte alamat =0; alamat <4; alamat++) { lc .setIntensity(alamat, i); } penundaan (30); //ubah ini untuk mengubah kecepatan fade down } clear_display(); //hapus tampilan sepenuhnya (mati) //reset intentsity ke global val for (byte address =0; address <4; address++) { lc.setIntensity(alamat, intensitas); }}//power up led test &display software version numbervoid printver() { byte i =0; char ver_a[9] ="Vers 1.0"; char ver_b[9] ="Halo!"; // uji semua led. for (byte x =0; x <=31; x++) { for (byte y =0; y <=7; y++) { plot(x, y, 1); } } penundaan(500); fade_down(); while (ver_a[i]) { puttinychar((i * 4), 1, ver_a[i]); penundaan (35); saya++; } penundaan (700); fade_down(); saya =0; while (ver_b[i]) { puttinychar((i * 4), 1, ver_b[i]); penundaan (35); saya++; } penundaan (700); fade_down();}// puttinychar// Salin glyph karakter 3x5 dari struktur data myfont untuk menampilkan memori, dengan kiri atas pada koordinat yang diberikan// Ini tidak dioptimalkan dan hanya menggunakan plot() untuk menggambar setiap dot.void puttinychar (byte x, byte y, char c){ byte titik; if (c>='A' &&c <='Z' || (c>='a' &&c <='z') ) { c &=0x1F; // A-Z memetakan ke 1-26 } else if (c>='0' &&c <='9') { c =(c - '0') + 32; } else if (c ==' ') { c =0; // spasi } else if (c =='.') { c =27; // titik penuh } else if (c ==':') { c =28; // titik dua } else if (c =='\'') { c =29; // tanda petik tunggal } else if (c =='!') { c =30; // tanda petik tunggal } else if (c =='?') { c =31; // tanda kutip tunggal } for (byte col =0; col <3; col++) { titik =pgm_read_byte_near(&mytinyfont[c][col]); for (char baris =0; baris <5; baris++) { if (titik &(16>> baris)) plot(x + col, y + baris, 1); else plot(x + col, y + baris, 0); } }}void putnormalchar(byte x, byte y, char c){ byte titik; // if (c>='A' &&c <='Z' || (c>='a' &&c <='z') ) { // c &=0x1F; // A-Z memetakan ke 1-26 // } if (c>='A' &&c <='Z' ) { c &=0x1F; // A-Z memetakan ke 1-26 } else if (c>='a' &&c <='z') { c =(c - 'a') + 41; // A-Z memetakan ke 41-67 } else if (c>='0' &&c <='9') { c =(c - '0') + 31; } else if (c ==' ') { c =0; // spasi } else if (c =='.') { c =27; // titik penuh } else if (c =='\'') { c =28; // tanda petik tunggal } else if (c ==':') { c =29; // panah pemilih clock_mode } else if (c =='>') { c =30; // panah pemilih clock_mode } else if (c>=-80 &&c <=-67) { c *=-1; } for (char col =0; col <5; col++) { titik =pgm_read_byte_near(&myfont[c][col]); for (char row =0; row <7; row++) { //memeriksa koordinat yang ada di layar sebelum mencoba memplot //if ((x>=0) &&(x <=31) &&(y>=0) &&(y <=7)){ if (titik &(64>> baris)) { // hanya 7 baris. plot(x + col, y + baris, 1); } else { plot(x + col, y + baris, 0); } //} } }}//small_mode//tampilkan waktu dalam karakter 3x5 kecil dengan detik displayvoid small_mode() { char textchar[8]; // 16 karakter pada tampilan byte mins =100; //menit byte detik =rtc[0]; //detik byte old_secs =detik; //menampung nilai detik lama - dari detik terakhir diperbarui o tampilan - digunakan untuk memeriksa apakah detik telah berubah cls(); //jalankan loop utama jam selama run_mode mengembalikan nilai true while (run_mode()) { get_time(); //periksa tombol tekan if (buttonA.uniquePress()) { switch_mode(); kembali; } if (buttonB.uniquePress()) { display_date(); kembali; } //jika detik berubah maka perbarui pada tampilan detik =rtc[0]; if (dtk !=old_secs) { //dtk char buffer[3]; itoa(dtk, buffer, 10); //fix - seperti sebaliknya jika num memiliki nol di depan, mis. "03" detik, itoa menutupi ini dengan karakter dengan spasi "3". if (dtk <10) { buffer[1] =buffer[0]; penyangga[0] ='0'; } puttinychar( 20, 1, ':'); //detik titik dua puttinychar( 24, 1, buffer[0]); //detik puttinychar(28, 1, buffer[1]); //detik old_secs =detik; } //jika menit berubah mengubah waktu if (mins !=rtc[1]) { //reset ini untuk perbandingan waktu berikutnya mins =rtc[1]; byte jam =rtc[2]; if (jam> 12) { jam =jam - ampm * 12; } if (jam <1) { jam =jam + ampm * 12; } //byte dow =rtc[3]; // DS1307 menghasilkan 0 - 6 di mana 0 =Minggu0 - 6 di mana 0 =Minggu. //byte tanggal =rtc[4]; //mengatur karakter buffer char[3]; itoa(jam, buffer, 10); //fix - seperti sebaliknya jika num memiliki nol di depan, mis. "03" jam, itoa menutupi ini dengan karakter dengan spasi "3". if (jam <10) { buffer[1] =buffer[0]; // jika kita dalam mode 12 jam kosongkan nol di depan. if (ampm) { buffer[0] =' '; } else { buffer[0] ='0'; } } //set jam karakter textchar[0] =buffer[0]; textchar[1] =penyangga[1]; textchar[2] =':'; itoa (menit, buffer, 10); if (menit <10) { buffer[1] =buffer[0]; penyangga[0] ='0'; } //set karakter menit textchar[3] =buffer[0]; textchar[4] =penyangga[1]; //lakukan detik textchar[5] =':'; penyangga[3]; detik =rtc[0]; itoa(dtk, buffer, 10); //fix - seperti sebaliknya jika num memiliki nol di depan, mis. "03" detik, itoa menutupi ini dengan karakter dengan spasi "3". if (dtk <10) { buffer[1] =buffer[0]; penyangga[0] ='0'; } //set detik textchar[6] =buffer[0]; textchar[7] =buffer[1]; byte x =0; byte y =0; //cetak setiap karakter untuk (byte x =0; x <6; x++) { puttinychar( x * 4, 1, textchar[x]); } } penundaan(50); } fade_down();}// basic_mode()// menunjukkan waktu dalam 5x7 karaktervoid basic_mode(){ cls(); penyangga karakter[3]; //untuk konversi int ke char untuk mengubah nilai rtc menjadi karakter, kita dapat mencetak di layar byte offset =0; //digunakan untuk mengimbangi posisi x digit dan memusatkan tampilan saat kita berada dalam mode 12 jam dan jam hanya menampilkan 3 digit. misalnya 3:21 byte x, y; //digunakan untuk menggambar kotak bening di sebelah kiri layar "1" saat kita memutar dari 12:59 -> 1:00 dalam mode 12 jam. //lakukan konversi 12/24 jam jika ampm disetel ke 1 byte hours =rtc[2]; if (jam> 12) { jam =jam - ampm * 12; } if (jam <1) { jam =jam + ampm * 12; } //lakukan konversi offset if (ampm &&jam <10) { offset =2; } //set menit berikutnya kita tampilkan tanggal di //set_next_date(); // awalnya atur menit ke nilai 100 - jadi tidak akan pernah sama dengan rtc[1] pada loop pertama jam, artinya kita menggambar tampilan jam saat kita memasukkan fungsi byte secs =100; byte menit =100; int jumlah =0; //jalankan loop utama jam selama run_mode mengembalikan nilai true while (run_mode()) { //dapatkan waktu dari chip jam get_time(); //periksa tombol tekan if (buttonA.uniquePress()) { switch_mode(); kembali; } if (buttonB.uniquePress()) { display_date(); kembali; } //periksa apakah sudah waktunya untuk menampilkan tanggal secara otomatis //check_show_date(); //menggambar flashing :seolah-olah detik telah berubah. if (dtk !=rtc[0]) { //perbarui dtk dengan nilai baru dtk =rtc[0]; //draw :plot (15 - offset, 2, 1); // plot titik teratas (15 - offset, 5, 1); //jumlah titik bawah =400; } //jika hitungan sudah habis, matikan :if (count ==0) { plot (15 - offset, 2, 0); // plot titik teratas (15 - offset, 5, 0); //titik bawah } else { hitung--; } //gambar ulang tampilan jika tombol ditekan atau jika menit !=rtc[1] yaitu jika waktu telah berubah dari apa yang telah kita simpan dalam menit, (juga dipicu pada fungsi masuk pertama saat menit adalah 100) if (menit !=rtc[1]) { //perbarui menit dan jam dengan nilai baru mins =rtc[1]; jam =rtc[2]; //menyesuaikan jam ampm disetel ke mode 12 jam if (jam> 12) { jam =jam - ampm * 12; } if (jam <1) { jam =jam + ampm * 12; } itoa(jam, buffer, 10); //jika jam <10 angka mis. "3" jam, itoa menutupi ini dengan karakter dengan spasi "3 " yang tidak kita inginkan if (jam <10) { buffer[1] =buffer[0]; penyangga[0] ='0'; } //cetak jam //jika kita dalam mode 12 jam dan jam <10, maka jangan mencetak angka nol di depan, dan atur offset sehingga kita memusatkan tampilan dengan 3 digit. if (ampm &&jam <10) { offset =2; //jika waktunya 1:00am, hapus seluruh tampilan karena offset berubah saat ini dan kita perlu mengosongkan 12:59 yang lama if ((hours ==1 &&mins ==0) ) { cls(); } } else { //else tidak ada offset dan jam cetak puluhan digit offset =0; //jika waktu menunjukkan pukul 10:00 pagi, hapus seluruh tampilan saat offset berubah saat ini dan kita perlu mengosongkan yang lama 9:59 if (jam ==10 &&menit ==0) { cls(); } putnormalchar(1, 0, buffer[0]); } //cetak jam satu digit putnormalchar(7 - offset, 0, buffer[1]); //print menit //tambahkan nol di depan jika menit <10 itoa (menit, buffer, 10); if (menit <10) { buffer[1] =buffer[0]; penyangga[0] ='0'; } //cetak menit puluhan dan satu digit putnormalchar(19 - offset, 0, buffer[0]); putnormalchar(25 - offset, 0, buffer[1]); } } fade_down();}//seperti basic_mode tetapi dengan efek slidevoid slide() { byte digits_old[4] ={99, 99, 99, 99}; //nilai lama tempat kita menyimpan waktu. Atur ke sesuatu yang tidak akan pernah cocok dengan waktu awalnya sehingga semua digit diambil saat mode dimulai byte digits_new[4]; //waktu digit baru akan meluncur untuk menampilkan byte digits_x_pos[4] ={25, 19, 7, 1}; //x pos untuk menggambar setiap digit di char old_char[2]; //digunakan saat kita menggunakan itoa untuk mentranspos digit saat ini (ketik byte) ke dalam char untuk diteruskan ke fungsi animasi char new_char[2]; //digunakan saat kita menggunakan itoa untuk mentranspos digit baru (ketik byte) ke dalam char untuk diteruskan ke fungsi animasi //old_chars - menyimpan karakter sufiks 5 hari dan tanggal di layar. misalnya "mon" dan "st". Kami memasukkan ini ke dalam animasi slide sebagai karakter saat ini saat karakter ini diperbarui. //Kami mengirimnya sebagai A pada awalnya, yang digunakan ketika clocl memasuki mode dan tidak ada karakter terakhir yang disimpan. //char old_chars[6] ="AAAAAA"; //plot titik dua jam pada tampilan cls(); putnormalchar( 13, 0, ':'); byte old_secs =rtc[0]; //menyimpan detik di old_secs. Kami membandingkan detik dan detik lama. Ketika mereka berbeda kita menggambar ulang tampilan //menjalankan jam utama loop selama run_mode mengembalikan true while (run_mode()) { get_time(); //periksa tombol tekan if (buttonA.uniquePress()) { switch_mode(); kembali; } if (buttonB.uniquePress()) { display_date(); kembali; } //jika detik telah berubah maka perbarui tampilan if (rtc[0] !=old_secs) { old_sec =rtc[0]; //lakukan konversi 12/24 jam jika ampm disetel ke 1 byte hours =rtc[2]; if (jam> 12) { jam =jam - ampm * 12; } if (jam <1) { jam =jam + ampm * 12; } //bagi semua tanggal dan waktu menjadi digit individual - masukkan digit_new array //rtc[0] =detik //array pos dan digit yang disimpan //digits_new[0] =(rtc[0]%10); //0 - detik satu //digits_new[1] =((rtc[0]/10)%10); // - detik puluhan //rtc[1] =menit digits_new[0] =(rtc[1] % 10); //2 - menit satuan digits_new[1] =((rtc[1] / 10) % 10); //3 - menit puluhan //rtc[2] =jam digits_new[2] =(jam % 10); //4 - jam satuan digits_new[3] =((jam / 10) % 10); //5 - jam puluhan //rtc[4] =tanggal //digits_new[6] =(rtc[4]%10); ///6 - tanggal //digits_new[7] =((rtc[4]/10)%10); ///7 - tanggal puluhan //gambar layar awal semua karakter. Setelah ini kita baru menggambar perubahannya. //bandingkan digit 0 sampai 3 (menit dan jam) for (byte i =0; i <=3; i++) { //lihat apakah digit telah berubah... if (digits_old[i] !=digits_new[i]) { //jalankan 9 langkah urutan animasi untuk masing-masing secara bergiliran for (byte seq =0; seq <=8; seq++) { //konversi digit ke string itoa(digits_old[i], old_char, 10); itoa(digit_baru[i], karakter_baru, 10); //jika diatur ke mode 12 jam dan kita berada di digit 2 (mode jam puluhan) maka periksa untuk melihat apakah ini nol. Jika ya, kosongkan saja sehingga kita mendapatkan 2.00pm bukan 02.00pm if (ampm &&i ==3) { if (digits_new[3] ==0) { new_char[0] =' '; } if (digit_old[3] ==0) { old_char[0] =' '; } } //gambar bingkai animasi untuk setiap digit slideanim(digits_x_pos[i], 0, seq, old_char[0], new_char[0]); penundaan(SLIDE_DELAY); } } } /* //bandingkan digit tanggal 6 (satuan) dan (7) puluhan - jika salah satu dari perubahan ini kita perlu memperbarui baris tanggal. Kami membandingkan puluhan tanggal seperti misalnya dari 31 Jan -> 01 Februari lalu digit satuan tidak berubah jika ((digits_old[6] !=digits_new[6]) || (digits_old[7] !=digits_new[7])) { //mengubah hari yang ditampilkan. Loop di bawah melewati masing-masing dari 3 karakter secara bergantian mis. "MON" for (byte day_char =0; day_char <=2; day_char++){ //jalankan urutan anim untuk setiap karakter for (byte seq =0; seq <=8; seq++){ //hari (0 - 6 ) Baca nomor ini ke dalam array karakter hari. angka detik dalam array 0-2 mendapatkan 3 karakter dari nama hari, mis. m o n slideanim(6*day_char,8,seq,old_chars[day_char],days[rtc[3]][day_char]); //6 x day_char memberi kita x pos untuk penundaan char(SLIDE_DELAY); } //menyimpan karakter lama ke dalam array old_chars pada array pos 0-2. Kami menggunakan ini saat berikutnya kami mengubah hari dan memasukkannya ke animasi sebagai karakter saat ini. Char yang diperbarui dimasukkan sebagai char baru. old_chars[char_hari] =hari[rtc[3]][char_hari]; } //mengubah tanggal puluhan digit (jika diperlukan) dan satu digit. (angka tanggal akan selalu berubah, tetapi menempatkan ini di loop 'if' membuatnya sedikit lebih rapi dari segi kode.) for (byte i =7; i>=6; i--){ if (digits_old[i] !=digits_new[i]) { for (byte seq =0; seq <=8; seq++){ itoa(digits_old[i],old_char,10); itoa(digits_new[i],new_char,10); slideanim(digits_x_pos[i],8,seq,old_char[0],new_char[0]); penundaan(SLIDE_DELAY); } } } //mencetak akhiran hari "nd" "rd" "th" dll. Pertama kerjakan tanggal 2 akhiran huruf - misalnya st, nd, rd, th byte s =3; //pos untuk membaca larik sufiks kita. byte tanggal =rtc[4]; if(tanggal ==1 || tanggal ==21 || tanggal ==31) { s =0; } else if (tanggal ==2 || tanggal ==22) { s =1; } else if (tanggal ==3 || tanggal ==23) { s =2; } for (byte suffix_char =0; suffix_char <=1; suffix_char++){ for (byte seq =0; seq <=8; seq++){ slideanim((suffix_char*6)+36,8,seq,old_chars[suffix_char+3 ],suffix[s][suffix_char]); // kita melewatkan char array old_char sebagai char saat ini dan array suffix sebagai delay char baru(SLIDE_DELAY); } //menyimpan suffic char di array chars lama di array pos 3 dan 5. Kami menggunakan karakter ini saat berikutnya kami mengubah suffix dan memasukkannya ke animasi sebagai char saat ini. Char yang diperbarui dimasukkan sebagai char baru. old_chars[suffix_char+3] =suffix[s][suffix_char]; } }//end do date line */ //save digita array tol old untuk perbandingan loop berikutnya untuk (byte i =0; i <=3; i++) { digits_old[i] =digits_new[i]; } }//secs/oldsecs }// while loop fade_down();}//dipanggil oleh slide//ini menggambar animasi dari satu karakter yang meluncur dan yang lainnya meluncur keluar. Ada 8 langkah dalam animasi, kita memanggil fungsi untuk menggambar salah satu langkah dari 0-7//input adalah char x dan y, urutan frame animasi (0-7) dan karakter saat ini dan baru sedang digambar.void slideanim(byte x, byte y, urutan byte, char current_c, char new_c) { // Untuk menggeser satu char off dan yang lain di kita perlu 9 langkah atau frame secara berurutan... // seq# 0123456 <-baris tampilan // | ||||||| // seq0 0123456 MULAI - semua baris tampilan 0-6 menunjukkan karakter saat ini baris 0-6 // seq1 012345 karakter saat ini bergerak ke bawah satu baris pada tampilan. Kami hanya melihat itu baris 0-5. Ada pada tampilan posisi 1-6 Ada baris kosong disisipkan di atas // seq2 6 01234 char saat ini bergerak ke bawah 2 baris. kita sekarang hanya melihat baris 0-4 pada tampilan baris 2-6 pada tampilan. Baris 1 tampilan kosong. Baris 0 menunjukkan baris 6 dari char baru // seq3 56 0123 // seq4 456 012 setengah lama / setengah baru char // seq5 3456 01 // seq6 23456 0 // seq7 123456 // seq8 0123456 END - semua baris menunjukkan yang baru char //dari atas kita bisa melihat... //currentchar berjalan 0-6 lalu 0-5 lalu 0-4 sampai 0. posisi awal Y meningkat 1 baris setiap kali. // karakter baru berjalan 6 lalu 5-6 lalu 4-6 lalu 3-6. posisi awal Y meningkat 1 baris setiap kali. //jika nomor urut di bawah 7, kita perlu menggambar karakter saat ini if ​​(urutan <7) { titik byte; // if (current_c>='A' &&|| (current_c>='a' &¤t_c <='z') ) { // current_c &=0x1F; // A-Z memetakan ke 1-26 // } if (current_c>='A' &¤t_c <='Z' ) { current_c &=0x1F; // A-Z memetakan ke 1-26 } else if (current_c>='a' &¤t_c <='z') { current_c =(current_c - 'a') + 41; // A-Z memetakan ke 41-67 } else if (current_c>='0' &¤t_c <='9') { current_c =(current_c - '0') + 31; } else if (current_c ==' ') { current_c =0; // spasi } else if (current_c =='.') { current_c =27; // titik penuh } else if (current_c =='\'') { current_c =28; // tanda kutip tunggal } else if (current_c ==':') { current_c =29; //titik dua } else if (current_c =='>') { current_c =30; // panah pemilih clock_mode } byte curr_char_row_max =7 - urutan; //jumlah maksimum baris yang akan digambar adalah 6 - nomor urut byte start_y =urutan; //y posisi untuk memulai - sama dengan nomor urut. Kami memasukkan ini setiap loop //plot setiap baris hingga maksimum baris (dihitung dari nomor urut) for (byte curr_char_row =0; curr_char_row <=curr_char_row_max; curr_char_row++) { for (byte col =0; col <5; col++) { titik =pgm_read_byte_near(&myfont[current_c][col]); if (titik &(64>> curr_char_row)) plot(x + col, y + start_y, 1); //plot led di else plot(x + col, y + start_y, 0); //else plot led off } start_y++;//tambahkan satu ke y jadi kita menggambar baris berikutnya satu ke bawah } } //menarik garis kosong di antara karakter jika urutannya antara 1 dan 7. Jika kita tidak melakukan ini, kita dapatkan sisa-sisa karakter saat ini posisi terakhir yang tersisa pada tampilan if (urutan>=1 &&urutan <=8) { for (byte col =0; col <5; col++) { plot(x + col, y + (urutan - 1), 0); //posisi y untuk menggambar garis sama dengan nomor urut - 1 } } //jika urutan di atas 2, kita juga harus mulai menggambar karakter baru if (urutan>=2) { //mengerjakan char byte titik-titik; //if (new_c>='A' &&new_c <='Z' || (new_c>='a' &&new_c <='z') ) { // new_c &=0x1F; // A-Z memetakan ke 1-26 //} if (new_c>='A' &&new_c <='Z' ) { new_c &=0x1F; // A-Z memetakan ke 1-26 } else if (new_c>='a' &&new_c <='z') { new_c =(new_c - 'a') + 41; // A-Z memetakan ke 41-67 } else if (new_c>='0' &&new_c <='9') { new_c =(new_c - '0') + 31; } else if (new_c ==' ') { new_c =0; // spasi } else if (new_c =='.') { new_c =27; // titik penuh } else if (new_c =='\'') { new_c =28; // tanda kutip tunggal } else if (new_c ==':') { new_c =29; // panah pemilih clock_mode } else if (new_c =='>') { new_c =30; // panah pemilih clock_mode } byte newcharrowmin =6 - (urutan - 2); //jumlah baris minimum untuk menggambar karakter baru - ini menghasilkan output 6 hingga 0 saat memasukkan nomor urut 2-8. Ini adalah baris minimum untuk menggambar byte char baru start_y =0; //y posisi untuk memulai - sama dengan nomor urut. kita masukkan setiap baris //plot setiap baris dari minimum baris (dihitung dengan nomor urut) hingga 6 for (byte newcharrow =newcharrowmin; newcharrow <=6; newcharrow++) { for (byte col =0; col <5; col++ ) { titik =pgm_read_byte_near(&myfont[new_c][col]); if (titik &(64>> newcharrow)) plot(x + col, y + start_y, 1); //plot led di else plot(x + col, y + start_y, 0); //else plot led off } start_y++;//tambahkan satu ke y jadi kita menggambar baris berikutnya satu ke bawah } }}//mencetak jam menggunakan kata-kata daripada angkavoid word_clock() { cls(); char number[19][10] ={ "satu", "dua", "tiga", "empat", "lima", "enam", "tujuh", "delapan", "sembilan", "sepuluh", "sebelas", "dua belas", "tiga belas", "empat belas", "lima belas", "enam belas", "tujuh belas", "delapan belas", "sembilan belas" }; char numberstens[5][7] ={ "sepuluh", "dua puluh", "tiga puluh", "empat puluh", "lima puluh" }; //berpotensi 3 baris untuk menampilkan char str_a[8]; karakter str_b[8]; char str_c[8]; //byte jam_y, menit_y; //jam dan menit dan posisi untuk jam dan menit baris byte hours =rtc[2]; if (jam> 12) { jam =jam - ampm * 12; } if (jam <1) { jam =jam + ampm * 12; } get_time(); //mendapatkan waktu dari byte chip jam old_mins =100; //menyimpan menit di old_mins. Kami membandingkan menit dan menit lama &ketika berbeda kami menggambar ulang tampilan. Atur ini ke 100 pada awalnya sehingga tampilan digambar saat mode dimulai. byte menit; //jalankan loop utama jam selama run_mode mengembalikan true while (run_mode()) { //periksa tombol tekan if (buttonA.uniquePress()) { switch_mode(); kembali; } if (buttonB.uniquePress()) { display_date(); } get_time(); //mendapatkan waktu dari chip jam mins =rtc[1]; //get mins //jika mins berbeda dari old_mins - gambar ulang tampilan if (mins !=old_mins) { //update old_mins dengan nilai mins saat ini old_mins =mins; //reset ini untuk perbandingan waktu berikutnya mins =rtc[1]; jam =rtc[2]; //jadikan jam menjadi format 12 jam if (jam> 12) { jam =jam - 12; } if (jam ==0) { jam =12; } //membagi nilai menit menjadi dua digit terpisah int minsdigit =rtc[1] % 10; byte minsdigitten =(rtc[1] / 10) % 10; //jika mnt <=10 , maka baris atas harus terbaca "minsdigti lampau" dan baris bawah terbaca jam if (menit <10) { strcpy (str_a, angka[minsdigit - 1]); strcpy(str_b, "LULU"); strcpy (str_c, angka[jam - 1]); } //jika mins =10, tidak bisa menggunakan minsdigit seperti di atas, jadi kasus sosial untuk mencetak 10 melewati /n jam. if (menit ==10) { strcpy (str_a, angka[9]); strcpy(str_b, " MASA LALU"); strcpy (str_c, angka[jam - 1]); } //jika waktu tidak pada jam - yaitu kedua digit menit bukan nol, //lalu buat baris pertama dibaca "jam" dan baris 2 &3 dibaca "menit" "menit" mis. "tiga /n dua puluh /n satu" else if (minsdigitten !=0 &&minsdigit !=0 ) { strcpy (str_a, numbers[jam - 1]); // jika menit dalam usia remaja, gunakan remaja dari larik angka untuk baris ke-2, mis. "lima belas" //if (menit>=11 &&menit <=19) { if (menit <=19) { strcpy (str_b, angka[menit - 1]); } else { strcpy (str_b, angka [minsdigitten - 1]); strcpy (str_c, angka[minsdigit - 1]); } } // jika angka menit adalah nol, jangan dicetak. baca baca "jam" "minstens" mis. "tiga /n dua puluh" else if (minsdigitten !=0 &&minsdigit ==0 ) { strcpy (str_a, angka[jam - 1]); strcpy (str_b, angka-angka[minsdigitten - 1]); strcpy(str_c, ""); } //jika kedua menit sama dengan nol, yaitu pada jam, baris atas bertuliskan "jam" dan baris bawah berbunyi "jam" else if (minsdigitten ==0 &&minsdigit ==0 ) { strcpy (str_a, angka[jam - 1]); strcpy(str_b, "JAM"); strcpy(str_c, ""); } }//akhiri waktu latihan //jalankan dalam satu lingkaran //cetak baris a "dua belas" byte len =0; while (str_a[len]) { len++; }; //mendapatkan panjang byte pesan offset_top =(31 - ((len - 1) * 4)) / 2; // //plot jam baris byte i =0; while (str_a[i]) { puttinychar((i * 4) + offset_top, 1, str_a[i]); saya++; } //tahan tampilan tetapi periksa penekanan tombol int counter =1000; while (penghitung> 0){ //periksa tombol tekan if (buttonA.uniquePress()) { switch_mode(); kembali; } if (buttonB.uniquePress()) { display_date(); } penundaan(1); menangkal--; } fade_down(); //cetak baris b len =0; while (str_b[len]) { len++; }; //mendapatkan panjang pesan offset_top =(31 - ((len - 1) * 4)) / 2; saya =0; while (str_b[i]) { puttinychar((i * 4) + offset_top, 1, str_b[i]); saya++; } //tahan tampilan tetapi periksa tombol yang ditekan counter =1000; while (penghitung> 0){ if (buttonA.uniquePress()) { switch_mode(); kembali; } if (buttonB.uniquePress()) { display_date(); } penundaan(1); menangkal--; } fade_down(); //cetak baris c jika ada. len =0; while (str_c[len]) { len++; }; //mendapatkan panjang pesan offset_top =(31 - ((len - 1) * 4)) / 2; saya =0; while (str_c[i]) { puttinychar((i * 4) + offset_top, 1, str_c[i]); saya++; } penghitung =1000; while (penghitung> 0){ //periksa tombol tekan if (buttonA.uniquePress()) { switch_mode(); kembali; } if (buttonB.uniquePress()) { display_date(); } penundaan(1); menangkal--; } fade_down(); // tahan tampilan kosong tetapi periksa penekanan tombol sebelum memulai lagi. penghitung =1000; while (penghitung> 0){ //periksa tombol tekan if (buttonA.uniquePress()) { switch_mode(); kembali; } if (buttonB.uniquePress()) { display_date(); } penundaan(1); menangkal--; } } fade_down();}/// scroll message - tidak digunakan saat ini - terlalu lambat.void scroll() { char message[] ={"Hello There "}; cls(); byte p =6; //posisi saat ini dalam string byte chara[] ={0, 1, 2, 3, 4, 5}; //karakter dari string int x[] ={0, 6, 12, 18, 24, 30}; //xpos untuk setiap byte karakter y =0; //y pos // clear_buffer(); while (message[p] !='\0') { //gambar semua 6 karakter untuk (byte c =0; c <6; c++) { putnormalchar(x[c],y,message[ chara[c] ] ); //gambar garis piksel yang dimatikan setelah setiap karakter, jika tidak, celah antara karakter memiliki piksel yang tersisa di dalamnya dari karakter sebelumnya untuk (byte yy =0; yy <8; yy ++) { plot(x[c] + 5, yy, 0); } //ambil satu dari setiap posisi karakter x[c] =x[c] - 1; } //reset char jika keluar dari layar untuk (byte i =0; i <=5; i++) { if (x[i] <-5 ) { x[i] =31; chara[i] =p; p++; } } }}//display_date - mencetak hari dalam seminggu, tanggal dan bulan dengan efek kursor yang berkedipvoid display_date(){ cls(); //membaca tanggal dari DS1307 byte dow =rtc[3]; // hari dalam seminggu 0 =Minggu byte tanggal =rtc[4]; byte bulan =rtc[5] - 1; //array nama bulan untuk dicetak di layar. Beberapa dipendekkan karena kami hanya memiliki 8 karakter untuk dimainkan dengan nama bulan char[12][9] ={ "Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli" , "Agustus", "September", "Oktober", "November", "Desember" }; //mencetak nama hari //mendapatkan panjang teks dalam piksel, dengan cara itu kita dapat memusatkannya pada tampilan dengan membagi piksel yang tersisa b2 dan menggunakannya sebagai offset byte len =0; while(hari penuh[dow][len]) { len++; }; byte offset =(31 - ((len-1)*4)) / 2; //offset kita untuk memusatkan teks //cetak nama int i =0; while(hari penuh[bawah][i]) { puttinychar((i*4) + offset , 1, haripenuh[bawah][i]); saya++; } penundaan(1000); fade_down(); cls(); // cetak angka tanggal char buffer[3]; itoa(date,buffer,10); offset =10; //offset to centre text if 3 chars - e.g. 3rd // first work out date 2 letter suffix - eg st, nd, rd, th etc // char suffix[4][3]={"st", "nd", "rd", "th" }; is defined at top of code byte s =3; if(date ==1 || date ==21 || date ==31) { s =0; } else if (date ==2 || date ==22) { s =1; } else if (date ==3 || date ==23) { s =2; } //print the 1st date number puttinychar(0+offset, 1, buffer[0]); //if date is under 10 - then we only have 1 digit so set positions of sufix etc one character nearer byte suffixposx =4; //if date over 9 then print second number and set xpos of suffix to be 1 char further away if (date> 9){ suffixposx =8; puttinychar(4+offset, 1, buffer[1]); offset =8; //offset to centre text if 4 chars } //print the 2 suffix characters puttinychar(suffixposx+offset, 1, suffix[s][0]); puttinychar(suffixposx+4+offset, 1, suffix[s][1]); penundaan (1000); fade_down(); //print the month name //get length of text in pixels, that way we can centre it on the display by divindin the remaining pixels b2 and using that as an offset len =0; while(monthnames[month][len]) { len++; }; offset =(31 - ((len-1)*4)) / 2; //our offset to centre up the text i =0; while(monthnames[month][i]) { puttinychar((i*4) +offset, 1, monthnames[month][i]); i++; } penundaan(1000); fade_down();}//dislpay menu to change the clock modevoid switch_mode() { //remember mode we are in. We use this value if we go into settings mode, so we can change back from settings mode (6) to whatever mode we were in. old_mode =clock_mode; char* modes[] ={ "Basic", "Small", "Slide", "Words", "Setup" }; byte next_clock_mode; byte firstrun =1; //loop waiting for button (timeout after 35 loops to return to mode X) for (int count =0; count <35; count++) { //if user hits button, change the clock_mode if (buttonA.uniquePress() || firstrun ==1) { count =0; cls(); if (firstrun ==0) { clock_mode++; } if (clock_mode> NUM_DISPLAY_MODES + 1 ) { clock_mode =0; } //print arrown and current clock_mode name on line one and print next clock_mode name on line two char str_top[9]; //strcpy (str_top, "-"); strcpy (str_top, modes[clock_mode]); next_clock_mode =clock_mode + 1; if (next_clock_mode> NUM_DISPLAY_MODES + 1 ) { next_clock_mode =0; } byte i =0; while (str_top[i]) { putnormalchar(i * 6, 0, str_top[i]); i++; } firstrun =0; } delay(50); }}//run clock main loop as long as run_mode returns truebyte run_mode() { //if random mode is on... check the hour when we change mode. if (random_mode) { //if hour value in change mode time =hours. then reurn false =i.e. exit mode. if (change_mode_time ==rtc[2]) { //set the next random clock mode and time to change it set_next_random(); //exit the current mode. kembali 0; } } //else return 1 - keep running in this mode return 1;}//set the next hour the clock will change mode when random mode is onvoid set_next_random() { //set the next hour the clock mode will change - current time plus 1 - 4 hours get_time(); change_mode_time =rtc[2] + random (1, 5); //if change_mode_time now happens to be over 23, then set it to between 1 and 3am if (change_mode_time> 23) { change_mode_time =random (1, 4); } //set the new clock mode clock_mode =random(0, NUM_DISPLAY_MODES + 1); //pick new random clock mode}//dislpay menu to change the clock settingsvoid setup_menu() { char* set_modes[] ={ "Rndom", "24 Hr","Set", "Brght", "Exit"}; if (ampm ==0) { set_modes[1] =("12 Hr"); } byte setting_mode =0; byte next_setting_mode; byte firstrun =1; //loop waiting for button (timeout after 35 loops to return to mode X) for(int count=0; count <35; count++) { //if user hits button, change the clock_mode if(buttonA.uniquePress() || firstrun ==1){ count =0; cls(); if (firstrun ==0) { setting_mode++; } if (setting_mode> NUM_SETTINGS_MODES) { setting_mode =0; } //print arrown and current clock_mode name on line one and print next clock_mode name on line two char str_top[9]; strcpy (str_top, set_modes[setting_mode]); next_setting_mode =setting_mode + 1; if (next_setting_mode> NUM_SETTINGS_MODES) { next_setting_mode =0; } byte i =0; while(str_top[i]) { putnormalchar(i*6, 0, str_top[i]); i++; } firstrun =0; } delay(50); } //pick the mode switch(setting_mode){ case 0:set_random(); merusak; case 1:set_ampm(); merusak; case 2:set_time(); merusak; case 3:set_intensity(); merusak; case 4://exit menu break; } //change the clock from mode 6 (settings) back to the one it was in before clock_mode=old_mode;}//toggle random mode - pick a different clock mode every few hoursvoid set_random(){ cls(); char text_a[9] ="Off"; char text_b[9] ="On"; byte i =0; //if random mode is on, turn it off if (random_mode){ //turn random mode off random_mode =0; //print a message on the display while(text_a[i]) { putnormalchar((i*6), 0, text_a[i]); i++; } } else { //turn randome mode on. random_mode =1; //set hour mode will change set_next_random(); //print a message on the display while(text_b[i]) { putnormalchar((i*6), 0, text_b[i]); i++; } } delay(1500); //leave the message up for a second or so}//set 12 or 24 hour clockvoid set_ampm() { // AM/PM or 24 hour clock mode - flip the bit (makes 0 into 1, or 1 into 0 for ampm mode) ampm =(ampm ^ 1); cls();}//change screen intensityintensityvoid set_intensity() { cls(); byte i =0; char text[7] ="Bright"; while(text[i]) { puttinychar((i*4)+4, 0, text[i]); i++; } //wait for button input while (!buttonA.uniquePress()) { levelbar (0,6,(intensity*2)+2,2); //display the intensity level as a bar while (buttonB.isPressed()) { if(intensity ==15) { intensity =0; cls (); } else { intensity++; } //print the new value i =0; while(text[i]) { puttinychar((i*4)+4, 0, text[i]); i++; } //display the intensity level as a bar levelbar (0,6,(intensity*2)+2,2); //change the brightness setting on the displays for (byte address =0; address <4; address++) { lc.setIntensity(address, intensity); } delay(150); } }}// display a horizontal bar on the screen at offset xposr by ypos with height and width of xbar, ybarvoid levelbar (byte xpos, byte ypos, byte xbar, byte ybar) { for (byte x =0; x
PerpustakaanArduino
Tidak ada pratinjau (hanya unduhan).

Skema


Proses manufaktur

  1. Pengurutan LED
  2. Jam Kuku
  3. MATLAB - Matriks
  4. Pertempuran Bos Mini
  5. Jam Master
  6. Jam Berlin
  7. Jam POV LED Gaya Analog
  8. Matriks LED + Tampilan Pintu Sensor Gerak [Arduino Holiday]
  9. 8x Pencahayaan LED dengan Suara
  10. Arduino Quadruped