Aiuto Reset temperatura max e min alle 23.59

Ciao a tutti. Ho bisogno del vostro aiuto. Stampando la temperatura sul display, ho necessità di azzerare il dato della massima e della minima alle 23.59. Tempo fa mi aiutaste a farlo con l'orario dato da un orologio RTC, questa volta ho bisogno di resettarlo con NTP. Lo sketch, come al mio solito, è un insieme di sketch.

Ho provato inserendo questo al termine dello sketch...:

void Data() {
  tm* p_tm = localtime;
  if ( tm_hour == 23 && tm_min == 58 && tm_sec <= 10 ) {
    massima = -9;
    minima = 99;
  }

...ma non ha funzionato.

Riporto il codice qui di seguito e spero in un vostro aiuto. Grazie a tutti.

#include <BlynkSimpleEsp8266.h>

#include <ESP8266WiFi.h>
#include <time.h>

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#include "DHTesp.h"

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

char auth[] = "TOKEN BLYNK";
const char* ssid = "Mio WIFI";
const char* password = "PASSWORD WIFI";

int timezone = 1 * 60 * 60;
int dst = 0;

BlynkTimer timer;

struct dataStruct2 {
  float t5;
  float h5;
} terrazzo_data;

DHTesp dht;

int massima = -9;
int minima = 99;

void readSensorsendSensor()
{
  Blynk.virtualWrite(V13, terrazzo_data.t5);
  Blynk.virtualWrite(V14, terrazzo_data.h5);
}

void setup() {

  Serial.begin(115200);

  dht.setup(D3, DHTesp::DHT22);

  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;);}

  delay(2000);
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.println("Wifi connecting to ");
  display.println( ssid );
  WiFi.begin(ssid, password);
  display.println("\nConnecting");
  display.display();
  while ( WiFi.status() != WL_CONNECTED ) {
    delay(500);
    display.print(".");
    display.display();}

  // Clear the buffer.
  display.clearDisplay();
  display.display();
  display.setCursor(0, 0);
  display.println("Wifi Connected!");
  display.print("IP:");
  display.println(WiFi.localIP() );
  display.display();
  configTime(timezone, dst, "pool.ntp.org", "time.nist.gov");
  display.println("\nWaiting for NTP...");
  while (!time(nullptr)) {
    Serial.print("*");
    delay(1000);}
  display.println("\nTime response....OK");
  display.display();
  delay(1000);
  display.clearDisplay();
  display.display();

  Blynk.begin(auth, ssid, password);

  timer.setInterval(6000L, readSensorsendSensor);
}

void loop() {

  time_t now = time(nullptr);
  struct tm* p_tm = localtime(&now);

  Serial.print(p_tm->tm_mday);
  Serial.print("/");
  Serial.print(p_tm->tm_mon + 1);
  Serial.print("/");
  Serial.print(p_tm->tm_year + 1900);
  Serial.print(" ");
  Serial.print(p_tm->tm_hour);
  Serial.print(":");
  Serial.print(p_tm->tm_min);
  Serial.print(":");
  Serial.println(p_tm->tm_sec);

  Serial.print(terrazzo_data.t5, 1);
  Serial.print(" ");
  Serial.print("°C");
  Serial.print(" ");
  Serial.println(terrazzo_data.h5, 1);
  Serial.print(" ");
  Serial.print("%");
  delay(2000);

  // Clear the buffer.
  display.clearDisplay();

  display.setTextSize(2);
  display.setTextColor(WHITE);

  display.setCursor(30, 0);
  display.print(p_tm->tm_hour);
  display.print(":");
  if ( p_tm->tm_min < 10)
    display.print("0");
  display.print(p_tm->tm_min);

  // display temperature
  display.setTextSize(3);
  display.setCursor(6,20);
  display.print(terrazzo_data.t5, 0);
  display.setTextSize(1);
  display.cp437(true);
  display.write(167);
  display.setTextSize(2);
  display.print("C"); 
  // display humidity
  display.setTextSize(3);
  display.setCursor(70, 20);
  display.print(terrazzo_data.h5, 0);
  display.setTextSize(2);
  display.print("%");
  //minima e massima
  display.setTextSize(1);
  display.setCursor(20, 50);
  display.print("min ");
  display.setTextSize(1);
  display.print(minima);
    display.setTextSize(1);
  display.setCursor(70, 50);
  display.print("max ");
  display.setTextSize(1);
  display.print(massima);

  display.display();

  terrazzo_data.h5 = dht.getHumidity();
  terrazzo_data.t5 = dht.getTemperature();

  if (massima < terrazzo_data.t5)
  {massima = terrazzo_data.t5;}
  if (minima > terrazzo_data.t5)
  {minima = terrazzo_data.t5;}

  timer.run();
  Blynk.run();

  delay(5000);
}

Non basta fare così?

byte fatto=0;

void loop() {

  time_t now = time(nullptr);
  struct tm* p_tm = localtime(&now);
  if (tm_hour==23 && tm_min==59 && fatto==0) 
    {
    massima=-9;
    minima=99;
    fatto=1;
    }
  else if (tm_hour==0 && tm_min==0 && fatto==1) fatto=0;
  ... ... ...

Ma non ti può bastare verificare se il giorno è variato? Memorizzi il giorno attuale (o anche il giorno della settimana) quando varia azzeri tutto e memorizzi il nuovo giorno nella variabile di controllo.
In questo modo se per qualche latenza ecc. non sei li a verificare al secondo/minuto preciso non hai comunque problemi.

2 Likes

Una cosa del genere ("giorno" in realtà è la funzione che fornisce il giorno del mese):

byte giorno_prec=0;

void loop() 
{
  time_t now = time(nullptr);
  struct tm* p_tm = localtime(&now);
  if (giorno!=giorno_prec) 
    {
    massima=-9;
    minima=99;
    giorno_prec=giorno;
    }
  ... ... ...

Visto che già usa la struct tm può semplicemente confrontare il valore salvato del giorno con la proprietà tm_yday della struct (il numero di giorno nell'anno corrente).

int yearDay = 0;
.....

if ( p_tm->tm_yday != yearDay ) {
  yearDay = p_tm->tm_yday;
  // reset delle variabili
}

Ragazzi, vi ringrazio per il Vostro prezioso aiuto. Per il momento ho usato il primo suggerimento di @Datman perché, impostando un'orario immediatamente vicino a quando ho svolto il test, ho potuto verificarne subito il funzionamento. Ho semplicemente aggiunto qualcosina al codice dato che cosí com'era mi faceva fallire la verifica dello sketch.

if (p_tm->tm_hour==15 && p_tm->tm_min==37 && fatto==0) 
    {
    massima=-9;
    minima=99;
    fatto=1;
    }
  else if (p_tm->tm_hour==0 && p_tm->tm_min==0 && fatto==1) fatto=0;

@cotestatnt, ieri, prima della mezzanotte ho testato le righe di codice da te suggerite, dato che erano le uniche per le quali la verifica dello sketch non falliva; purtroppo non hanno funzionato. A scopo didattico, potrei chiederti come mai?

Grazie ancora e grazie per gli esaustivi consigli che data a questa comunità.

Metti lo sketch completo che non ha funzionato, altrimenti è un po' difficile fare ipotesi.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.