Skip to content

Instantly share code, notes, and snippets.

@kenci
Last active January 23, 2023 13:38
Show Gist options
  • Select an option

  • Save kenci/7eb9b60bf97e46077a0e to your computer and use it in GitHub Desktop.

Select an option

Save kenci/7eb9b60bf97e46077a0e to your computer and use it in GitHub Desktop.
ESP8266 NTP Timeserver with Alarms
/*
* alarmsystem.ino
*
* This sketch uses the ESP8266WiFi library
*/
#include <TimeLib.h>
#include <Time.h>
#include <TimeAlarms.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
const char ssid[] = "SSID"; // your network SSID (name)
const char pass[] = "PASSWORD"; // your network password
// NTP Servers:
//IPAddress timeServer(132, 163, 4, 101); // time-a.timefreq.bldrdoc.gov
IPAddress timeServer(91, 206, 8, 36); // 0.at.pool.ntp.org
// IPAddress timeServer(132, 163, 4, 102); // time-b.timefreq.bldrdoc.gov
// IPAddress timeServer(132, 163, 4, 103); // time-c.timefreq.bldrdoc.gov
const int timeZone = 1; // Central European Time
//const int timeZone = -5; // Eastern Standard Time (USA)
//const int timeZone = -4; // Eastern Daylight Time (USA)
//const int timeZone = -8; // Pacific Standard Time (USA)
//const int timeZone = -7; // Pacific Daylight Time (USA)
#define ALARM_ON_PIN 12
#define ALARM_OFF_PIN 12
WiFiUDP Udp;
unsigned int localPort = 8888; // local port to listen for UDP packets
void setup()
{
Serial.begin(9600);
pinMode(ALARM_ON_PIN, OUTPUT);
pinMode(ALARM_OFF_PIN, OUTPUT);
while (!Serial) ; // Needed for Leonardo only
delay(250);
UpdateNTP();
Serial.println("Setting Alarms...");
Alarm.alarmRepeat(22,1,0, AlarmON); // every day at 22:00
Alarm.alarmRepeat(8,0,0, AlarmOFF); // every day at 08:00
Alarm.alarmRepeat(0,0,1, UpdateNTP);
//Alarm.timerRepeat(5, AlarmON); //test
}
time_t prevDisplay = 0; // when the digital clock was displayed
void loop()
{
if (timeStatus() != timeNotSet) {
if (now() != prevDisplay) { // update the display only if time has changed
prevDisplay = now();
digitalClockDisplay();
Alarm.delay(1000);
}
}
}
void pressButton(byte pin) {
digitalWrite(pin, HIGH);
delay(500);
digitalWrite(pin, LOW);
}
// functions to be called when an alarm triggers:
void AlarmON(){
pressButton(ALARM_ON_PIN);
}
void AlarmOFF(){
pressButton(ALARM_OFF_PIN);
}
void UpdateNTP() {
Serial.println("TimeNTP Example");
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.print("IP number assigned by DHCP is ");
Serial.println(WiFi.localIP());
Serial.println("Starting UDP");
Udp.begin(localPort);
Serial.print("Local port: ");
Serial.println(Udp.localPort());
Serial.println("waiting for sync");
setSyncProvider(getNtpTime);
}
void digitalClockDisplay(){
// digital clock display of the time
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.print(" ");
Serial.print(day());
Serial.print(".");
Serial.print(month());
Serial.print(".");
Serial.print(year());
Serial.println();
}
void printDigits(int digits){
// utility for digital clock display: prints preceding colon and leading 0
Serial.print(":");
if(digits < 10)
Serial.print('0');
Serial.print(digits);
}
/*-------- NTP code ----------*/
const int NTP_PACKET_SIZE = 48; // NTP time is in the first 48 bytes of message
byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming & outgoing packets
time_t getNtpTime()
{
while (Udp.parsePacket() > 0) ; // discard any previously received packets
Serial.println("Transmit NTP Request");
sendNTPpacket(timeServer);
uint32_t beginWait = millis();
while (millis() - beginWait < 1500) {
int size = Udp.parsePacket();
if (size >= NTP_PACKET_SIZE) {
Serial.println("Receive NTP Response");
Udp.read(packetBuffer, NTP_PACKET_SIZE); // read packet into the buffer
unsigned long secsSince1900;
// convert four bytes starting at location 40 to a long integer
secsSince1900 = (unsigned long)packetBuffer[40] << 24;
secsSince1900 |= (unsigned long)packetBuffer[41] << 16;
secsSince1900 |= (unsigned long)packetBuffer[42] << 8;
secsSince1900 |= (unsigned long)packetBuffer[43];
return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;
}
}
Serial.println("No NTP Response :-(");
return 0; // return 0 if unable to get the time
}
// send an NTP request to the time server at the given address
void sendNTPpacket(IPAddress &address)
{
// set all bytes in the buffer to 0
memset(packetBuffer, 0, NTP_PACKET_SIZE);
// Initialize values needed to form NTP request
// (see URL above for details on the packets)
packetBuffer[0] = 0b11100011; // LI, Version, Mode
packetBuffer[1] = 0; // Stratum, or type of clock
packetBuffer[2] = 6; // Polling Interval
packetBuffer[3] = 0xEC; // Peer Clock Precision
// 8 bytes of zero for Root Delay & Root Dispersion
packetBuffer[12] = 49;
packetBuffer[13] = 0x4E;
packetBuffer[14] = 49;
packetBuffer[15] = 52;
// all NTP fields have been given values, now
// you can send a packet requesting a timestamp:
Udp.beginPacket(address, 123); //NTP requests are to port 123
Udp.write(packetBuffer, NTP_PACKET_SIZE);
Udp.endPacket();
}
@jmartens2
Copy link

hi im having a bit of trouble using this code. when it comes to alarm.alarmrepeat on the output turns on for a half second then turns off.
the same with turning off. i hope ive asked the question correctly. im a noob to your work. thank you for your time.

@jmartens2
Copy link

I think I’ve worked it out. It’s in the the way the push button function was written.

@kenci
Copy link
Author

kenci commented Jan 10, 2020

glad to hear. i made an v2 of this but it is using atmega328p instead of esp8266 so you dont need any network connections anymore. it also calculate daylight saving times and adapt it automatically.

maybe you could adapt this one to esp8266 if you dont own any arduino nano/uno/pro micro.

https://gist.github.com/kenci/8187bc0127d77b271ca4a736992c7eb7

@jmartens2
Copy link

jmartens2 commented Jan 11, 2020 via email

@kenci
Copy link
Author

kenci commented Jan 11, 2020 via email

@jmartens2
Copy link

jmartens2 commented Jan 11, 2020 via email

@jmartens2
Copy link

hi sorry to bother you again but i see a mention of a digitalclock, where can i get the information on how you displayed a clock and on what?
thank you

@kenci
Copy link
Author

kenci commented Jan 12, 2020 via email

@ZachreyNM
Copy link

ZachreyNM commented Oct 11, 2020

Hallel Yah!!! OMG!!! Tears of JOY!!! It works! It works!! We have been beating our heads against the wall for over a week trying to get a relay to turn on and off at a specified network time!!!!!!!!!

@demoking23
Copy link

can plz tell what are the change needed for india time zone IST in the zone

@jmartens2
Copy link

jmartens2 commented Jan 23, 2023 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment