Usare la scheda ESP8266/Wemos D1 Mini come RTC WiFi grazie all’NTP

In questo articolo parleremo di come utilizzare la scheda ESP8266/Wemos D1 Mini e un display a 7 segmenti da 8 caratteri per creare un orologio WiFi.

Il display che andremo a collegare alla nostra scheda Wemos D1 Mini è il seguente di cui vi lascio il link Amazon per l’eventuale acquisto.
863max7219_dis8_1024x768.jpg

Per collegare lo schermo al Wemos utilizzeremo il seguente schema, molto semplice.
max7219_1024x332.jpg

Sullo schermo sono presenti 5 collegamenti che andranno collegati alla scheda Wemos D1 Mini in questo modo:

SCHERMO Vcc -> Wemos D1 Mini 5V
SCHERMO GND -> Wemos D1 Mini Ground
SCHERMO Din -> Wemos D1 Mini Pin D8
SCHERMO CS -> Wemos D1 Mini Pin D6
SCHERMO CLK -> Wemos D1 Mini Pin D7

Una volta collegato come mostrato poco fà il display è pronto per essere utilizzato.

Per poter ricevere l’orario corretto utilizzeremo la libreria NTPClient.h grazie alla quale saremo in grado di collegarci ad un server NTP e recuperare l’ora esatta.

Ma cosa è l’NTP?

Il Network Time Protocol, in sigla NTP, è un protocollo per sincronizzare gli orologi dei computer all’interno di una rete a commutazione di pacchetto, quindi con tempi di latenza variabili ed inaffidabili. L’NTP è un protocollo client–server appartenente al livello applicativo ed è in ascolto sulla porta UDP 123.

#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <LedControl.h>

// MAX7219 Pin e Configurazioni
#define dinPin D8
#define csPin D6
#define clkPin D7

#define numDevices 1
#define dispAddr 0

// crea un'interfaccia di controllo del display a LED
LedControl led_disp = LedControl(dinPin, clkPin, csPin, numDevices);

const char *ssid = "SSID";
const char *password = "PASSWORD";

const long utcOffsetInSeconds = 7200; //Offset in secondi per l'Italia

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds); //Mi collego al server NTP
int s, m, h;

void setup() {
Serial.begin(9600);
led_disp.shutdown(dispAddr, false); // riattivare il MAX7219 dalla modalità di risparmio energetico
led_disp.setIntensity(dispAddr, 10); // imposta il livello di luminosità (0-15)
led_disp.clearDisplay(dispAddr); // cancella registro display

while (!Serial) ; // wait for Arduino Serial Monitor

WiFi.begin(ssid, password);

while ( WiFi.status() != WL_CONNECTED ) {
led_disp.setChar(0,8,'C',false);
delay (500);
led_disp.setChar(0,8,'C',true);
delay (500);
Serial.print ( "." );
}

if ( WiFi.status() == WL_CONNECTED ) {
led_disp.setChar(0,8,'C',true);
}
else{
led_disp.setChar(0,8,'C',false);
}
}

void loop() {
digitalClockDisplay(); //Scrivo output sulla seriale
digitalClockDisplayLCD(); //Scrivo output sul display
}

void digitalClockDisplayLCD() {
int s,m,h,hlast,mlast,slast;
slast = second() % 10;
mlast = minute() % 10;
hlast = hour() % 10;
s = (second() - slast) / 10;
m = (minute() - mlast) / 10;
h = (hour() - hlast) / 10;

led_disp.setDigit(0,5,h,false);
led_disp.setDigit(0,4,hlast,true);
led_disp.setDigit(0,3,m,false);
led_disp.setDigit(0,2,mlast,true);
led_disp.setDigit(0,1,s,false);
led_disp.setDigit(0,0,slast,false);

}

void digitalClockDisplay() {
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.println();
}

void printDigits(int digits) {
Serial.print(":");
if (digits < 10)
Serial.print('0');
Serial.print(digits);
}
Come sempre il codice è commentato e quindi non credo ci saranno grossi problemi ad utilizzarlo e a capirlo ma in caso scrivetemi pure nei commenti.

Buona giornata, alla prossima!

H2
H3
H4
3 columns
2 columns
1 column
Join the conversation now
Logo
Center