FireBeetle Led 24×8 Date e Clock aggiunge la funzione data all’orologio in visione del progetto finale di realizzare un orologio con datario maker.
Prima di iniziare con la descrizione di questa componente del progetto ti invito a leggere i precedenti articoli collegati al progetto stesso:
- Firebeetle covers 24×8 led matrix
- ESP32 NTP Client library
- Firebeetle Clock case
- Led 24×8 NTP Client Clock
in ciascuno di essi è descritto minuziosamente una componente del progetto dall’installazione delle librerie per ESP32 alla gestione della matrice di led.
Premessa per FireBeetle Led 24×8 Date e Clock
Prima di passare alla descrizione dello sketch del progetto e delle funzionalità è necessario che tu applichi alla libraria NTP client un fix che ti consente di aggiungere le tre funzioni:
- getYear()
- getMonth()
- getDate()
per poter interrogare la libreria facendoti restituire sia la data nel formato già previsto o solo i 3 valori, giorno,mese ed anno in modo singolo e separato.
Tale modifica serve a semplificare lo sketch ed ottenere la divisione della data in:
e
la modifica è descritta in questa issue direttamente sul git della libreria NTP Client: https://github.com/arduino-libraries/NTPClient/issues/36
Notice
Ricordati che dopo le modifiche alle librerie è necessario chiudere e riaprire l’IDE.
Lo sketch FireBeetle Led 24×8 Date e Clock
Ora che hai eseguito la modifica alla libreria ntp client puoi procedere con l’analisi dello sketchFireBeetle Led 24×8 Date e Clock e l’upload:
/* * This sketch sends random data over UDP on a ESP32 device * */ #include <NTPClient.h> #include <WiFi.h> #include <WiFiUdp.h> #include "DFRobot_HT1632C.h" #if defined( ESP_PLATFORM ) || defined( ARDUINO_ARCH_FIREBEETLE8266 ) //FireBeetle-ESP32 FireBeetle-ESP8266 #define DATA D6 #define CS D2 #define WR D7 //#define RD D8 #else #define DATA 6 #define CS 2 #define WR 7 //#define RD 8 #endif // WiFi network name and password: const char * ssid = "[ SSID ]"; const char * pwd = "[ password WiFi ]"; //The udp library class WiFiUDP udp; // FireBeetle Led Matrix DFRobot_HT1632C ht1632c = DFRobot_HT1632C(DATA, WR,CS); char str[] = "00:00"; byte countData = 0; // By default 'time.nist.gov' is used with 60 seconds update interval and // no offset NTPClient timeClient(udp,0); void setup(){ Serial.begin(115200); WiFi.begin(ssid, pwd); ht1632c.begin(); ht1632c.isLedOn(true); ht1632c.clearScreen(); ht1632c.setCursor(0,0); ht1632c.setPwm(0); ht1632c.print("wifi..."); while ( WiFi.status() != WL_CONNECTED ) { delay ( 500 ); Serial.print ( "." ); } timeClient.begin(); ht1632c.clearScreen(); ht1632c.setCursor(1,0); ht1632c.print("...ok..."); } void loop(){ timeClient.update(); ht1632c.clearScreen(); ht1632c.setCursor(1,0); if ( (timeClient.getSeconds()%2) == 0 ) { sprintf(str,"%02d:%02d", timeClient.getHours(), timeClient.getMinutes()); } else { sprintf(str,"%02d %02d", timeClient.getHours(), timeClient.getMinutes()); } if ( countData == 5 ) { countData=0; ht1632c.clearScreen(); ht1632c.setCursor(0,0); sprintf(str,"%02d/%02d", timeClient.getDate(), timeClient.getMonth()); ht1632c.print(str); delay( 1000 ); sprintf(str,"%04d", timeClient.getYear()); ht1632c.clearScreen(); ht1632c.setCursor(2,0); } Serial.println(str); ht1632c.print(str); countData++; delay(1000); }
le linee iniziali, dalla 01-08, includono le librerie necessarie alla connessione WiFi, gestione ntp e gestione HT1632c ( la matrice display )
linee 10-20: sono le impostazioni e definizioni dei pin in funzione dell’architettura del micro controllore che utilizzerai;
ricordati che alle linee 23-24 devi cambiare i valori inserendo quelli per collegare la FireBeetle Led 24×8 Date e Clock alla tua connessione WiFi;
le linee dalla 27 alla 59 sono dettagliatamente descritte negli articoli di cui trovi i link sopra.
Linea 62: richiedi alla libreria ntp un update delle informazioni ad ogni loop();
linee 64-65: ripulisci il display 24×8 led matrix e posizioni il cursore alla posizione 1,0;
le linee 67-71: si occupano di calcolare se il secondo corrente è pari o dispari e di conseguenza se accendere o spegnere i “:” tra l’ora ed i minuti, trovi decritta anche questa parte nei precedenti articoli;
linea 73: controlla il valore di una variabile chiamata countData la cui funzione è scandire ogni quanti secondi visualizzare la data sul display. Se la countData assume valore 5 puoi procedere con le linee che seguono;
linea 74: azzera la variabile countData perché al ciclo successivo riparta da 0;
linee 76-77: pulisci i display e posizionati in 0,0;
linea 78: usando il comando sprintf formatta la data, giorno, e mese secondo il formato gg/mm, aggiungendo gli 0 se il valore numerico è inferiore a 10;
Warning!
Nota che per richiedere il giorno ed il mese hai usato le due funzioni getData() e getMonth() definite nella premessa modificando la llibreria ntp client, in caso contrario non riuscirai a far funzionare lo sketch.
Linee 79-80: scrivi sul display la stringa appena creata e attendi 1 secondo prima di procedere oltre;
linea 82: usando la funzione sprintf, come già alla linea 78, formatta l’anno richiesto alla libreria mediante il metodo getYear() aggiunto nella correzione della libreria;
linee 83-84: pulisci nuovamente il display e posizionati in 2,0;
linea 87: scrivi sul display il valore della variabile str sia essa proveniente dalla condizione di if della linea 73 od in alternativa dalle linee 67-71;
linea 89: incrementa ad ogni ciclo di loop il valore della countData in modo che possa ogni 5 secondi visualizzare la data e l’anno del FireBeetle Led 24×8 Date e Clock;
linea 90: implementa un ritardo, o attesa, di un secondo.
Il video del FireBeetle Date e Clock
dopo aver modificato la libreria, rivviato l’IDE e trasferito il dato sulla ESP32 puoi controllare che la connessione WiFi sia avvenuta correttamente mediante serial monitor e successivamente dovresti vedere quanto nel video:
Nei prossimi articoli dedicati a questo progetto proveremo a inserire altre future per gestire una sveglia ed una agenda remota.