Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Enkele LED Matrix Arduino Flip Clock

Componenten en benodigdheden

Arduino Nano R3
× 1
Maxim Integrated DS3231M - ±5ppm, I2C real-time klok
× 1
8x8 Led-matrix met MAX7219-driver
× 1
RGB diffuse gemeenschappelijke kathode
× 1
Weerstand 220 ohm
× 2
Roterende encoder met drukknop
× 1

Benodigde gereedschappen en machines

Soldeerbout (algemeen)

Apps en online services

Arduino IDE

Over dit project

Ik bouw deze 8x8 LED Matrix Module KLOK ontwikkeld door Adrian Jones. De tijd wordt weergegeven door van links naar rechts te scrollen, of, onder softwarebesturing, van boven naar beneden. Elk cijfer van de tijd schuift achtereenvolgens naar binnen vanaf de rechterkant en wanneer het gecentreerd is, stopt het even en wordt het iets helderder. Vervolgens schuift het naar links terwijl het volgende cijfer in het display in beeld komt. De cyclus wordt herhaald met een korte vertraging tussen opeenvolgende weergaven. Voor "van boven naar beneden" verticaal spiegelen moet u het volgende wijzigen:

statische boolean top2bottom =false;

naar:

statische boolean top2bottom =waar;

Zoals je kunt zien in de opmerkingen van de code, kunnen veel parameters worden gewijzigd, bijvoorbeeld scroll-snelheid, aantal lege regels tussen tekens, 12/24-uurs weergave, ms tussen tekens, helderheid enz..

De tijd kan eenvoudig worden ingesteld met behulp van een roterende encoder. Een tweekleurige diode geeft de instellingsmodus weer (minuten, uren of normaal). Ik heb de klok in een doos geplaatst die uit twee basisstukken bestaat, zodat de toegang tot de binnenkant van de doos is erg handig en praktisch.

Code

  • code
codeArduino
//********************************************* *********************************************//// MATRIX KLOK // Adrian Jones, maart 2014//// - scrollen van links naar rechts en van boven naar beneden mogelijk////************************* ********************************************** ****************//#include  // I2C-WIRE library#include  // RTC-Library// definieer max7219 registers en stuurstiften # definiëren max7219_reg_noop 0x00 # definiëren max7219_reg_digit0 0x01 # definiëren max7219_reg_digit1 0x02 # definiëren max7219_reg_digit2 0x03 # definiëren max7219_reg_digit3 0x04 # definiëren max7219_reg_digit4 0x05 # definiëren max7219_reg_digit5 0x06 # definiëren max7219_reg_digit6 0x07 # definiëren max7219_reg_digit7 0x08 # definiëren max7219_reg_decodeMode 0x09 # definiëren max7219_reg_intensity 0x0a # definiëren 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}, // blanco Hex 20 december 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}, // B {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 (gecodeerd 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}, // een {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}, // met {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, Dec 126 };// definieer RTC-bewerkingRTC_DS1307 RTC; // Tiny RTC (DS1307) module (SDA - A4, SCL - A5)// roterende encoder, schakelaar en LED-besturing#define enc_PinA 2 // encoder A naar pin 2 (interrupt 0)#define enc_PinB 4 // encoder B naar pin 4#define enc_Switch 3 // encoder switch naar pin 3 (interrupt 1)#define mode_Pin 8 // mode LED pin#define min_Pin 9 // minuut LED pinunsigned char enc_A, enc_B, enc_A_prev=0;static boolean roterende =false; statische boolean met de klok mee =onwaar; statische boolean updateFlag=onwaar; statische int-modus =0; // 0 - niets, 1 - uur set, 2 - min set// definieer display strings#define max_array_size 100char ac[max_array_size] ={};byte rc[8] ={};String display_message ="";int arraylen; // operationele parameters#define delay_line 75 // ms tussen regelverschuivingen#define delay_char 400 // ms tussen karakters#define delay_mess 500 // ms tussen berichten#define cblanks 1 // aantal lege regels tussen karakters#define eblanks 0 // aantal extra lege regels (boven 8) aan het einde van het bericht// display featuresstatic boolean top2bottom =false; // weergaverichting (van boven naar beneden, of van rechts naar links statisch boolean hour24 =false; // 24-uurs weergave?static boolean charHI =true; // markeer hele karakterstatic boolean doSerial =true; // seriële uitvoer?//*** ********************************************** ************************************//// Initiële setup//****** ********************************************** *******************************//void setup () { Wire.begin(); Serial.begin( 57600); if (doSerial) Serial.print ("MATRIX Clock - Adrian Jones, maart 2014"); // 8x8 LED-matrixbesturingspinnen pinMode (dataIn, OUTPUT); pinMode (klok, OUTPUT); pinMode (laden, OUTPUT ); initMatrix(); // LED-matrix initialiseren // LED-pinnen pinMode(mode_Pin, OUTPUT); // moduspin digitalWrite(mode_Pin, 1); pinMode(min_Pin, OUTPUT); // minuutpin digitalWrite(min_Pin, 1); // encoderbesturing pinMode (enc_PinA, INPUT_PULLUP); digitalWrite (enc_PinA, HIGH); // roterende encoderpin A pinMode (enc_PinB, INPUT_PULLUP); digitalWrite (enc_PinB, HIGH); // roterend encoder pin B pinMode (enc_Switch, INPUT_PULLUP); digitalWrite (enc_Switch, HIGH); // encoderschakelaar attachInterrupt (0, rotEncoder, CHANGE); // tijdinstelling attachInterrupt (1, swEncoder, CHANGE); // min / uren // RTC RTC.begin(); if (! RTC.isrunning()) { RTC.adjust(DateTime(__DATE__, __TIME__)); if(doSerial) Serial.println(" (RTC-reset)"); } else { if(doSerial) Serial.println(" (RTC actief)"); } } //************************************************** *******************************************//// Hoofdlus/ /************************************************** ****************************************//void loop () { DateTime now =RTC.nu(); // show_time_and_date (nu); // tijd weergeven display_message =createMessage (nu); arraylen =initDisplayString(display_message); if (updateFlag) { show_time_and_date (nu); updateFlag =onwaar; } while(roterend) { vertraging(1); // debounce adjTime (nu, met de klok mee); show_time_and_date(RTC.now()); display_message =createMessage (nu); arraylen =initDisplayString(display_message); vertraging(1); roterend =onwaar; // Reset de interruptvlag terug naar false} delay (5); for (int i =0; i <(arraylen-7); i++) {// doorloopt berichtenarray en gaat één byte tegelijk vooruit for (int j =1; j <9; j++) {maxSingle(j,ac [i+8-j]); } // rij 1 krijgt ac[i+8], rij 2 krijgt ac[i+7] enz... rij 8 krijgt ac[i+0] if(i%(8+cblanks) ==0) { / / wanneer er een volledig teken op het scherm staat... if(charHI) maxSingle(max7219_reg_intensity, 0x01); // ... verhoog de helderheid en stop tijdelijk newDelay(delay_char); } else { // normale helderheid maxSingle (max7219_reg_intensity, 0x00); newDelay(delay_line); } } if(mode ==0) newDelay(delay_mess);}// *********************************** ********************************************** / /// ROUTINES ONDERBREKEN// ***************************************** ************************************ //// functie rotEncoder():ISR aangeroepen wanneer de encoder wordt geroteerd, vervalt rotEncoder(){ delay(1); enc_A =digitalRead (enc_PinA); enc_B =digitalRead (enc_PinB); if(!enc_A &&enc_A_prev){ // verandering van status met de klok mee =(!enc_A &&enc_B)? waar onwaar; if(mode !=0) roteren =true; } enc_A_prev =enc_A; // Bewaar de waarde van A voor de volgende keer}// function swEncoder():ISR wordt aangeroepen wanneer de encoderknop wordt ingedruktvoid swEncoder(){ delay(1); if (digitalRead (enc_Switch)! =LAAG) terugkeer; // als schakelaar ingedrukt vertraging (1); // debounce if (digitalRead (enc_Switch)! =LOW) return; // als de schakelaar nog steeds ingedrukt is, modus ++; modus =modus % 3; // increment mode digitalWrite (mode_Pin, !(mode ==1)); // uur aanpassen LED digitalWrite (min_Pin,! (modus ==2)); // minuut aanpassen LED updateFlag =true;}// ************************************ ***************************************** //// OPERATION ROUTINES // *************************************************** ******************************* //// function newDelayvoid newDelay (int dly) { for (int z =1; z=25) adj_hrs =1; } else { // decrement 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) { // notulen aanpassen 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() )); }}// functie rotChar(char):voor karakter char, transponeert bits 90 graden. (boven - onder ==> links - rechts)// en slaat de resultaten op 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 rij =0; rij <8; rij++) { bitWrite(rc[col], 7-row,(alphanum[ind][row] &mask)); } }} // function show_time_and_date:print time string &bytesvoid show_time_and_date(DateTime datetime){ if(doSerial) { int minutes =datetime.minute(); int hours =datetime.hour(); if(uren==0) uren=24; int seconden =datetime.second(); char delim ='/'; char dend =' '; String te ="Huidige datum/tijd:"; te =te + datetime.year() + delim + datetime.month() + delim + datetime.day() + dend; Serial.print(te); if(uren<10) Serial.print(0); Serial.print (uren, DEC); Serial.print(":"); if(minuten<10) Serial.print(0); Serial.print (minuten, DEC); Serial.print(":"); if (seconden <10) Serial.print (0); Serial.print (seconden, DEC); Serieel.println(""); } }String createMessage(DateTime datetime) { String new_mess =" "; int hr =datetime.hour()%24; als (uur ==0) uur =24; int mn =datetime.minute(); if(mode ==0) { // Normale modus if(hour24) { new_mess +=hr; } else { new_mess +=(uur> 12)? uur - 12 :uur; } new_mess +=':'; if(mn <10) new_mess +='0'; new_mess +=mn; if(!hour24) new_mess +=(hr> 12)? "~" :"^"; } if(mode ==1) { // Uren aanpassen new_mess +=hr; } if(mode ==2) { // Minuten aanpassen if(mn <10) new_mess +='0'; new_mess +=mn; } return new_mess;}// function initDisplayString() :creëert een array van berichtstring met spaties tussen karakters en op endint initDisplayString(String message) {int x =0; for (int y =0; y > 1); // put data digitalWrite(load,HIGH);}// function putByte() :laadt data naar matrix, MSB naar LSB void putByte(byte data) {byte i =8; byte-masker; while (i> 0) {// MSB naar LSB-masker =0x01 <<(i - 1); // maak bitmask digitalWrite (klok, LAAG); // tick if (data &mask) {// kies bit digitalWrite (dataIn, HIGH);// stuur 1} else { digitalWrite (dataIn, LOW); // stuur 0} digitalWrite (klok, HOOG); // tok --i; // verplaats naar kleinere bit }}

Schema's


Productieproces

  1. Arduino pov vision-klok
  2. DIY eenvoudigste IV9 Numitron-klok met Arduino
  3. Hoofdklok
  4. Arduino Nano Tetris-spel op zelfgemaakte 16x8 Matrix
  5. MotionSense
  6. LED-matrix + bewegingssensor deurdisplay [Arduino Holiday]
  7. Arduino Quadruped
  8. LED-helderheid regelen met Bolt en Arduino
  9. IoT-meter met Arduino, Yaler en IFTTT
  10. Arduino afstotende elektromagnetische levitatie
  11. Arduino aangedreven weerballon datalogger