Étape 6: Ajout de l’écran LCD
Écran LCD Arduino UNO
SCL A5
SDA A4
VCC + 5v
GND Gnd
Le code précédent de NTP avec les ajouts de LCD sont ci-dessous :
exemple de code est née à http://www.openreefs.com/ntpServer
modifié par Steve Spence, http://arduinotronics.blogspot.com
#include < SPI.h >
#include < Ethernet.h >
#include < EthernetUdp.h >
#include < Time.h >
#include < Wire.h >
#include < LCD.h >
#include < LiquidCrystal_I2C.h >
Paramètres de l’écran LCD
#define I2C_ADDR 0x3F / / <<---ajoutez votre adresse ici. Trouver de Scanner I2C
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin) ;
/ * *** Paramètres carte Ethernet *** * /
Cela défini sur votre Mac adresse de la carte Ethernet
la mac de Byte [] = {0x90, 0xA2, 0xDA, 0 x 00, 0 x 23, 0 x 36} ;
/ * *** Les paramètres du serveur NTP *** * /
/ * us.pool.ntp.org le serveur NTP
(Définie sur votre serveur de temps de choix) * /
Adresse IP serveur temporel (216, 23, 247, 62) ;
/ * Mettre sur le décalage (en secondes) à votre heure locale
Cet exemple est GMT - 4 * /
const long timeZoneOffset =-14400 L ;
/ * Synchronisation au serveur NTP toutes les 15 secondes pour le test,
1 heure ou plus pour être raisonnable la valeur * /
unsigned int ntpSyncTime = 3600 ;
/ * MODIFIER CES VARIABLES À VOS PROPRES RISQUES * /
port local pour écouter les paquets UDP
unsigned int localPort = 8888 ;
Horodatage NTP est dans les 48 premiers octets du message
const int NTP_PACKET_SIZE = 48 ;
Tampon pour maintenir les paquets entrants et sortants
packetBuffer Byte [NTP_PACKET_SIZE] ;
Une instance UDP pour nous faire envoyer et recevoir des paquets UDP
EthernetUDP Udp ;
Assure le suivi des depuis combien de temps nous avons mis à jour le serveur NTP
unsigned long ntpLastUpdate = 0 ;
Vérifier la dernière horloge affichée (pas en Production)
time_t prevDisplay = 0 ;
void setup() {}
LCD.Begin (16,2) ;
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE) ;
lcd.setBacklight(HIGH) ;
Serial.Begin(9600) ;
Bouclier Ethernet et configuration NTP
int i = 0 ;
int DHCP = 0 ;
DHCP = Ethernet.begin(mac) ;
Essayez d’obtenir les paramètres dhcp 30 fois avant d’abandonner
tandis que (DHCP == 0 & & j’ai < 30) {}
Delay(1000) ;
DHCP = Ethernet.begin(mac) ;
i ++ ;
}
if (!. DHCP) {}
Serial.println ("DHCP a échoué") ;
for(;;) ; //Infinite boucle car DHCP a échoué
}
Serial.println ("DHCP succès") ;
Essayez d’obtenir la date et l’heure
trys int = 0 ;
while(!getTimeAndDate() & & trys < 10) {}
trys ++ ;
}
}
Ne modifiez pas cette fonction, il est utilisé par le système
int getTimeAndDate() {}
drapeau de l’int = 0 ;
UDP.Begin(localPort) ;
sendNTPpacket(timeServer) ;
Delay(1000) ;
Si (Udp.parsePacket()) {}
UDP.Read(packetBuffer,NTP_PACKET_SIZE) ; lire le paquet dans la mémoire tampon
unsigned long highWord, lowWord, époque ;
highWord = mot (packetBuffer [40], packetBuffer[41]) ;
lowWord = mot (packetBuffer [42], packetBuffer[43]) ;
EPOCH = highWord << 16 | lowWord ;
EPOCH = époque - 2208988800 + timeZoneOffset ;
drapeau = 1 ;
setTime(epoch) ;
ntpLastUpdate = now() ;
}
retour de drapeau ;
}
Ne modifiez pas cette fonction, il est utilisé par le système
sendNTPpacket long non signé (IPAddress & adresse)
{
memset (packetBuffer, 0, NTP_PACKET_SIZE) ;
packetBuffer [0] = 0b11100011 ;
packetBuffer [1] = 0 ;
packetBuffer [2] = 6 ;
packetBuffer [3] = 0xEC ;
packetBuffer [12] = 49 ;
packetBuffer [13] = 0x4E ;
packetBuffer [14] = 49 ;
packetBuffer [15] = 52 ;
Udp.beginPacket (adresse, 123) ;
UDP.Write(packetBuffer,NTP_PACKET_SIZE) ;
Udp.endPacket() ;
}
Affichage de l’heure de l’heure et la date (base)
void clockDisplay() {}
Serial.Print(Hour()) ;
printDigits(minute()) ;
printDigits(second()) ;
Serial.Print("") ;
Serial.Print(Day()) ;
Serial.Print("") ;
Serial.Print(month()) ;
Serial.Print("") ;
Serial.Print(Year()) ;
Serial.println() ;
lcd.setCursor (0,0) ;
Si (heure() < 10) {}
LCD.Print("0") ; }
Si {(heure() > 12)
LCD.Print("0") ;
LCD.Print(Hour()-12) ; } else {}
LCD.Print(Hour()) ; }
LCD.Print(":") ;
Si (minute() < 10) {}
LCD.Print("0") ; }
LCD.Print(minute()) ;
LCD.Print(":") ;
Si (second() < 10) {}
LCD.Print("0") ; }
LCD.Print(second()) ;
Si {(heure() > 12)
LCD.Print ("PM") ; }
else {}
LCD.Print ("AM") ; }
lcd.setCursor (0,1) ;
Si {(month() < 10)
LCD.Print("0") ; }
LCD.Print(month()) ;
LCD.Print("/") ;
Si (day() < 10) {}
LCD.Print("0") ; }
LCD.Print(Day()) ;
LCD.Print("/") ;
LCD.Print(Year()) ;
}
Fonction utilitaire d’affichage de l’horloge : tirages précédents du côlon et menant 0
void printDigits (int chiffres) {}
Serial.Print(":") ;
if(digits < 10)
Serial.Print('0') ;
Serial.Print(digits) ;
}
C’est là toute la magie opère...
void loop() {}
Mettre à jour l’heure via un serveur NTP aussi souvent que le délai défini au sommet
Si (maintenant ()-ntpLastUpdate > ntpSyncTime) {}
trys int = 0 ;
while(!getTimeAndDate() & & trys < 10) {}
trys ++ ;
}
if(trys<10) {}
Serial.println ("ntp serveur mise à jour succès") ;
}
else {}
Serial.println ("ntp serveur mise à jour a échoué") ;
}
}
Afficher l’heure si elle a changé de plus d’une seconde.
Si (maintenant()! = prevDisplay) {}
prevDisplay = now() ;
clockDisplay() ;
}
}