come posso fare per visualizzare su display la stessa ora che stampo su seriale??
grazie!!
/**************************************************************************
*
* WiFi Internet clock (NTP) with ESP8266 NodeMCU (ESP-12E) board and
* ST7735 TFT display.
* This is a free software with NO WARRANTY.
* https://simple-circuit.com/
* by Renzo Mischianti <www.mischianti.org>
* modificato in data 31 marzo 2021 con aggiunta libreria Timezone
* lettura regole da file Renzo Mischianti by Aldo
* IMPOSTARE COME SCHEDA NODEMCU 1.0 (ESP12E MODULE)..NOVEMBRE 2021
*************************************************************************/
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <NTPClient.h>
#include <TimeLib.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h> // include Adafruit ST7735 TFT library
#include <Timezone.h> // https://github.com/JChristensen/Timezone
#include <time.h> //questa libreria converte il timestamp Unix (Unix epoch) in: secondi, minuti, ore, giorno della settimana, giorno, mese e anno.
//L’epoca Unix è il numero di secondi trascorsi dal 1 gennaio 1970 (mezzanotte UTC/GMT).
//Fondamentalmente il time server invia l’ora in formato Unix epoch che deve essere convertito, questa libreria fa tutto il lavoro
// ST7735 TFT module connections
#define TFT_RST D4 // TFT RST NodeMCU pin D4 (GPIO2)
#define TFT_CS D3 // TFT CS NodeMCU pin D3 (GPIO0)
#define TFT_DC D2 // TFT DC NodeMCU pin D2 (GPIO4)
// initialize ST7735 TFT library with hardware SPI module
// SCK (CLK) —> NodeMCU pin D5 (GPIO14)
// MOSI(DIN) —> NodeMCU pin D7 (GPIO13)
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
// set WiFi network SSID and password
const char *ssid = “retemiaenontua”;
const char *password = “vadaviailculo”;
//—————————————————————————–
//Immettere l’ora nel formato epoch e restituire il formato dell’ora tm
static tm getDateTimeByParams(long time){
struct tm *newtime;
const time_t tim = time;
newtime = localtime(&tim);
return *newtime;
}
// Immettere il formato dell’ora tm e restituire la stringa con il modello di formato
static String getDateTimeStringByParams(tm *newtime, char* pattern = (char *)”%d/%m/%Y %H:%M:%S”){
char buffer[30];
strftime(buffer, 30, pattern, newtime);
return buffer;
}
// Inserisci l’ora in formato epoch e restituisci Stringa con modello di formato
static String getEpochStringByParams(long time, char* pattern = (char *)”%d/%m/%Y %H:%M:%S”){
//struct tm *newtime;
tm newtime;
newtime = getDateTimeByParams(time);
return getDateTimeStringByParams(&newtime, pattern);
}
WiFiUDP ntpUDP;
// Per impostazione predefinita, “pool.ntp.org” viene utilizzato con un intervallo
// di aggiornamento di 60 secondi e nessun offset
int GTMOffset = 0; // SET TO UTC TIME
NTPClient timeClient(ntpUDP, “europe.pool.ntp.org”, GTMOffset*60*60, 60*60*1000);
TimeChangeRule CEST = {“CEST”, Last, Sun, Mar, 2, 120}; // Central European Summer Time
TimeChangeRule CET = {“CET “, Last, Sun, Oct, 3, 60}; // Central European Standard Time
Timezone CE(CEST, CET);
unsigned long epoch;
tft.initR(INITR_BLACKTAB); // inizializza un chip ST7735S, sfondo nero
tft.fillScreen(ST7735_BLACK); // riempire lo schermo con il colore nero
tft.setRotation(5);
tft.setTextColor(ST7735_CYAN, ST7735_BLACK); // imposta il colore del testo su sfondo nero
tft.setTextSize(1);
tft.setCursor(12, 14);
tft.print(“Wi-Fi Internet Clock”);
WiFi.begin(ssid, password);
while ( WiFi.status() != WL_CONNECTED ) {
delay(500);
tft.setCursor(15, 54);
tft.print(“CONNETTING…”);
}
timeClient.begin();
tft.setCursor(15, 84);
delay(500);
//tft.print(“CONNESSO”);
if (timeClient.update()){
tft.print ( “Adjust local clock” );
unsigned long epoch = timeClient.getEpochTime();
setTime(epoch);
}
else{
tft.print ( “NTP Update not WORK!!” );
}
delay ( 500 );
tft.fillScreen(ST7735_BLACK);
tft.setTextSize(1);
tft.setCursor(10, 6);
tft.print(“Wi-Fi Internet Clock”);
tft.setTextSize(2);
//timeClient.begin();
delay ( 500 );
if( previous_dow != weekday(epoch) ) // stampa il giorno della settimana
{
previous_dow = weekday(epoch);
tft.fillRect(9, 70, 112, 25, ST7735_BLACK); // disegnare un rettangolo (cancella il giorno dal display)
tft.setCursor(x_pos[previous_dow-1], 77); // COORDINATA ALTEZZA SCRITTA GIORNO SETTIMANA
tft.setTextColor(ST7735_YELLOW, ST7735_BLACK); // imposta il colore del testo su sfondo nero
tft.print( dow_matrix[previous_dow-1] );
tft.setTextSize(2);
}
// stampa la data
tft.setTextSize(2);
tft.setCursor(5, 105);
tft.setTextColor(ST7735_MAGENTA, ST7735_BLACK);
tft.printf( “%02u-%02u-%04u”, day(epoch), month(epoch), year(epoch) );
// stampa il tempo con punti lampeggianti dei secondi
tft.setTextSize(4);
tft.setCursor(8, 30);
tft.setTextColor(ST7735_GREEN, ST7735_BLACK);
/* controlla che il resto della divisione per 2 del secondo corrente,
richiesto mediante il metodo getSeconds() all’ntp library sia 0,
questo comporta che il secondo è uno di quelli pari: 0,2,4,6,8,10….
quando il secondo corrente è dispari, la stringa composta è priva del “:”
*/
if ( (timeClient.getSeconds()%2) == 0 ) {
tft.printf( “%02u:%02u”, hour(epoch), minute(epoch), second(epoch) );
} else {
tft.printf( “%02u %02u”, hour(epoch), minute(epoch), second(epoch) );
}
tft.setTextSize(2);
}
//———————————————————————–//
void loop()
{
timeClient.update();
epoch = timeClient.getEpochTime(); // ottenere il tempo Epoch
Ciao Aldo,
credo che la via più breve sia usare il formattatore che il C mette a disposizione, prendi spunto dalla funzione
// Immettere il formato dell’ora tm e restituire la stringa con il modello di formato
static String getDateTimeStringByParams(tm *newtime, char* pattern = (char *)”%d/%m/%Y %H:%M:%S”){
char buffer[30];
strftime(buffer, 30, pattern, newtime);
return buffer;
}
if( previous_dow != weekday(epoch) ) // stampa il giorno della settimana
{
previous_dow = weekday(epoch);
tft.fillRect(9, 70, 112, 25, ST7735_BLACK); // disegnare un rettangolo (cancella il giorno dal display)
tft.setCursor(x_pos[previous_dow-1], 77); // COORDINATA ALTEZZA SCRITTA GIORNO SETTIMANA
tft.setTextColor(ST7735_YELLOW, ST7735_BLACK); // imposta il colore del testo su sfondo nero
tft.print( dow_matrix[previous_dow-1] );
tft.setTextSize(2);
}
// stampa la data
tft.setTextSize(2);
tft.setCursor(5, 105);
tft.setTextColor(ST7735_MAGENTA, ST7735_BLACK);
tft.printf( “%02u-%02u-%04u”, day(epoch), month(epoch), year(epoch) );
// stampa il tempo con punti lampeggianti dei secondi
tft.setTextSize(4);
tft.setCursor(8, 30);
tft.setTextColor(ST7735_GREEN, ST7735_BLACK);
/* controlla che il resto della divisione per 2 del secondo corrente,
richiesto mediante il metodo getSeconds() all’ntp library sia 0,
questo comporta che il secondo è uno di quelli pari: 0,2,4,6,8,10….
quando il secondo corrente è dispari, la stringa composta è priva del “:”
*/
if ( (timeClient.getSeconds()%2) == 0 ) {
tft.printf( “%02u:%02u”, hour(epoch), minute(epoch), second(epoch) );
} else {
tft.printf( “%02u %02u”, hour(epoch), minute(epoch), second(epoch) );
}
tft.setTextSize(2);
}
//———————————————————————–//
void loop()
{
timeClient.update();
epoch = CE.toLocal(timeClient.getEpochTime()); // ottenere il tempo Epoch
//Serial.println(getEpochStringByParams(CE.toLocal(now())));
Serial.println(getEpochStringByParams(now(), “%H:%M:%S %d.%m.%Y e’ un bel giorno %A di %B”));
Serial.print(“Mio codice:”);
RTC_display();
delay(300);
}
grazie!!!!!!!!!!….cosi va bene!!!!
Autore
Post
Visualizzazione 2 filoni di risposte
Devi essere connesso per rispondere a questo topic.
Mantenere un repository, un sito o un forum è come prendersi cura di un giardino - richiede costante attenzione e cura per farlo prosperare. Se sei un abile giardiniere (o programmatore!) e vuoi aiutarci a far fiorire il nostro sito, saremmo felici di averti nel nostro team! Cerchiamo anche scrittori talentuosi e moderatori per il nostro forum per aiutarci a far crescere la nostra comunità. Se sei interessato a unirti a noi, non esitare a contattarci per farci sapere in che modo puoi contribuire!
Sei un appassionato di elettronica o programmazione? Condividi la tua conoscenza con gli altri, scrivi un semplice tutorial o come fare un grande progetto Contattami. share_your_ideas@mischianti.org
The content displayed on this website is protected under a CC BY-NC-ND license. Visitors are prohibited from using, redistributing, or altering any content from this website for commercial purposes, including generating revenue through advertising. Any unauthorized use is a violation of the license terms and legal action may be taken against individuals or entities found to be in violation.
You must also provide the link to the source.
Per offrire le migliori esperienze, utilizziamo tecnologie come i cookie per memorizzare e/o accedere alle informazioni del dispositivo. Acconsentire a queste tecnologie ci permetterà di elaborare dati come il comportamento di navigazione o gli ID unici su questo sito. Non acconsentire o ritirare il consenso può influire negativamente su determinate funzionalità e funzioni.
Functional
Sempre attivo
The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network.
Preferences
The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user.
Statistics
The technical storage or access that is used exclusively for statistical purposes.The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you.
Marketing
The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes.
Per offrire le migliori esperienze, utilizziamo tecnologie come i cookie per memorizzare e/o accedere alle informazioni del dispositivo. Acconsentire a queste tecnologie ci permetterà di elaborare dati come il comportamento di navigazione o gli ID unici su questo sito. Non acconsentire o ritirare il consenso può influire negativamente su determinate funzionalità e funzioni.
Functional
Sempre attivo
The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network.
Preferences
The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user.
Statistics
The technical storage or access that is used exclusively for statistical purposes.The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you.
Marketing
The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes.