problema libreria timer per ESP8266

salve a tutti, sono passato da poco agli ESP8266 (in particolare a NodeMCU). In passato, con arduino uno, utilizzavo un codice per un termostato che mi gestiva la riaccensione di un gruppo frigo (per raffreddare) dopo un determinato intervallo di tempo. L'impostazione del codice che usavo era il seguente:

#include <secTimer.h>
secTimer myTimer;

.................

int ULTIMOSTATO = 0; //0 per spento, 1 caldo, 2 freddo
int ULTIMOFF = 0;
int SALVAFRIGO = 600;

....................................
TIME = myTimer.readTimer(); 


if (sensors.getTempCByIndex(0) < tmin)
  {
	  //CALDO ON

  ULTIMOSTATO = 1;
  }
  else if (sensors.getTempCByIndex(0) > tmax && (TIME -= SALVAFRIGO) > ULTIMOFF) //time = time - salvafrigo
  {

	//FREDDO ON

  ULTIMOSTATO = 2;
  }


 else if (sensors.getTempCByIndex(0) > tmin || sensors.getTempCByIndex(0) < tmax)
  {

	//CALDO E FREDDO OFF
   
  if (ULTIMOSTATO == 2)
   {
    ULTIMOFF = myTimer.readTimer();
    ULTIMOSTATO = 0;
   }
  }
 }

Passando a Nodemcu ho notato purtroppo che la libreria secTimer non è supportata. Ho momentaneamente risolto il problema usando la funzione millis () calcolando all'inizio un tempo TIME = millis ()/1000; e successivamente un ULTIMOFF = millis()/1000 andando poi a confrontare la differenza dell'intervallo di riaccensione nel ciclo if.
Ora, sono purtroppo vincolato a millis () che prima o poi, essendo anche una cantinetta vini che può stare sempre accesa, si resetta e torna a 0.
Secondo voi come è meglio calcolare un intervallo temporale? un orologio NTP? dovrei poi considerare un orario attuale e calcolare un orario del "futuro" minimo in corrispondenza del quale far riattivare il gruppo frigo? esiste qualcosa già predisposto? grazie!

Sempre il solito falso problema di chi non ha realizzato bene come si usa millis() e che il suo overflow NON ha alcuna importanza ...
... studiati prima QUI, poi QUI e QUI e QUI e tutti gli articoli che sono in QUESTA pagina ... vedrai che ti sarà tutto più chiaro :wink:

Guglielmo

Ah, piuttosto ... so che sei un vecchio utente del forum :slight_smile: , ma ... non riesco a trovare il tuo post di presentazione nell'apposito thread ::slight_smile: , per cui, cortesemente, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiederei di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO che, in tutti questi anni, è piuttosto cambiato ... Grazie. :slight_smile:

Guglielmo

perfetto, ho approfittato per presentarmi. Grazie per i riferimenti. Con calma dò una letta. Pensavo che come nel caso di secTimer esistesse una libreria già impacchettata che gestisse i timer con Esp8266. Grazie!

ilario:
... esistesse una libreria già impacchettata che gestisse i timer con Esp8266. Grazie!

... so che c'è QUESTA libreria, ma usa gli interrupts e, per quello che devi fare tu, mi sembra un'inutile complicazione.

Secondo me se ti impari ad usare bene millis() (cosa fondamenale per un'infinità di cose) fai di tutto e di più in modo più semplice, compatto e senza tante complicazioni esterne, poi ... vedi tu ... ::slight_smile:

Guglielmo

P.S.: Comunque, se si cerca bene con Google, probbailmente altre librerie saltano fuori ... però ripeto, per la tua applicazione, mi sembrano un'esagerazione :smiley:

L'espe8266 ha delle funzioni già incluse nel core che consentono di eseguire delle operazioni ciclicamente, one shot etc etc... non è necessario aggiungerne di altre se si vuole evitare problemi di dipendenza.

Purtroppo non sono molto ben documentate :frowning:

Ad esempio con questo codice, l'oggetto una_volta_al_secondo diventa true una volta ogni secondo.
Basta verificarne lo stato nel loop e fare quello necessario.

Se invece vuoi che la tua azione sia eseguita solo una volta con un ritardo X puoi usare
static esp8266::polledTimeout::oneShotMs

#include <PolledTimeout.h>
static esp8266::polledTimeout::periodicMs una_volta_al_secondo(1000);


void loop(){
  if(una_volta_al_secondo) {
     // fai quello che serve
  }
}

Fai riferimento all'esempio incluso nell'IDE BlinkPolledTimeout.ino per ulteriori indicazioni sull'uso.

Ma concordo con Guglielmo, se impari ad usare millis() ti torna utile anche con altre piattaforme.

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