Интернет часы ESP8266 + LCD1602_I2C

Использование NTP-сервера является одним из лучших решений для получения точного времени, а использование ESP8266 Nodemcu позволит очень просто создать интернет часы. Текущее время и дата будут выводится на дисплей LCD1602 на базе контроллера HD44780 который работает совместно I2C модулем на базе микросхем PCF8574 который позволяет подключить дисплей к плате ESP8266 NodeMCU всего по двум проводам SDA и SCL (D2 и D1).

Перед тем как приступить к созданию интернет часов необходимо ознакомится со следующими статьями:

Так же Вам  понадобятся следующие библиотеки

#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


Форумы:

Comments

  1. Спс автор заработало!!! Я подключил дисплей к Vin без перемычки. Я использовал в программе NTP Client NTPClient timeClient(ntpUDP, «ua.pool.ntp.org», 7200,60000); Спасибо еще раз 🙂

    1. Лучше поменять:
      NTPClient timeClient(ntpUDP, «ua.pool.ntp.org», 7200,60000);
      на
      NTPClient timeClient(ntpUDP, «ua.pool.ntp.org», 7200,3600123); // коррекция раз в час и 123 мс
      При коррекции времени опрос идет только для секунд, часы могут начать отставать по минутам. Лучше чтобы коррекция происходила когда нет перехода с одной минуты на другую.

  2. вылезла такая ошибка

    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’

    Этот отчёт будет иметь больше информации с
    включенной опцией Файл -> Настройки ->
    «Показать подробный вывод во время компиляции»

  3. Подскажите пожалуйста. Собрал двое часов на TM1637, одни работают в городе, проблем нет.Вторые в деревне, интернет через 3G модем. И вот тут часы периодически получают время на час меньше. Минуты верно. Причем периодичность может быть 2 раза в день, а может раз в два дня. Не пойму с чем связано. Подскажите пожалуйста.

      1. #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
        }

      2. #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
        }

Добавить комментарий

Войти с помощью: