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

Matriks LED Tunggal Arduino Flip Clock

Komponen dan persediaan

Arduino Nano R3
× 1
Maxim Integrated DS3231M - ±5ppm, I2C Real-Time Clock
× 1
Matriks LED 8x8 dengan driver MAX7219
× 1
Katoda Umum Difusi RGB
× 1
Resistor 220 ohm
× 2
Rotary Encoder dengan Tombol Tekan
× 1

Alat dan mesin yang diperlukan

Besi solder (generik)

Aplikasi dan layanan online

Arduino IDE

Tentang proyek ini

Saya membuat JAM Modul Matriks LED 8x8 yang dikembangkan oleh Adrian Jones. Waktu ditampilkan dengan menggulir dari kiri ke kanan, atau, di bawah kendali perangkat lunak, dari atas ke bawah. Setiap digit waktu berturut-turut meluncur dari sisi kanan dan ketika di tengah, berhenti sejenak dan sedikit cerah. Ini kemudian menggulir ke kiri sementara digit berikutnya di layar bergulir ke tampilan. Siklus berulang dengan jeda singkat antara tampilan yang berurutan.Untuk membalik vertikal "dari atas ke bawah" Anda harus mengubah :

static boolean top2bottom =false;

ke:

static boolean top2bottom =benar;

Seperti yang Anda lihat di komentar kode, banyak parameter dapat diubah, misalnya kecepatan gulir, jumlah baris kosong antar karakter, tampilan 12/24 jam, ms antar karakter, kecerahan dll.

Waktu dapat diatur dengan mudah menggunakan rotary encoder. Dioda dua warna menampilkan mode pengaturan (menit, jam, atau normal). Saya memasukkan jam ke dalam kotak yang terdiri dari dua bagian dasar sehingga akses ke bagian dalam kotak adalah sangat nyaman dan praktis.

Kode

  • kode
kodeArduino
//********************************************* ********************************************//// JAM MATRIKS // Adrian Jones, Maret 2014//// - memungkinkan pengguliran kiri-ke-kanan dan atas-ke-bawah////********************* ************************************************** ******************//#include // I2C-WIRE library#include // RTC-Library// tentukan max7219 register dan kontrol pin # mendefinisikan max7219_reg_noop 0x00 # define max7219_reg_digit0 0x01 # define max7219_reg_digit1 0x02 # define max7219_reg_digit2 0x03 # define max7219_reg_digit3 0x04 # define max7219_reg_digit4 0x05 # define max7219_reg_digit5 0x06 # define max7219_reg_digit6 0x07 # define max7219_reg_digit7 0x08 # define max7219_reg_decodeMode 0x09 # define max7219_reg_intensity 0x0a # mendefinisikan max7219_reg_scanLimit 0x0b#define max7219_reg_shutdown 0x0c#define max7219_reg_displayTest 0x0f#define dataIn 12 // DIN#define load 10 // CS #define clock 11 // CLKchar alfanum[][8] ={{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 ,0x00,0x00}, // Hex kosong 20 Des 32 {0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x10}, // ! 33 {0x00,0x28,0x28,0x28,0x00,0x00,0x00,0x00}, // " 34 {0x00,0x28,0x7C,0x28,0x7C,0x28,0x00,0x00}, // # 35 {0x10,0x38, 0x50,0x38,0x14,0x54,0x38,0x10}, // $ {0x41,0xA2,0x44,0x08,0x10,0x22,0x45,0x82}, // % {0x38,0x44,0x44,0x38,0x50,0x4A, 0x44,0x3A}, // &{0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00}, // ' {0x30,0x40,0x80,0x80,0x80,0x80,0x40,0x30}, // ( 40 {0xC0,0x20,0x10,0x10,0x10,0x10,0x20,0xC0}, // ) {0x28,0x10,0xAA,0x54,0xAA,0x10,0x28,0x00}, // * {0x00,0x10,0x10, 0x10,0xFE,0x10,0x10,0x10}, // + {0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x10}, // , {0x00,0x00,0x00,0x00,0x7E,0x00,0x00, 0x00}, // - {0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18}, // .{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}, // / {0x7E ,0xC1,0xA1,0x91,0x89,0x85,0x83,0x7E}, // 0 {0x10,0x30,0x10,0x10,0x10,0x10,0x10,0x7C}, // 1 {0x38,0x44,0x82,0x04,0x18 ,0x20,0x40,0xFE}, // 2 50 {0x7C,0x82,0x02,0x3C,0x02,0x02,0x82,0x7C}, // 3 {0x08,0x18,0x28,0x48,0xFE,0x08,0x08,0x08} , // 4 {0xFE,0x80,0xF8,0x04,0x02,0x82,0x44,0x38}, // 5 {0x38,0x44,0x80,0xB8,0xC4 ,0x82,0x44,0x38}, // 6 {0xFE,0x02,0x04,0x08,0x10,0x20,0x20,0x20}, // 7 {0x7C,0x82,0x82,0x7C,0x82,0x82,0x82,0x7C}, // 8 {0x7C,0x82,0x82,0x7E,0x02,0x82,0x44,0x38}, // 9 {0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x00}, // :{0x00,0x00, 0x18,0x18,0x00,0x18,0x18,0x30}, //; {0x00,0x10,0x20,0x40,0x80,0x40,0x20,0x10}, // <60 {0x00,0x00,0x00,0x7E,0x00,0x7E,0x00,0x00}, // ={0x00,0x80,0x40, 0x20,0x10,0x20,0x40,0x80}, //> {0x70,0x88,0x88,0x10,0x20,0x20,0x00,0x20}, // ? {0x7E,0x81,0x99,0xA1,0xA1,0x9E,0x80,0x7E}, // @ {0x3C,0x42,0x81,0x81,0xFF,0x81,0x81,0x81}, // A {0xFC,0x82,0x81,0xFE ,0x81,0x81,0x82,0xFC}, // B {0x3C,0x42,0x81,0x80,0x80,0x81,0x42,0x3C}, // C {0xFC,0x82,0x81,0x81,0x81,0x81,0x82,0xFC }, // D {0xFE,0x80,0x80,0xFC,0x80,0x80,0x80,0xFE}, // E {0xFE,0x80,0x80,0xFC,0x80,0x80,0x80,0x80}, // F 70 {0x3C ,0x42,0x81,0x80,0x87,0x81,0x42,0x3C}, // G {0x81,0x81,0x81,0xFF,0x81,0x81,0x81,0x81}, // H {0xFE,0x10,0x10,0x10,0x10 ,0x10,0x10,0xFE}, // I {0xFF,0x08,0x08,0x08,0x08,0x88,0x88,0x70}, // J {0x88,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x84}, // K {0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xFE}, // L {0x81,0xC3,0xA5,0x99,0x81,0x81,0x81,0x81}, // M {0x81,0xC1, 0xA1,0x91,0x89,0x85,0x83,0x81}, // N {0x3C,0x42,0x81,0x81,0x81,0x81,0x42,0x3C}, // O {0xFC,0x82,0x81,0x82,0xFC,0x80, 0x80,0x80}, // P 80 {0x3C,0x42,0x81,0x81,0x81,0x85,0x42,0x3D}, // Q {0xFC,0x82,0x81,0x82,0xFC,0x84,0x82,0x81}, // R {0x3C,0x42,0x81,0x40,0x3E,0x81,0x42,0x3C}, // S {0xFE,0x10,0x10,0x10,0x10,0x10,0x1 0,0x10}, // T {0x82,0x82,0x82,0x82,0x82,0x82,0x44,0x38}, // U {0x82,0x82,0x82,0x82,0x82,0x44,0x28,0x10}, // V {0x81,0x81,0x81,0x81,0x99,0xA5,0xC3,0x81}, // L {0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81}, // X {0x82,0x44,0x28,0x10 ,0x10,0x10,0x10,0x10}, // Y {0xFF,0x02,0x04,0x08,0x10,0x20,0x40,0xFF}, // Z 90 {0xE0,0x80,0x80,0x80,0x80,0x80,0x80, 0xE0}, // [ {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}, // {0x07,0x01,0x01,0x01,0x01,0x01,0x01,0x07}, // ] {0xE0, 0xA0,0xE0,0xA0,0xAA,0x15,0x15,0x11}, // am (dikodekan sebagai '^' {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E}, // _ {0x10,0x08, 0x00,0x00,0x00,0x00,0x00,0x00}, // ' {0x00,0x00,0x38,0x04,0x3C,0x44,0x48,0x34}, // a {0x00,0x40,0x40,0x40,0x78,0x44, 0x44,0x38}, // b {0x00,0x00,0x18,0x24,0x40,0x40,0x24,0x18}, // c {0x00,0x04,0x04,0x04,0x3C,0x44,0x44,0x38}, // d 100 {0x00,0x00,0x38,0x44,0x7C,0x40,0x44,0x38}, // e {0x00,0x18,0x20,0x20,0x78,0x20,0x20,0x20}, // f {0x00,0x38,0x44, 0x44,0x38,0x04,0x44,0x38}, // g {0x00,0x40,0x40,0x40,0x78,0x44,0x44,0x44}, // j {0x0 0,0x00,0x40,0x00,0x40,0x40,0x40,0x40}, // i {0x00,0x08,0x00,0x08,0x08,0x08,0x48,0x30}, // j {0x00,0x40,0x40,0x48, 0x50,0x60,0x50,0x48}, // k {0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x20}, // l {0x00,0x00,0x00,0x28,0x54,0x44,0x44,0x44} , // m {0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44}, // n 110 {0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x38}, // o {0x00, 0x00,0x70,0x48,0x48,0x70,0x40,0x40}, // p {0x00,0x00,0x30,0x48,0x48,0x38,0x08,0x08}, // q {0x00,0x00,0x00,0x30,0x48, 0x40,0x40,0x40}, // r {0x00,0x30,0x48,0x40,0x30,0x08,0x48,0x30}, // s {0x00,0x20,0x70,0x20,0x20,0x20,0x28,0x10}, / / t {0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x38}, // u {0x00,0x00,0x44,0x44,0x44,0x44,0x28,0x10}, // v {0x00,0x00,0x82 ,0x82,0x82,0x92,0x54,0x28}, // w {0x00,0x00,0x84,0x48,0x30,0x30,0x48,0x84}, // x 120 {0x00,0x48,0x48,0x48,0x38,0x08, 0x48,0x30}, // y {0x00,0x00,0x00,0x7C,0x08,0x10,0x20,0x7C}, // z {0x00,0x30,0x40,0x40,0x80,0x40,0x40,0x30}, // { {0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20}, // | {0x00,0x60,0x10,0x10,0x08,0x10,0x10,0x60}, // } {0xE0,0xA0,0xE0,0x80,0x8A,0x15,0x15,0x11} // kode pm sebagai '~' Hex 7E, Des 126 };// tentukan operasi RTCRTC_DS1307 RTC; // Modul RTC (DS1307) kecil (SDA - A4, SCL - A5)// rotary encoder, sakelar, dan kontrol LED#tentukan enc_PinA 2 // encoder A ke pin 2 (interrupt 0)#define enc_PinB 4 // encoder B ke pin 4#define enc_Switch 3 // encoder beralih ke pin 3 (interrupt 1)#define mode_Pin 8 // mode LED pin#define min_Pin 9 // menit LED pinunsigned char enc_A, enc_B, enc_A_prev=0;static boolean rotating =false; static boolean searah jarum jam =false;static boolean updateFlag=false;mode int statis =0; // 0 - tidak ada apa-apa, 1 - set jam, set 2 - menit// tentukan string tampilan#define max_array_size 100char ac[max_array_size] ={};byte rc[8] ={};String display_message ="";int arraylen; // parameter operasional#define delay_line 75 // ms antar pergantian baris#define delay_char 400 // ms antar karakter#define delay_mess 500 // ms antar pesan#define cblanks 1 // jumlah baris kosong antar karakter#define eblanks 0 // jumlah baris kosong tambahan (di atas 8) di akhir pesan// tampilan featuresstatic boolean top2bottom =false; // arah tampilan (atas ke bawah, atau kanan ke kiristatis boolean hour24 =false; // tampilan 24 jam?static boolean charHI =true; // sorot seluruh karakterstatis boolean doSerial =true; // output serial?//*** ************************************************** ************************************//// Pengaturan awal//****** ************************************************** *********************************//void setup () { Wire.begin(); Serial.begin( 57600); if(doSerial) Serial.print("MATRIX Clock - Adrian Jones, Mar. 2014"); // 8x8 pin kontrol matriks LED pinMode(dataIn, OUTPUT); pinMode(clock, OUTPUT); pinMode(memuat, OUTPUT ); initMatrix(); // menginisialisasi matriks LED // pin LED pinMode(mode_Pin, OUTPUT); // mode pin digitalWrite(mode_Pin, 1); pinMode(min_Pin, OUTPUT); // menit pin digitalWrite(min_Pin, 1); // mode kontrol encoder pin(enc_PinA, INPUT_PULLUP); digitalWrite(enc_PinA, HIGH); // rotary encoder pin A pinMode(enc_PinB, INPUT_PULLUP); digitalWrite(enc_PinB, HIGH); // putar pin encoder B pinMode(enc_Switch, INPUT_PULLUP);digitalWrite(enc_Switch, HIGH); // sakelar encoder attachInterrupt(0, rotEncoder, CHANGE); // pengaturan waktu attachInterrupt(1, swEncoder, CHANGE); // menit / jam // RTC RTC.begin(); if (! RTC.berjalan()) { RTC.adjust(DateTime(__DATE__, __TIME__)); if(doSerial) Serial.println(" (reset RTC)"); } else { if(doSerial) Serial.println(" (RTC berjalan)"); } } //********************************************* *******************************************//// Putaran Utama/ /************************************************ ****************************************//void loop () { DateTime now =RTC.sekarang(); // tampilkan_waktu_dan_tanggal(sekarang); // waktu tampilan display_message =createMessage(sekarang); arraylen =initDisplayString(display_message); if(updateFlag) { show_time_and_date(sekarang); updateFlag =salah; } while(berputar) { delay(1); // debounce adjTime(sekarang, searah jarum jam); show_time_and_date(RTC.now() ); display_message =createMessage(sekarang); arraylen =initDisplayString(display_message); penundaan (1); berputar =salah; // Reset flag interupsi kembali ke false } delay(5); for (int i =0; i <(arraylen-7); i++) { // mengulang melalui array pesan, memajukan satu byte pada satu waktu for (int j =1; j <9; j++) { maxSingle(j,ac [i+8-j]); } // baris 1 mendapat ac[i+8], baris 2 mendapat ac[i+7] dll... baris 8 mendapat ac[i+0] if(i%(8+cblanks) ==0) { / / ketika ada karakter lengkap pada tampilan... if(charHI) maxSingle(max7219_reg_intensity, 0x01); // ... meningkatkan kecerahan dan menghentikan sementara newDelay(delay_char); } else { // kecerahan normal maxSingle(max7219_reg_intensity, 0x00); newDelay(delay_line); } } if(mode ==0) newDelay(delay_mess);}// ********************************* ************************************************* / /// INTERRUPT RUTINE// ******************************************* *************************************** //// fungsi rotEncoder():ISR dipanggil ketika pembuat enkode diputarvoid rotEncoder(){ delay(1); enc_A =digitalRead(enc_PinA); enc_B =digitalRead(enc_PinB); if(!enc_A &&enc_A_prev){ // perubahan keadaan searah jarum jam =(!enc_A &&enc_B)? benar salah; if(mode !=0) berputar =benar; } enc_A_prev =enc_A; // Simpan nilai A untuk waktu berikutnya }// function swEncoder():ISR dipanggil ketika tombol encoder ditekanvoid swEncoder(){ delay(1); if(digitalRead (enc_Switch) !=RENDAH) kembali; // jika sakelar tertekan penundaan(1); // debounce if(digitalRead (enc_Switch) !=LOW) kembali; // jika sakelar mode masih tertekan++; modus =modus % 3; // mode kenaikan digitalWrite(mode_Pin, !(mode ==1)); // jam menyesuaikan LED digitalWrite(min_Pin, !(mode ==2)); // menit menyesuaikan LED updateFlag =true;}// ************************************** ******************************************** //// RUTIN OPERASI // ************************************************ ********************************** //// function newDelayvoid newDelay (int dly) { for (int z =1; z=25) adj_hrs =1; } else { // kurangi jika(adj_hrs ==0) adj_hrs =24; if(--adj_hrs <=0) adj_hrs =24; } RTC.adjust(DateTime(now.year(), now.month(), now.day(), adj_hrs, now.minute(), now.second() )); } if(mode ==2) { // sesuaikan menit int adj_mins =sekarang.menit(); if(dir) { if(++adj_mins>=60) adj_mins =0; } else { if(--adj_mins <0) adj_mins =59; } RTC.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), adj_mins, now.second() )); }}// function rotChar(char):untuk karakter char, mentranspos bit 90 derajat. (atas - bawah ==> kiri - kanan)// dan menyimpan hasil di rc[0] - rc[7].byte rotChar(char inLetter) { int ind =int(inLetter) - 0x20; for (int col =0; col <8; col++) { byte mask =0x01 <<(7-col); for (int baris =0; baris <8; baris++) { bitWrite(rc[col], 7-row,(alphanum[ind][row] &mask)); } }} // fungsi show_time_and_date:mencetak string waktu &bytevoid show_time_and_date(DateTime datetime){ if(doSerial) { int menit =datetime.minute(); int jam =datetime.hour(); if(jam==0) jam=24; int detik =datetime.second(); char delim ='/'; char dend =' '; String te ="Tanggal/waktu sekarang:"; te =te + datetime.year() + delim + datetime.month() + delim + datetime.day() + dend; Serial.print(te); if(jam<10) Serial.print(0); Serial.print(jam, DES); Serial.print(":"); if(menit<10) Serial.print(0); Serial.print(menit, DES); Serial.print(":"); if(detik <10) Serial.print(0); Serial.print(detik, DES); Serial.println(""); } }String createMessage(DateTime datetime) { String new_mess =" "; int jam =datetime.hour()%24; jika(jam ==0) jam =24; int mn =datetime.minute(); if(mode ==0) { // Mode normal if(hour24) { new_mess +=jam; } else { new_mess +=(jam> 12)? jam - 12 :jam; } kekacauan_baru +=':'; if(mn <10) new_mess +='0'; new_mess +=mn; if(!hour24) new_mess +=(jam> 12)? "~" :"^"; } if(mode ==1) { // Menyesuaikan jam new_mess +=jam; } if(mode ==2) { // Menyesuaikan menit if(mn <10) new_mess +='0'; new_mess +=mn; } return new_mess;}// function initDisplayString() :membuat array string pesan dengan kosong di antara karakter dan di akhir initDisplayString(String message) { int x =0; for (int y =0; y > 1); // memasukkan data digitalWrite(load,HIGH);}// function putByte() :memuat data ke matriks, MSB ke LSB void putByte(byte data) { byte i =8; topeng byte; while(i> 0) { // MSB ke LSB topeng =0x01 <<(i - 1); // buat bitmask digitalWrite(jam, RENDAH); // centang if (data &mask){ // pilih bit digitalWrite(dataIn, HIGH);// send 1 } else { digitalWrite(dataIn, LOW); // kirim 0 } digitalWrite(jam, TINGGI); // tok --i; // pindah ke bit yang lebih kecil }}

Skema


Proses manufaktur

  1. Arduino pov vision clock
  2. Jam IV9 Numitron DIY paling sederhana dengan Arduino
  3. Jam Master
  4. Game Arduino Nano Tetris di Matriks 16x8 Buatan Sendiri
  5. MotionSense
  6. Matriks LED + Tampilan Pintu Sensor Gerak [Arduino Holiday]
  7. Arduino Quadruped
  8. Mengontrol Kecerahan LED Menggunakan Bolt dan Arduino
  9. Pengukur IoT dengan Arduino, Yaler &IFTTT
  10. Arduino Repulsive Electromagnetic Levitation