Arduino Internet tid klienten (6 / 10 steg)
Steg 6: Lägga till LCD-skärmen
LCD-Arduino UNO
SCL A5
SDA A4
VCC + 5v
GND Gnd
NTP koden med LCD tillägg är nedan:
exempelkod påbörjade på http://www.openreefs.com/ntpServer
ändrat av 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 >
LCD-inställningar
#define I2C_ADDR 0x3F / / <<---lägga till din adress här. Hitta det från I2C Scanner
#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);
/ * *** Kort Ethernetinställningar *** * /
Ange detta till din Mac-adress Ethernet-kort
byte [mac] = {0x90, 0xA2, 0xDA, 0x00, 0x23, 0x36};
/ * *** NTP serverinställningar *** * /
/ * us.pool.ntp.org NTP-server
(Inställt på din tidsserver val) * /
IP-adress timeServer (216, 23, 247, 62);
/ * Anger detta till offset (i sekunder) till din lokala tid
Detta exempel är GMT - 4 * /
CONST long timeZoneOffset =-14400 L.
/ * Synkroniseras till NTP-server var 15 sekund för provning,
1 timme eller mer rimlig * /
unsigned int ntpSyncTime = 3600;
/ * ÄNDRA DESSA VARIABLER PÅ EGEN RISK * /
lokal port att lyssna till UDP-paket
unsigned int localPort = 8888;
NTP tidsstämpel är i de första 48 byte av meddelandet
CONST int NTP_PACKET_SIZE = 48.
Buffert för att hålla inkommande och utgående paket
byte packetBuffer [NTP_PACKET_SIZE];
En UDP-instans att låta oss skicka och ta emot paket över UDP
EthernetUDP Udp;
Håller reda på hur länge sedan vi uppdaterade NTP-server
osignerade långa ntpLastUpdate = 0;
Kolla senaste klocka (inte visas i produktion)
tid prevDisplay = 0;
void setup() {
LCD.BEGIN (16,2);
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
lcd.setBacklight(HIGH);
Serial.BEGIN(9600);
Ethernet-shield och NTP setup
int jag = 0;
int DHCP = 0;
DHCP = Ethernet.begin(mac);
Försöka få DHCP-inställningar 30 gånger innan den ger upp
medan (DHCP == 0 & & jag < 30) {
Delay(1000);
DHCP = Ethernet.begin(mac);
i ++;
}
IF (!. DHCP) {
Serial.println ("DHCP misslyckades");
for(;;); //Infinite loop eftersom DHCP misslyckades
}
Serial.println ("DHCP-framgång");
Försöka få datum och tid
int trys = 0;
While(!getTimeAndDate() & & trys < 10) {
trys ++;
}
}
Ändrar inte denna funktion, det används av systemet
int getTimeAndDate() {
int flagga = 0;
UDP.BEGIN(localPort);
sendNTPpacket(timeServer);
Delay(1000);
om (Udp.parsePacket()) {
UDP.Read(packetBuffer,NTP_PACKET_SIZE); läsa in paket i bufferten
osignerade långa highWord, lowWord, epoken;
highWord = word (packetBuffer [40], packetBuffer[41]);
lowWord = word (packetBuffer [42], packetBuffer[43]);
epoken = highWord << 16 | lowWord;
epoken = epok - 2208988800 + timeZoneOffset;
Flagga = 1;
setTime(epoch);
ntpLastUpdate = now();
}
returnera flagg.
}
Ändrar inte denna funktion, det används av systemet
osignerade långa sendNTPpacket (IP-adress och adress)
{
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 (adress, 123);
UDP.write(packetBuffer,NTP_PACKET_SIZE);
Udp.endPacket();
}
Klockan visning av tid och datum (Basic)
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);
om (hour() < 10) {
LCD.Print("0"); }
om (hour() > 12) {
LCD.Print("0");
LCD.Print(Hour()-12); } annat {
LCD.Print(Hour()); }
LCD.Print(":");
om (minute() < 10) {
LCD.Print("0"); }
LCD.Print(Minute());
LCD.Print(":");
om (second() < 10) {
LCD.Print("0"); }
LCD.Print(Second());
om (hour() > 12) {
LCD.Print ("PM"); }
annat {
LCD.Print ("AM"); }
lcd.setCursor (0,1);
om (month() < 10) {
LCD.Print("0"); }
LCD.Print(Month());
LCD.Print("/");
om (day() < 10) {
LCD.Print("0"); }
LCD.Print(Day());
LCD.Print("/");
LCD.Print(Year());
}
Utility funktion för klockdisplay: utskrifter före kolon och ledande 0
void printDigits (int siffror) {
Serial.Print(":");
IF(digits < 10)
Serial.Print('0');
Serial.Print(digits);
}
Detta är där alla magiska händer...
void loop() {
Uppdatera tiden via NTP-server så ofta som den tid som du överst
om (nu ()-ntpLastUpdate > ntpSyncTime) {
int trys = 0;
While(!getTimeAndDate() & & trys < 10) {
trys ++;
}
IF(trys<10) {
Serial.println ("ntp server update framgång");
}
annat {
Serial.println ("ntp server uppdatera misslyckades");
}
}
Visa tid om det har ändrats av mer än en sekund.
om (now()! = prevDisplay) {
prevDisplay = now();
clockDisplay();
}
}