Millis o contatore attivazione relè?

In Arduino se funziona é la soluzione. Può anche essere un catorcio, non ha importanza

haha pero mi piacerebbe sapere se se potrebbero esserci errori ??

Il codice non è indentato.

Comandi due volte di fila ‘resistenza’ con due livelli opposti.

Immagino che sia normale non uscire dallo stato 3.

Indichi cosa fare se le temperature sono maggiori o minori, ma niente se sono uguali.

Nel caso in cui ‘temp’ sia <= 99 nello stato 2 non viene eseguita più alcuna azione.

La condizione:
if ( ore == 0, min == 0, sec == 0)non sapevo neppure fosse sintatticamente corretta, in effetti non so cosa fa.

in effetti non era proprio il massimo è il fatto del tempo non rimasto non funziona come dovrebbe.. Ora ho corretto un pò di cose e parrebbe funzionare ad esclusione del fatto che non riesco a passare allo stato 3 quando il tempo è 0.

Claudio_FF:
La condizione:

if ( ore == 0, min == 0, sec == 0)

non sapevo neppure fosse sintatticamente corretta, in effetti non so cosa fa.

Sicuramente NON fa quello che lui si aspetta ...

... l'espressione viene valutata da sinistra a destra, l"operazione" viene eseguita ed il risultato scartato, dopo di che si prosegue sino all'ultima che è l'unica che, oltre ad essere "eseguita" viene anche presa in considerazione.

In the C and C++ programming languages, the comma operator (represented by the token ,) is a binary operator that evaluates its first operand and discards the result, and then evaluates the second operand and returns this value (and type).

Guglielmo

quindi devo proprio cambiare modo di pensare questa parte di programma esatto?

... Non basterebbe sostituire le , con degli &&? Così sarebbe
Se (le ore sono zero E i minuti sono zero E i secondi sono zero) fai

Silente:
... Non basterebbe sostituire le , con degli &&?

... si, anche se è sempre molto rischioso fare un confronto che include i secondi ... se non si passa in quella IF nel momento "esatto" in cui ore, minuti e secondi sono zero, essa NON viene soddisfatta.

Guglielmo

quindi un buon metodo potrebbe essere if ( ore == 0 & minu == 0 & sec < 20) cosi da poter essere certo? riallego comunque il mio sketch con qualche aggiornamento .

YogurtV2.zip (2.4 KB)

Impara la differenza tra l'operatore bitwise & e l'operatore booleano && e ... coreggi quello che hai scritto.

Guglielmo

ma intendete nel mio scketch ? oppure nella mia risposta?

Nel tuo post #28 ... è da correggere, usi l'operatore bitwise invece dell'operatore booleano.

Guglielmo

perfetto capito grazie mille Guglielmo. Cosi il mio programmino dovrebbe funzionare esatto?

samu92:
perfetto capito grazie mille Guglielmo. Cosi il mio programmino dovrebbe funzionare esatto?

Non lo so, non ho esaminato tutto il programma, sono intervenuto su quella riga specificando i possibili problemi in caso di uguaglianza con i secondi e gli errori di scelta degli operatori :wink:

Guglielmo

samu92:
perfetto capito grazie mille Guglielmo. Cosi il mio programmino dovrebbe funzionare esatto?

Beh, intanto “dovrebbe funzionare” si divide in “se compila” e quindi, in caso positivo, “se fa quello che mi aspetto che faccia”. La risposta al primo ce l’hai appena lanci la compilazione, una volta che questa termina correttamente, devi verificare il comportamento per verificare se funziona come previsto.

Da una prima occhiata è possibile che la compilazione possa avvenire, ma a parte le cose già segnalate vorrei dire che quando fai:

  lcd.setCursor(4,0);
  lcd.print(ore);
  lcd.setCursor(5,0);
  lcd.print(":");
  lcd.setCursor(6,0);
  lcd.print(min);
  lcd.setCursor(8,0);
  lcd.print(":");
  lcd.setCursor(9,0);
  lcd.print(sec);

i valori di ore, minuti e secondi potrebbero essere di 1 o 2 cifre, quindi se dopo aver scritto le ore a colonna 4 posizioni il cursore a colonna 5 avrai dei problemi dalle 12 alle 24… Lo stesso per i minuti.
Dovresti considerare sempre due cifre per ogni valore, ossia cambiare in qualcosa del genere:

  lcd.setCursor(4,0);
  if ( ore < 10 )
    lcd.print("0");
  lcd.print(ore);
  lcd.print(":");
  if ( min < 10 )
    lcd.print("0");
  lcd.print(min);
  lcd.print(":");
  if ( sec < 10 )
    lcd.print("0");
  lcd.print(sec);

A questo non ci avevo pensato grazie... comunque il programma compila quindi parrebbe funzionare :slight_smile: mi sarebbe piaciuto capire se avessi commesso piccoli errori visto che è una delle mie prove con arduino

samu92:
il programma compila quindi parrebbe funzionare

Beata ingenuità... :slight_smile: Mai sottovalutare il potere dei bug! :smiley:

Già te l'ho detto, "funziona" non è sinonimo di "compila" e neanche il viceversa. Se compila puoi dire di non aver fatto errori sintattici, non che "funziona".

Di un software si dice che "funziona" solo quando "compila" e "fa quello per cui è stato progettato".

docdoc:
"fa quello per cui è stato progettato".

:fearful: :fearful: :fearful: Esistono software che fanno questo??? :slight_smile: :slight_smile: :slight_smile:

Certo e ne abbiamo parlato da poco.
Semplicissimi e sicuramente funzionanti

while(1);
e
for(;;);

garantito che fanno quello che devono: fermare Arduino
Programmi più complessi "sicuri"?
non mi fiderei....

tutto corretto e tutto chiaro è ciò che penso anche io cercherò di capire se risultano bug!!! :frowning: ad esempio mi piacerebbe capire se sia necessario un PID (ma forse è meglio aprire una nuova discussione)