Multipli millis in un codice

Buon giorno,
premetto che lo letto varie discussioni e tutorial sul millis e fino ad oggi l'ho usato senza troppi problemi, e anche nello sketch seguente l'ho usato correttamente la prima volta tra la riga 83 e 86, ho cercato poi di cambiare un altro delay senza riuscirci, non riesco a capire il motivo, ma mi parte a contare i millis da quando accendo la mia esp32 e non dal IF scatenante, qualcuno sarebbe così gentile da mostrarmi come cambiare un delay nel mio codice che così io poi vado a cambiare gli altri? (per esempio il delay alla riga 145)
ho creato una simulazione su wokwi al seguente link dove trovate anche il codice.
Wokwi esp32 test
per test basta avviare la simulazione aspettare 2 secondi, poi click su bottone rosso e a scelta click su bottone bianco o nero, a quel punto il led rosso si spegne e si accende il bianco per e si spegne dopo un delay (1000) che nella realtà saranno 10000 ed è troppo per bloccare tutto il mio loop.

Vi ringrazio anticipatamente per le eventuali risposte.

Millis e' una variabile "di sistema" , diciamo cosi, che restituisce il numero di millisecondi trascorsi dal momento dell'accensione ... sta poi al programma gestire questo valore, se servono diverse temporizzazioni, serve ovviamente usare una variabile di confronto diversa per ognuna di esse :wink:

Oltre a quanto detto da @Etemenanki aggiungo che ci sono troppe parentesi {}. Ripulisco io

void loop()   /****** LOOP: RUNS CONSTANTLY ******/
{

  // preload

  // preload logic
  if (digitalRead(PIN_BTN_BLUE) == LOW)   // ON- STARTS TIMER
  {
    digitalWrite(Relay_1, RELAY_ON); // relay comes On
    onTime = millis();
  }

  //if(onTime > 0 && millis() - onTime > 5000) //5000=5 SEC, 10000=6 SEC,15000=16 SEC
  if (millis() - onTime > 1500) //5000=5 SEC, 10000=6 SEC,15000=16 SEC
  {
    Serial.println("spegne Relay_1");
    digitalWrite(Relay_1, RELAY_OFF); // LED goes off
  }
}

Ho ridotto il loop a quello che vedi sopra. Prova ad eseguirlo e vedrai che senza premere nulla dopo 1500ms
inizia a stampare "spegne Relay_1" che però non è mai stato acceso.

Considera anche che se premi il pulsante BLUE prima che scadano i 1500ms il Relay_1 non si spegnerà mai; è questo il comportamento che desideri?

Ciao.

http://forum.arduino.cc/index.php?topic=520666.msg3551257#msg3551257

Non mi pare di aver chiesto la definizione di millis... mi pare di aver scritto che l'ho usato varie volte e di aver letto vari tutorial, a dimostrazione che l'ho usato anche nello sketch postato 2 volte correttamente, ma nel terzo caso nonostante io lo applichi allo stesso modo non funziona, la prossima volta che chiederò una definizione, apprezzerò il tuo post, in questo caso hai sprecato tempo a scrivere una cosa inutile in quanto saputa da te e da me medesimo che chiedevo un aiuto
, grazie.

le parentesi, forse erano troppe, ma quel millis nel mio sketch funzionava anche prima grazie

come già scritto, ho già letto tot tutorial e post nel forum sul millis, il search lo so usare. Grazie

@nemoz_z : io non entro in merito alle domande/risposte, ma, da moderatore e vecchissimo utente del forum, ti dico semplicemente che, con questo tuo atteggiamento e modo di rispondere, NON credo che otterai grandi aiuti ... :roll_eyes:

Guglielmo

il mio primo post è stato più che cortese, mi pare , lo stesso post tradotto in un forum di programmazione indiano ha portato 2 utenti a chiedermi prima come avevo impostato io il codice con il terzo millis non funzionante di cui ovviamente avevo usato variabili diverse di confronto, poi uno mi ha mostrato il mio errore, l'altro non solo ha confermato il mio errore ma mi ha consigliato anche una maniera più elegante di scrivere il mio codice. Io quando mi chiedono domande di Gcode o come impostare post processori per torni a 4 assi non supportati da alcuni cam, non rispondo con definizioni ma con soluzioni, ovvero prendo il post processore lo modifico secondo le richieste, oppure prendo il gcode e lo modifico per risolvere la lavorazione... sarò strano io. Se una persona mi chiede un passaggio in macchina è mia scelta se darglielo o meno, ma mettersi a enunciargli la cilindrata e le caratteristiche essenziali del veicolo e non dare un passaggio non mi sembra la soluzione migliore o sbaglio?

By by nemoz_z

1 Like

Se ti sei trovato bene con gli indiani, continua lì...

Probabilmente tu sei un altro che al momento di chiedere un passaggio preferisci ricevere le caratteristiche della macchina e basta. La domanda seria è come mai nel forum sotto a ogni post c'è la spunta Solution? Probabilmente perchè è stato previsto che a domande specifiche richiedendo una soluzione si dia la soluzione. Non voglio tediarvi troppo. Sembra come nella politica italiana si espone un problema e tutti i politici ci girano attorno senza dare una soluzione :slight_smile:

Io ci ho provato

Ma al link non ho trovato codice

Siccome alcuni sono da telefonino, come me, e da telefonino non è facile aprire link...
Ti spiace mettere qui il codice?

1 Like

Ti ringrazio, ma ho volutamente cambiato il link, non vorrei che poi qualcuno arrivasse dando la soluzione che ho già avuto in un altro forum. Non sono qui per far perdere tempo a nessuno. Ma aprezzo sicuramente il tuo messaggio.

Io ho aperto il link e c'è uno sketch. Quindi questo non è quello originario del post?

Comunque a me sembra il classico caso in cui una macchina a stati finiti avrebbe semplificato enormemente la gestione di ogni cosa ed evitato l'uso di tutte quelle variabili di appoggio.
Per fare quello che chiedi mantenendo la stessa impostazione, hai bisogno di un ulteriore variabile "di stato" per memorizzare il momento di attivazione del relè.

Io che preferisco l'approccio C++ ad esempio, in questo caso avrei fatto al volo una piccola classe per la gestione delle uscite dei relè che preveda i diversi casi di utilizzo: set/reset oppure uscita impulsiva di x millisecondi.

Bene, allora possiamo chiuderla qui.

Guglielmo

1 Like