Использование NTP-сервера является одним из лучших решений для получения точного времени, а использование ESP8266 Nodemcu позволит очень просто создать интернет часы. Текущее время и дата будут выводится на дисплей LCD1602 на базе контроллера HD44780 который работает совместно I2C модулем на базе микросхем PCF8574 который позволяет подключить дисплей к плате ESP8266 NodeMCU всего по двум проводам SDA и SCL (D2 и D1).
Перед тем как приступить к созданию интернет часов необходимо ознакомится со следующими статьями:
- Подключение LCD1602 (2004) к ESP8266 NodeMCU
- wi-fi модуль NodeMcu v3 с чипом ESP8266 (ESP-12e)(Arduino IDE)
Так же Вам понадобятся следующие библиотеки
- ntpclient_master.zip
- LCD-ESP8266-Library.zip
#include <NTPClient.h> #include <ESP8266WiFi.h> #include <WiFiUdp.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей WiFiUDP ntpUDP; ///////////////// https://www.ntppool.org/zone/@ - другие сервера ///////////////////////////// ///////////////// для России - ru.pool.ntp.org ////////////////////////////////////////////////// NTPClient timeClient(ntpUDP, "pool.ntp.org", 21600,3600123);// 21600 - временной сдвиг в секундах от UTC const char *ssid = "Имя_Wi-Fi_сети"; const char *password = "Пароль"; String date_time; unsigned long times; void setup(){ Serial.begin(9600); WiFi.begin(ssid, password); while ( WiFi.status() != WL_CONNECTED ) { delay ( 500 ); Serial.print ( "." ); timeClient.begin();} lcd.init(); lcd.backlight();// Включаем подсветку дисплея } void loop(){ if(millis()-times>=1000){times=millis(); while(!timeClient.update()){timeClient.forceUpdate();} int hh = timeClient.getHours(); int mm = timeClient.getMinutes(); int ss = timeClient.getSeconds(); date_time = timeClient.getFormattedDate(); int index_date = date_time.indexOf("T"); String date = date_time.substring(0, index_date); lcd.setCursor(4,0); lcd.print(hh/10);lcd.print(hh%10);lcd.print(":"); lcd.print(mm/10);lcd.print(mm%10);lcd.print(":"); lcd.print(ss/10);lcd.print(ss%10); lcd.setCursor(3,1); lcd.print(date); }}
Интернет часы на ESP8266 +TM1637
В дополнение к теме статьи привожу пример использования четырех разрядного семи-сегментного индикатора TM1637. На индикатор выводится часы, минуты и мигающее в такт секундам двоеточие.
Для индикатора TM1637 Вам необходимо установить библиотеку — TM1637Display.zip
Для питания индикатора TM1637 можно использовать контакт 3V модуля ESP8266 NodeMCU.
#include <NTPClient.h> #include <ESP8266WiFi.h> #include <WiFiUdp.h> #include <Wire.h> #include <TM1637Display.h> TM1637Display display(D4, D2);// CLK,DIO WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, "pool.ntp.org", 21600,3600123);// 21600 - временной сдвиг в секундах от UTC const char *ssid = "Имя_Wi-Fi_сети"; const char *password = "Пароль"; int times,x; unsigned long t1,t; void setup(){ Serial.begin(9600); WiFi.begin(ssid, password); while ( WiFi.status() != WL_CONNECTED ) { delay(500);Serial.print("."); timeClient.begin();} display.setBrightness(3);// ЯРКОСТЬ } void loop(){ if(millis()-t1>=1000){t1=millis(); while(!timeClient.update()){timeClient.forceUpdate();} int hh = timeClient.getHours(); int mm = timeClient.getMinutes(); // int ss = timeClient.getSeconds(); times=hh*100+mm;} if(millis()-t<500){x=0x00;} if(millis()-t>500){x=0x40;} if(millis()-t>999){t=millis();} display.showNumberDecEx(times,x,true); // вывод информации на индикатор TM1637 }
Интернет часы ESP8266 + TFT SPI 320х240
Для отображения времени интернет часов так же можно использовать TFT-дисплей SPI 320×240 , но не просто выводить время, а сделать имитацию стрелочных часов.
Для нормальной загрузки скетча Вам понадобится дополнительная библиотека — New_UTFT.zip
#include <NTPClient.h> #include <ESP8266WiFi.h> #include <WiFiUdp.h> #include <UTFT.h> #include <SPI.h> WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, "pool.ntp.org", 21600,3600123); extern uint8_t BigFont[],SmallFont[]; UTFT myGLCD ( ILI9341_S5P, 13, 14, 15, 0, 12 );//SDI (MOSI), SCK, CS, RESET, DC == D7 D5 D8 D3 D6 const char *ssid = "Имя_Wi-Fi_сети"; const char *password = "Пароль"; String date_time; float sx,sy,osx,osy,mx,my,omx,omy,hx,hy,ohx,ohy; unsigned long times; void setup(){ Serial.begin(9600); WiFi.mode(WIFI_STA);WiFi.begin(ssid, password); while ( WiFi.status() != WL_CONNECTED ) { delay(500);Serial.print("."); timeClient.begin();} myGLCD.InitLCD(0);myGLCD.fillRect(0,0,320,240);myGLCD.setFont(BigFont);myGLCD.clrScr(); // первоначальные настройки экрана myGLCD.fillScr(0x0000);myGLCD.setColor(0xffff);myGLCD.setBackColor(0x0000); for(int i=0;i<360;i+=30){ sx=cos((i-90)*0.0174532925); sy=sin((i-90)*0.0174532925); myGLCD.drawLine(sx*120+120,sy*120+120,sx*110+120,sy*110+120);} for(int i=0;i<360;i+=6){ sx=cos((i-90)*0.0174532925); sy=sin((i-90)*0.0174532925); myGLCD.drawPixel(sx*115+120,sy*115+120);} } void loop(){ if(millis()-times>=1000){times=millis(); while(!timeClient.update()){timeClient.forceUpdate();} int hh = timeClient.getHours(); int mm = timeClient.getMinutes(); int ss = timeClient.getSeconds(); date_time = timeClient.getFormattedDate(); int index_date = date_time.indexOf("T"); String date = date_time.substring(0, index_date); hx=cos(((hh*30+mm*6*0.08333333)-90)*0.0174532925); hy=sin(((hh*30+mm*6*0.08333333)-90)*0.0174532925); mx=cos(((mm*6+ss*6*0.01666667)-90)*0.0174532925); my=sin(((mm*6+ss*6*0.01666667)-90)*0.0174532925); sx=cos((ss*6-90)*0.0174532925); sy=sin((ss*6-90)*0.0174532925); myGLCD.setColor(0x0000);// clear myGLCD.drawLine(osx,osy,120,120); myGLCD.drawLine(omx,omy,120,120); myGLCD.drawLine(ohx,ohy,120,120); myGLCD.setColor(0xffff); myGLCD.print("12",104,0); myGLCD.print("6",112,225); myGLCD.print("9",0,112); myGLCD.print("3",224,112); ohx = hx*70+120; ohy = hy*70+120; omx = mx*100+120; omy = my*100+120; osx = sx*110+120; osy = sy*110+120; myGLCD.setColor(0xf000); myGLCD.drawLine(osx,osy,120,120); myGLCD.setColor(0xffff); myGLCD.drawLine(omx,omy,120,120); myGLCD.setColor(0xfff5); myGLCD.drawLine(ohx,ohy,120,120); myGLCD.setColor(0xf000); myGLCD.fillCircle(120,120,4); myGLCD.setColor(0xffff); /////////////////////////////////////////////////////// myGLCD.print(timeClient.getFormattedTime(),60,275); myGLCD.print(date,45,295); } }//loop
В заголовке статьи перепутаны цифры после ESP.
Исправлено.
Спс автор заработало!!! Я подключил дисплей к Vin без перемычки. Я использовал в программе NTP Client NTPClient timeClient(ntpUDP, «ua.pool.ntp.org», 7200,60000); Спасибо еще раз 🙂
Лучше поменять:
NTPClient timeClient(ntpUDP, «ua.pool.ntp.org», 7200,60000);
на
NTPClient timeClient(ntpUDP, «ua.pool.ntp.org», 7200,3600123); // коррекция раз в час и 123 мс
При коррекции времени опрос идет только для секунд, часы могут начать отставать по минутам. Лучше чтобы коррекция происходила когда нет перехода с одной минуты на другую.
вылезла такая ошибка
Arduino: 1.8.13 (Windows 7), Плата:»NodeMCU 0.9 (ESP-12 Module), 80 MHz, Flash, Legacy (new can return nullptr), All SSL ciphers (most compatible), 4MB (FS:2MB OTA:~1019KB), v2 Lower Memory, Disabled, None, Only Sketch, 115200″
ПРЕДУПРЕЖДЕНИЕ: библиотека LiquidCrystal_I2C-master должна запускаться на архитектурах avr и может быть несовместима с вашей платой на архитектуре esp8266.
C:\Users\З\Documents\displey\CheckFlashConfig\CheckFlashConfig.ino: In function ‘void loop()’:
CheckFlashConfig:33:26: error: ‘class NTPClient’ has no member named ‘getFormattedDate’
exit status 1
‘class NTPClient’ has no member named ‘getFormattedDate’
Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
«Показать подробный вывод во время компиляции»
Вы установили библиотеку — http://rcl-radio.ru/wp-content/uploads/2019/11/I2C-LCD-ESP8266-Library.zip
Подскажите пожалуйста. Собрал двое часов на TM1637, одни работают в городе, проблем нет.Вторые в деревне, интернет через 3G модем. И вот тут часы периодически получают время на час меньше. Минуты верно. Причем периодичность может быть 2 раза в день, а может раз в два дня. Не пойму с чем связано. Подскажите пожалуйста.
Через мобильный интернет подключение к интернет может быть из сети соседнего региона.
А при чем здесь соседний регион? В деревне стоит только одна вышка единственного оператора на ближайшие 20 км.
Я живу в Омске, раздаю интернет с телефона на ноутбук, на ноутбуке бывает часто время и IP адрес Новосибирска.
И как можно решить такую проблему?
Надо запретить обновлять время часов (HH) когда час не Ваш. Какой скетч используете? Я посмотрю что можно сделать.
#include
#include
#include
#include
#include
#include
TM1637Display display(2,0);// CLK,DIO для ESP-01
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, «pool.ntp.org», 10800,3600123);// 10800 — временной сдвиг в секундах от UTC
const char *ssid = «*****»;
const char *password = «********»;
int times,x;
unsigned long t1,t;
void setup(){
Serial.begin(9600);
WiFi.begin(ssid, password);
while ( WiFi.status() != WL_CONNECTED ) {
delay(500);Serial.print(«.»);
timeClient.begin();}
display.setBrightness(1);// ЯРКОСТЬ
}
void loop(){
if(millis()-t1>=1000){t1=millis();
while(!timeClient.update()){timeClient.forceUpdate();}
int hh = timeClient.getHours();
int mm = timeClient.getMinutes();
// int ss = timeClient.getSeconds();
times=hh*100+mm;}
if(millis()-t500){x=0x40;}
if(millis()-t>999){t=millis();}
display.showNumberDecEx(times,x,true); // вывод информации на индикатор TM1637
}
Самое простоя что могу предложить, это выставлять часы (НН), только один раз при включении, минуты будут синхронизироваться с интернетом — http://forum.rcl-radio.ru/viewtopic.php?pid=2794#p2794
Спасибо. Попробую. Отпишусь что получилось.
С этой пошивкой при переходе на новый час, минуты обновляются, а часы остаются. То есть, включили я их в 11:40, в 12:10 они будут показывать 11:10 и так далее.
Я обновил скетч на форуме, сменил сервер точного времени.
В том скетче который я выкладывал выше изменил строку с сервером: NTPClient timeClient(ntpUDP, «europe.pool.ntp.org», 10800,3601234).
Не помогло. спустя пару часов снова на час назад перевелись.
Измените время опроса
поменяйте 3601234
на 3610000 (1 час 10 секунд)
#include
#include
#include
#include
#include
#include
TM1637Display display(2,0);// CLK,DIO для ESP-01
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, «pool.ntp.org», 10800,3600123);// 10800 — временной сдвиг в секундах от UTC
const char *ssid = «La52»;
const char *password = «Lashmanov»;
int times,x;
unsigned long t1,t;
void setup(){
Serial.begin(9600);
WiFi.begin(ssid, password);
while ( WiFi.status() != WL_CONNECTED ) {
delay(500);Serial.print(«.»);
timeClient.begin();}
display.setBrightness(1);// ЯРКОСТЬ
}
void loop(){
if(millis()-t1>=1000){t1=millis();
while(!timeClient.update()){timeClient.forceUpdate();}
int hh = timeClient.getHours();
int mm = timeClient.getMinutes();
// int ss = timeClient.getSeconds();
times=hh*100+mm;}
if(millis()-t500){x=0x40;}
if(millis()-t>999){t=millis();}
display.showNumberDecEx(times,x,true); // вывод информации на индикатор TM1637
}
и часовой пояс на ближайшие 1000 км один и то же. Почему на час меньше?
Здравствуйте.Если тема еще жива ,то вот такая ошибка,чего оно хочет? Пробовал все скетчи,одна и та же ошибка.
В шапке сайта, переключите автоматический перевод на русский и скопируйте скетч.
Здравствуйте! Сегодня произошла «беда» — переделывал скетч под свои нужды, всё было норм пока не обновилась библиотека «NTPClient.h», я сначала подумал что сам что-то нахимичил пока не догадался сравнить старую и новую библиотеки, в общем после обновления часы не идут да и при компиляции ругается на — «date_time = timeClient.getFormattedDate();» — типа нет такого в библиотеке.
В менеджере библиотек в библиотеке NTPClient выберите более старую версию.
Скриншот