Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Einzelne LED-Matrix-Arduino Flip Clock

Komponenten und Verbrauchsmaterialien

Arduino Nano R3
× 1
Maxim Integrated DS3231M - ±5 ppm, I2C-Echtzeituhr
× 1
8x8-LED-Matrix mit MAX7219-Treiber
× 1
RGB diffundierte gemeinsame Kathode
× 1
Widerstand 220 Ohm
× 2
Drehgeber mit Druckknopf
× 1

Notwendige Werkzeuge und Maschinen

Lötkolben (generisch)

Apps und Onlinedienste

Arduino-IDE

Über dieses Projekt

Ich baue dieses von Adrian Jones entwickelte 8x8 LED-Matrix-Modul CLOCK. Die Zeit wird durch Scrollen von links nach rechts oder softwaregesteuert von oben nach unten angezeigt. Jede Ziffer der Zeit gleitet nacheinander von der rechten Seite ein und wenn sie zentriert ist, stoppt sie kurz und hellt sich leicht auf. Es scrollt dann nach links, während die nächste Ziffer im Display angezeigt wird. Der Zyklus wiederholt sich mit einer kurzen Verzögerung zwischen aufeinanderfolgenden Anzeigen. Für das vertikale Spiegeln "von oben nach unten" sollten Sie Folgendes ändern:

static boolean top2bottom =false;

an:

statisch boolesch top2bottom =true;

Wie Sie in den Kommentaren des Codes sehen können, können viele Parameter geändert werden, zum Beispiel Scrollgeschwindigkeit, Anzahl der Leerzeilen zwischen den Zeichen, 12/24-Stunden-Anzeige, ms zwischen den Zeichen, Helligkeit usw..

Die Zeit kann einfach mit einem Drehgeber eingestellt werden.Eine zweifarbige Diode zeigt den Einstellmodus (Minuten, Stunden oder Normal) an.Ich habe die Uhr in eine Box aus zwei Grundteilen gesteckt, damit der Zugang zum Inneren der Box ist sehr bequem und praktisch.

Code

  • Code
codeArduino
//************************************************ ******************************************** //// MATRIX UHR // Adrian Jones, März 2014//// - ermöglicht das Scrollen von links nach rechts und von oben nach unten /////************************ ************************************************* ******************//#include // I2C-WIRE-Bibliothek#include // RTC-Bibliothek// Definiere max7219 Register und Steuerstifte # definieren 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 # max7219_reg_intensity 0x0A # define definieren 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 alphanum[][8] ={{0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00}, // leer Hex 20.12.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}, // W {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 (codiert als '^' {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}, // h {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} // pm-Codes als '~' Hex 7E, Dez 126 }; // RTC-Operation definierenRTC_DS1307 RTC; // Winziges RTC (DS1307) Modul (SDA - A4, SCL - A5) // Drehgeber, Schalter und LED-Steuerung#define enc_PinA 2 // Encoder A an Pin 2 (Interrupt 0)#define enc_PinB 4 // Encoder B an Pin 4#define enc_Switch 3 // Encoder-Schalter auf Pin 3 (Interrupt 1)#define mode_Pin 8 // Modus-LED-Pin#define min_Pin 9 // Minuten-LED Pinunsigned char enc_A, enc_B, enc_A_prev=0;statisches Boolesches Rotieren =false; static boolean im Uhrzeigersinn =false;static boolean updateFlag=false;static int mode =0; // 0 - nichts, 1 - Stundensatz, 2 - Minutensatz // Anzeigezeichenfolgen definieren#define max_array_size 100char ac[max_array_size] ={};byte rc[8] ={};String display_message ="";int arraylen; // Betriebsparameter#define delay_line 75 // ms zwischen Zeilenverschiebungen#define delay_char 400 // ms zwischen den Zeichen#define delay_mess 500 // ms zwischen den Nachrichten#define cblanks 1 // Anzahl der Leerzeilen zwischen den Zeichen#define eblanks 0 // Anzahl zusätzlicher Leerzeilen (über 8) am Ende der Nachricht // display featuresstatic boolean top2bottom =false; // Anzeigerichtung (von oben nach unten oder von rechts nach linksstatic boolean hour24 =false; // 24-Stunden-Anzeige?static boolean charHI =true; // ganze Zeichen hervorhebenstatic boolean doSerial =true; // serielle Ausgabe?//*** ************************************************* ************************************//// Ersteinrichtung//****** ************************************************* ******************************** // Einrichtung ungültig () { Wire.begin (); Serial.begin ( 57600); if (doSerial) Serial.print ("MATRIX Clock - Adrian Jones, Mar. 2014"); // 8x8 LED-Matrix-Steuerpins PinMode (dataIn, OUTPUT); pinMode (clock, OUTPUT); pinMode (load, OUTPUT ); initMatrix(); // LED-Matrix initialisieren // LED-Pins pinMode (mode_Pin, OUTPUT); // Moduspin digitalWrite (mode_Pin, 1); pinMode (min_Pin, OUTPUT); // Minutenpin digitalWrite (min_Pin, 1); // Encoder-Steuerung PinMode (enc_PinA, INPUT_PULLUP); digitalWrite (enc_PinA, HIGH); // Drehgeber Pin A PinMode (enc_PinB, INPUT_PULLUP); digitalWrite (enc_PinB, HIGH); // Dreh Encoder-Pin B PinMode (enc_Switch, INPUT_PULLUP); digitalWrite (enc_Switch, HIGH); // Encoder-Schalter AttachInterrupt (0, rotEncoder, CHANGE); // Zeiteinstellung attachInterrupt (1, swEncoder, CHANGE); // Minuten / Stunden // RTC RTC.begin(); if (! RTC.isrunning()) { RTC.adjust(DateTime(__DATE__, __TIME__)); if(doSerial) Serial.println(" (RTC-Reset)"); aufrechtzuerhalten. Sonst { if (doSerial) Serial.println ( "(RTC läuft)"); } } //************************************************ *******************************************//// Hauptschleife/ /************************************************ ************************************** //void loop () { DateTime now =RTC.now(); // show_time_and_date (jetzt); // Zeit anzeigen display_message =createMessage (jetzt); arraylen =initDisplayString(display_message); if (updateFlag) { show_time_and_date (jetzt); updateFlag =false; aufrechtzuerhalten. Während (rotierend) { Verzögerung (1); // entprellen adjTime (jetzt im Uhrzeigersinn); show_time_and_date(RTC.now()); display_message =createMessage (jetzt); arraylen =initDisplayString(display_message); Verzögerung (1); rotierend =falsch; // Setzen Sie das Interrupt-Flag auf false zurück} delay(5); for (int i =0; i <(arraylen-7); i++) { // durchläuft das Nachrichten-Array, wobei jeweils ein Byte vorgerückt wird for (int j =1; j <9; j++) { maxSingle(j,ac [i+8-j]); } // Zeile 1 bekommt ac[i+8], Zeile 2 bekommt ac[i+7] etc... Zeile 8 bekommt ac[i+0] if(i%(8+cblanks) ==0) { / / wenn ein vollständiges Zeichen auf dem Display steht... if(charHI) maxSingle(max7219_reg_intensity, 0x01); // ... Helligkeit erhöhen und vorübergehend anhalten newDelay(delay_char); aufrechtzuerhalten. Sonst {// normale Helligkeit maxSingle (max7219_reg_intensity, 0x00); newDelay(delay_line); } } if(mode ==0) newDelay(delay_mess);}// ********************************* ************************************************ / /// UNTERBRECHUNGSROUTINEN// ****************************************** ************************************** //// Funktion rotEncoder():ISR aufgerufen wenn der Encoder rotiertvoid rotEncoder () { Verzögerung (1); enc_A =digitalRead(enc_PinA); enc_B =digitalRead(enc_PinB); if(!enc_A &&enc_A_prev){ // Zustandsänderung im Uhrzeigersinn =(!enc_A &&enc_B)? wahr falsch; if(mode !=0) rotierend =wahr; } enc_A_prev =enc_A; // Wert von A für das nächste Mal speichern }// Funktion swEncoder():ISR wird aufgerufen, wenn Encoder-Taste gedrückt wirdvoid swEncoder(){ delay(1); if(digitalRead (enc_Switch) !=LOW) zurück; // wenn Schalter gedrückt Verzögerung (1); // entprellen if (digitalRead (enc_Switch) !=LOW) return; // wenn Schalter immer noch gedrückt mode++; Modus =Modus % 3; // Inkrementalmodus digitalWrite (mode_Pin, !(mode ==1)); // Stundeneinstellung LED digitalWrite (min_Pin, !(mode ==2)); // Minuteneinstellung LED updateFlag =true;} // ************************************* ****************************************** //// BEDIENUNGSROUTINEN // ************************************************ ********************************* //// Funktion newDelayvoid newDelay (int dly) { for (int z =1; z=25) adj_hrs =1; aufrechtzuerhalten. Else { // dekrementieren if (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) {// Minuten anpassen Int adj_mins =now.minute(); 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() )); }}// Funktion rotChar(char):für Zeichen char, transponiert Bits um 90 Grad. (oben - unten ==> links - rechts) // und speichert die Ergebnisse in 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 row =0; row <8; row++) { bitWrite(rc[col], 7-row,(alphanum[ind][row] &mask)); } }} // Funktion show_time_and_date:Zeitstring ausgeben &bytesvoid show_time_and_date(DateTime datetime){ if(doSerial) { int minutes =datetime.minute(); int Stunden =datetime.hour(); if(Stunden==0) Stunden=24; int sekunden =datetime.second(); char delim ='/'; Zeichendend =' '; String te ="Aktuelles Datum/Uhrzeit:"; te =te + datetime.year() + delim + datetime.month() + delim + datetime.day() + dend; Serial.print (te); wenn (Stunden <10) Serial.print (0); Serial.print (Stunden, DEZ); Serial.print (":"); if (Minuten <10) Serial.print (0); Serial.print (Minuten, DEZ); Serial.print (":"); if (Sekunden <10) Serial.print (0); Serial.print (Sekunden, DEZ); Serial.println(""); } }String createMessage(DateTime datetime) { String new_mess =" "; int hr =datetime.hour()%24; if(h ==0) h =24; int mn =datetime.minute(); if(mode ==0) {// Normalmodus if(hour24) { new_mess +=hr; } else { new_mess +=(Std> 12)? Std. - 12:Std.; } new_mess +=':'; if(mn <10) new_mess +='0'; new_mess +=mn; if(!hour24) new_mess +=(Std> 12)? "~" :"^"; } if(mode ==1) {// Stunden anpassen new_mess +=hr; } if(mode ==2) {// Minuten anpassen if(mn <10) new_mess +='0'; new_mess +=mn; } return new_mess;}// Funktion initDisplayString() :Erstellt ein Array von Nachrichtenstrings mit Leerzeichen zwischen den Zeichen und am Ende initDisplayString(String message) { int x =0; for (int y =0; y > 1); // setze Daten digitalWrite(load,HIGH);}// Funktion putByte() :lädt Daten in Matrix, MSB in LSB void putByte(byte data) { byte i =8; Byte-Maske; while(i> 0) {// MSB-zu-LSB-Maske =0x01 <<(i - 1); // Bitmaske erstellen digitalWrite (Takt, LOW); // ankreuzen, wenn (Daten &Maske) { // Bit wählen digitalWrite (dataIn, HIGH); // sende 1} else { digitalWrite (dataIn, LOW); // 0 senden} digitalWrite (Takt, HIGH); // tock --i; // zum kleineren Bit wechseln }}

Schaltpläne


Herstellungsprozess

  1. Arduino-Pov-Vision-Uhr
  2. DIY einfachste IV9 Numitron-Uhr mit Arduino
  3. Hauptuhr
  4. Arduino Nano Tetris-Spiel auf hausgemachter 16x8-Matrix
  5. MotionSense
  6. LED-Matrix + Bewegungssensor-Türanzeige [Arduino Holiday]
  7. Arduino-Vierbeiner
  8. Steuerung der LED-Helligkeit mit Bolt und Arduino
  9. IoT-Messgerät mit Arduino, Yaler und IFTTT
  10. Arduino Repulsive Electromagnetic Levitation