20 Marzo 2020 alle 14:39
#7831

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 3 anni, 6 mesi fa da
Amilcare.
-
Questa risposta è stata modificata 3 anni, 5 mesi fa da
Picmicro675.
-
Questa risposta è stata modificata 3 anni, 5 mesi fa da
Picmicro675.