- Protocole de temps réseau (NTP)
- Composants requis
- Schéma de circuit et connexions
- Explication du code
RTC ou Real Time Clock est le module le plus couramment utilisé dans l'électronique et les appareils embarqués pour garder une trace du temps. Mais le problème avec RTC est que les micropuces des ordinateurs ne sont pas très précises et qu'elles ne peuvent fournir que l'heure du périphérique local. D'un autre côté, utiliser Internet pour récupérer l'heure des serveurs NTP est une meilleure solution pour obtenir l'heure car il est plus précis et peut fournir l'heure de n'importe quelle zone géographique du monde. Nous avons juste besoin d'un module Wi-Fi et d'un accès à Internet pour obtenir l'heure de n'importe quel endroit dans le monde en utilisant des serveurs NTP. Dans ce didacticiel, nous utiliserons ESP8266 NodeMCU pour obtenir l'heure et la date actuelles des serveurs NTP et les afficher sur un écran OLED.
Protocole de temps réseau (NTP)
NTP est l'un des plus anciens protocoles Internet (IP) de réseautage pour la synchronisation des horloges entre les réseaux informatiques. Il a été conçu par David L. Mills de l'Université du Delaware en 1981. Ce protocole peut être utilisé pour synchroniser de nombreux réseaux au temps universel coordonné (UTC) en quelques millisecondes. L'UTC est la principale norme de temps par laquelle le monde régule l'horloge et l'heure. L'UTC ne change pas et varie selon les emplacements géographiques. NTP utilise UTC comme référence de temps et fournit une heure précise et synchronisée sur Internet.
NTP fonctionne sur un modèle client-serveur hiérarchique. Le modèle haut de gamme a des horloges de référence dites «stratum0» comme les horloges atomiques, les ondes radio, le GPS, le GSM qui reçoit l'heure du satellite. Les serveurs qui reçoivent l'heure de la strate 0 sont appelés «strate1» et les serveurs qui reçoivent l'heure de la strate 1 sont appelés «strate2» et ainsi de suite. Cela continue et la précision du temps continue de diminuer après chaque étape. NTP sélectionne automatiquement la meilleure de plusieurs sources de temps disponibles à synchroniser, ce qui en fait un protocole tolérant aux pannes.
Donc, ici, dans ce projet, nous obtenons l'heure du serveur NTP en utilisant ESP8266 NodeMCU et en l'affichant sur un écran OLED. Ce même type d'horloge Internet est construit en utilisant ESP32 dans le didacticiel précédent.
ESP8266 peut accéder aux serveurs NTP en utilisant Internet pour obtenir une heure précise. Ici, NTP fonctionne en mode client-serveur, ESP8266 fonctionne comme périphérique client et se connecte aux serveurs NTP en utilisant UDP (User Datagram Protocol). Le client transmet un paquet de demande aux serveurs NTP et en retour, NTP envoie un paquet d'horodatage qui comprend des informations telles que la précision, le fuseau horaire, l'horodatage UNIX, etc.
Composants requis
- Écran OLED SSD1306 à 7 broches monochrome de 0,96 po
- ESP8266 NodeMCU
- Câble micro USB
- Planche à pain
- Fils de cavalier mâle à mâle
Schéma de circuit et connexions
Cet écran OLED à 7 broches communique avec le module ESP8266 en utilisant le protocole SPI.Vous trouverez ci-dessous le schéma de circuit et le tableau des connexions pour connecter les broches OLED SPI avec NodeMCU pour afficher l'heure Internet.
Non. |
Affichage OLED |
NodeMCU |
1 |
GND |
GND |
2 |
VDD |
3,3 V |
3 |
SCK |
D5 |
4 |
MOSI (SPI) ou SDA (I2C) |
D7 |
5 |
RÉINITIALISER |
D3 |
6 |
DC |
D2 |
sept |
CS |
D8 |
Pour en savoir plus sur cet écran OLED monochrome à 7 broches et son interface avec ESP8266 NodeMCU, suivez le lien.
Explication du code
Nous devons d'abord télécharger et installer la bibliothèque NTP dans ESP8266. Il existe de nombreuses bibliothèques disponibles pour NTP Client. Vous pouvez installer n'importe lequel d'entre eux à partir de l'IDE Arduino. Dans ce tutoriel, j'ai installé la bibliothèque NTPClient de Taranais car elle est facile à utiliser et dispose de fonctions pour obtenir la date et l'heure des serveurs NTP. ESP8266 NodeMCU peut être facilement programmé en utilisant Arduino IDE.
Pour installer la bibliothèque NTP, téléchargez d'abord la bibliothèque en utilisant le lien ci-dessus, puis installez-la à l'aide de l'IDE Arduino. Pour l'installer, allez dans Sketch> Inclure la bibliothèque> Ajouter une bibliothèque.ZIP , puis ouvrez le dossier Zip en allant à l'emplacement où vous avez téléchargé le dossier zip et redémarrez l'IDE Arduino.
La bibliothèque NTPClient est fournie avec des exemples. Ouvrez Arduino IDE et Goto Exemples> NTPClient> Avancé . Le code donné dans cette esquisse affiche l'heure du serveur NTP sur le moniteur série. Nous utiliserons ce croquis pour afficher l'heure et la date actuelles sur l'écran OLED.
Le code complet est disponible à la fin de ce tutoriel, ici j'ai expliqué quelques parties importantes du code.
La bibliothèque ESP8266WiFi fournit des routines Wi-Fi spécifiques à ESP8266 pour se connecter au réseau. WiFiUDP.h gère l'envoi et la réception de packages UDP. Puisque nous utilisons le protocole SPI pour interfacer OLED avec NodeMCU, nous allons donc importer la bibliothèque «SPI.h». Et «Adafruit_GFX.h» et «Adafruit_SSD1306.h» sont utilisés pour l'affichage OLED.
#comprendre
Notre taille OLED est de 128x64, nous définissons donc la largeur et la hauteur de l'écran sur 128 et 64 respectivement. Définissez donc les variables des broches OLED connectées à NodeMCU pour la communication SPI.
#define SCREEN_WIDTH 128 // Largeur d'affichage OLED, en pixels #define SCREEN_HEIGHT 64 // Hauteur d'affichage OLED, en pixels // Déclaration pour écran SSD1306 connecté à l'aide du logiciel SPI (cas par défaut): #define OLED_MOSI D7 #define OLED_CLK D5 #define OLED_DC D2 #define OLED_CS D8 #define OLED_RESET D3
Affichage Adafruit_SSD1306 (SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
Remplacez «your_ssid» et «your_password» par votre SSID Wi-Fi et votre mot de passe dans les lignes de code ci-dessous.
const char * ssid = "votre_ssid"; const char * password = "votre_mot de passe";
Configurez la connexion WI-Fi en donnant le SSID et le mot de passe à la fonction WiFi.begin . La connexion de l'ESP8266 prend un certain temps pour se connecter à NodeMCU, nous devons donc attendre qu'il soit connecté.
WiFi.begin (ssid, mot de passe); while (WiFi.status ()! = WL_CONNECTED) { délai (500); Serial.print ("."); }
Pour demander la date et l'heure, initialisez le client d'heure avec l'adresse des serveurs NTP. Pour une meilleure précision, choisissez l'adresse des serveurs NTP qui sont proches de votre zone géographique. Ici, nous utilisons « pool.ntp.org » qui donne des serveurs du monde entier. Si vous souhaitez choisir des serveurs d'Asie, vous pouvez utiliser « asia.pool.ntp.org ». timeClient prend également le décalage horaire UTC en millisecondes de votre fuseau horaire. Par exemple, le décalage UTC pour l'Inde est de +5h30, nous convertissons donc ce décalage en millisecondes, ce qui équivaut à 5 * 60 * 60 + 30 * 60 = 19800.
Surface |
Décalage horaire UTC (heures et minutes) |
Décalage de l'heure UTC (secondes) |
INDE |
+5: 30 |
19800 |
LONDRES |
0:00 |
0 |
NEW YORK |
-5: 00 |
-18 000 |
WiFiUDP ntpUDP; NTPClient timeClient (ntpUDP, "pool.ntp.org", 19800,60000);
SSD1306_SWITCHCAPVCC est donné pour générer 3,3V en interne pour initialiser l'affichage. Lorsque l'OLED démarre, il affiche « BIENVENUE AU CIRCUIT DIGEST » avec la taille du texte 2 et la couleur BLEU pendant 3 secondes.
if (! display.begin (SSD1306_SWITCHCAPVCC)) { Serial.println (F ("SSD1306 allocation failed")); pour(;;); // Ne continuez pas, boucle indéfiniment } display.clearDisplay (); display.setTextSize (2); // Dessine du texte à l'échelle 2X display.setTextColor (BLUE); display.setCursor (5, 2); display.println ("BIENVENUE DANS"); display.println ("CIRCUIT"); display.println ("DIGEST"); display.display (); retard (3000);
Le client NTP est initialisé à l'aide de la fonction begin () pour définir la date et l'heure des serveurs NTP.
timeClient.begin ();
La fonction Update () est utilisée pour recevoir la date et l'heure chaque fois que nous demandons aux serveurs NTP.
timeClient.update ();
Le débit en bauds de 115200 est défini pour imprimer l'heure sur le moniteur série.
Serial.begin (115200); Serial.println (timeClient.getFormattedTime ());
getHours (), getMinutes (), getSeconds (), getDay sont la fonction de la bibliothèque et donne l'heure, les minutes, les secondes et le jour actuels du serveur NTP. Le code ci-dessous est utilisé pour différencier l'heure entre AM et PM. Si l'heure que nous obtenons en utilisant getHours () est supérieure à 12, nous définissons cette heure comme PM sinon son AM.
int hh = timeClient.getHours (); int mm = timeClient.getMinutes (); int ss = timeClient.getSeconds (); int jour = timeClient.getDay (); si (hh> 12) { hh = hh-12; display.print (hh); display.print (":"); display.print (mm); display.print (":"); display.print (ss); display.println ("PM"); } else { display.print (hh); display.print (":"); display.print (mm); display.print (":"); display.print (ss); display.println ("AM"); } int jour = timeClient.getDay (); display.println ("'" + arr_days + "'");
getFormattedDate () est utilisé pour obtenir la date au format «aaaa-mm-jj» à partir du serveur NTP. Cette fonction donne la date et l'heure au format «aaaa-mm-jj T hh: mm: ss . Mais nous n'avons besoin que de date, nous devons donc diviser cette chaîne qui est stockée au format date_time jusqu'à «T», ce qui est fait par la fonction substring () , puis stocker la date dans la variable «date» .
date_time = timeClient.getFormattedDate (); int index_date = date_time.indexOf ("T"); String date = date_time.substring (0, index_date); Serial.println (date); display.println (date); display.display ();
Voici à quoi ressemblera enfin l' horloge OLED Internet: