#7831
Amilcare
Amministratore del forum
/*------------------------------------------------------------------
  Settembre 2019: Network Clock
                  Orologio con display LCD i2c
                  Modulo ESP8266_01
  I valori della data e dell'ora vengono gestiti dal server NTP
  e emessi su LCD i2c
  Le connessioni SDA/SCL sono possibili anche su ESP8266 definendo
  i pin direttamente nella funzione begin
  
  Vedi anche ESP8266_CON_DS1307 per la gestione wire
  Vedi anche ESP32_NTClient.ino
 
  La scelta Ora_Solare/Legale deve essere configurata in base
  ad un ponticello sui GPIO disponibili e non utilizzati a 
  RUN_TIME

  Ver: 1.0 15 Settembre 2019

  Ver: 2.0 17/9/19
       Upgrading:
       .Utilizzo della wait_serial per abilitare il debug su HT
       .Miglioramenti visivi su LCD
       .Verifica Data con precedente lettura per evitare display
        continui per la stessa data
       .inserimento del giorno della settimana a fianco data
          
        29/9/19:
        Si scopre che nonostante la connesisone WiFi NON SIA 
        connessa, il sistema funziona ugualmente. L'indirizzo
        fornito 192.168.1.110 viene rilevato come attivo.
        Quindi si puo' presumere che la libreria NTP esegua
        l'accesso al WiFi. Ma che fornisce l'accesso ?

  ATTENZIONE: quando il sistema vuole aggiornare le librerie 
              verificare che NON VENGA AGGIORNATA la libreria
              NTPCLIENT: mantenere quella di Random_Nerd

  2/10/19: Versione 2: La connessione WiFi va rifatta sempre con
           un chip nuovo. Pare che dopo la prima connessione
           non occorra rifarla.             
-------------------------------------------------------------------*/

#include <ESP8266WiFi.h>              // Gestione WiFi
#include <Wire.h>                     // Protocollo Wire
#include <NTPClient.h>                // Lib NTP_Client
#include <WiFiUdp.h>                  // Lib UDP
#include <LiquidCrystal_I2C.h>        // Lib per LCD 
                                     
WiFiUDP ntpUDP;                       // Define NTPClient to get time
NTPClient timeClient(ntpUDP);

#define LCDI2C_ADDR 0x27              // Adr of LCD_I2C
#define LCDTYPE_16;                   // Lcd 16x2

LiquidCrystal_I2C MyLcd(LCDI2C_ADDR,16,2);

int Pin_SDA = 0;                      // Definisce i pin SCL/SDA
int Pin_SCL = 2;

const char* ssid = "router";          // Per la connessione Internet 
const char* password = "password";

String Pre_Date;
String formattedDate;                 // Variabili per data e tempo  
String dayStamp;
String timeStamp;

char dayWeek [7][6] = {"DOM", "LUN", "MAR", "MER", "GIO", "VEN", "SAB"};

bool DEBUG;

//-----------------------------------------------------------------------
// Funzione da utilizzare a regime
 
boolean wait_Serial (int time_out)
{
  unsigned long tm_out = time_out;                           //Normalizza il valore
  unsigned long tm_act = (millis() /1000) + tm_out;          //recupera il tempo attuale
  Serial.print("Press any key for: ");                   // messaggio
  Serial.print(time_out);                                     
  Serial.print(" secondi:");
  while (true)                                               // loop infinito
   {
     if (Serial.available() > 0)                             // input da seriale ??
      { 
        int cr = Serial.read();
        Serial.flush(); 
        return true; 
      }
     if ( millis() /1000  > tm_act)
      { 
        Serial.flush();
        return false; 
      }
   } 
}   
//------------------------------------------------------------------
void setup()
{ 
  Serial.begin(115200);                 // Start serial at 115200
  Serial.write(12);                     // clear area

  DEBUG = wait_Serial(3);            // Se vero ok su HT
  if (DEBUG == true) Serial.println("OK.");
       
  Wire.begin(Pin_SDA,Pin_SCL);          // Init protocol   
  MyLcd.init();                         // Init LCD 
  MyLcd.begin(16,2);                    // settaggio righe e colonne
  MyLcd.clear();          
  MyLcd.backlight();
  MyLcd.setCursor(4,0);                 // colonna 3 riga 0   
  MyLcd.print("NTP CLOCK");
  delay(2000);                          // ritardo per persistenza
  
  MyLcd.clear();                       // Clear lcd
  MyLcd.setCursor(0,0);                // Cursore c=0, r=0
  MyLcd.print("WF: ");                // Scrive ssid 
  MyLcd.print(ssid);
  
  MyLcd.setCursor(0,1);                // su riga 2  
  WiFi.begin(ssid,password);
  while (WiFi.status() != WL_CONNECTED) 
   { 
    delay(500); 
    MyLcd.print("."); 
   }

  MyLcd.setCursor(0,0);              
  MyLcd.print("WiFi connected"); 
  MyLcd.setCursor(0,1);
  MyLcd.print(WiFi.localIP());
  delay(2000);

  // Initialize a NTPClient to get time
  timeClient.begin();
  timeClient.setTimeOffset(3600);           // per ora solare
  //timeClient.setTimeOffset(7200);             // per ora legale 

  MyLcd.clear();
  MyLcd.setCursor(0,0);
  Pre_Date = "";

}

// LOOP: Gestione della data e dell'ora

void loop()
{
  while(!timeClient.update()) 
   { timeClient.forceUpdate(); }
  
  formattedDate = timeClient.getFormattedDate();
  int splitT = formattedDate.indexOf("T");
  dayStamp = formattedDate.substring(0, splitT);
  timeStamp = formattedDate.substring(splitT+1, formattedDate.length()-1);

  if (DEBUG == true)
   {
     Serial.println(formattedDate);
     Serial.print(dayWeek[timeClient.getDay()]);
     Serial.print(" "); 
     Serial.print(dayStamp);
     Serial.print(" ");
     Serial.println(timeStamp);
   }
  
   if (Pre_Date != dayStamp)              // 17/9/19: evita ripetizioni
    {
      Pre_Date = dayStamp;
      MyLcd.setCursor(1,0);
      MyLcd.print(dayStamp);
      MyLcd.print(" ");
      MyLcd.print(dayWeek[timeClient.getDay()]);    
    } 
   MyLcd.setCursor(4,1);
   MyLcd.print(timeStamp);
 
  delay(1000); 
}

Altro non riesco a fare da cellulare visto che fino a mercoledì non ho internet sul fisso

  • Questa risposta è stata modificata 6 mesi, 2 settimane fa da Amilcare.
  • Questa risposta è stata modificata 5 mesi, 3 settimane fa da Picmicro675Picmicro675.
  • Questa risposta è stata modificata 5 mesi, 3 settimane fa da Picmicro675Picmicro675.