Errore nel compilare un codice per attivare un buzzer a auna certa temperatura.

buongiorno,

ho un sistema arduino uno con due termocoppie e un display che mi mostra le due temperature rilevate.

Adesso voglio implementare un buzzer che si attivi quando una delle due arrivi a una certa temperatura . La lettura sarebbe solo su una sonda.
Ho fatto qualche ricerca online ed ho provato ad implementarlo al mio codice pero senza risultati.

Il compilatore mi da il seguente errore "exit status 1 ‘else’ without a previous ‘if’.
Non capisco dove e’ l’ errore.
Grazie in anticipo

P.s. il buzzer si funziona
P.s.2 Se e’ possibile si puo usare un tastierino del LCD shield per spegnere il suono? credo che sia fattibile pero ho tutte le uscite digitali piene. Ho libere le analogiche,

thermocupla.ino (1.68 KB)

Ti dice che esiste un else senza un precedente if.

            if (temperatura >= umbral) 
                  tone(pinBuzzer, 440, 300);
                  delay(500);
            else
            noTone(pinBuzzer);

Se dopo if() c'è una sola istruzione puoi omettere le parentesi graffe {}, se ci sono più istruzioni devi usarle. Nel codice come lo hai scritto trova if(), considera la prima l'istruzione successiva e per il compilatore è finito l'if(), per cui quell'else non appartiene a nessun if. Risolvi usando le parentesi.

Se ti servono più ingressi digitali, devi sapere che gli ingressi analogici possono essere usati come ingressi digitali utilizzando il loro nome A0 A1 A2 A3 ecc... pinMode(A1,INPUT);

trovi l'uso dell' if else QUI e QUI

per essere più espliciti

  if (temperatura >= umbral) {
    tone(pinBuzzer, 440, 300);
    delay(500);
  }
  else
    noTone(pinBuzzer);

antomexita:
Il compilatore mi da il seguente errore "exit status 1 'else' without a previous 'if'.
Non capisco dove e' l' errore.

Essenzialmente il problema è che indenti male! :slight_smile:

Se ogni tanto nell'IDE facessi Ctrl-T per farti indentare il codice, ti saresti accorto che manca la graffa.

L'indentazione non è una questione "estetica" ma necessaria anche per casi come questo ed evitare di perdere le ore per una sciocchezza...
Indentare, bene, sempre.

Buon giorno,

grazie ai consigli ho risolto il problema ed ho imparato qualcosa in piu’.
Adesso come accennavo, voglio implementare un pulsante che, se premuto, interrompe il suono del buzzer per 5 minuti, passati i quali se la temperatura continua ad essere alta ricomincia a suonare.
Ho gia´ collegato il pulsante e provato con successo il suo funzionamento.
Ho provato a scrivere il codice che manca pero il buzzer continua a suonare.

Se qualcuno mi puo´dare una dritta a riguardo, allego lo sketch.

In ogni modo grazie in anticipo.

thermocupla.ino (1.97 KB)

Alla pressione del pulsante assegni ad una variabile apposita di tipo bool il valore false
e la usi o nello stesso if del controllo della temperatura (in AND "&&") o in un if che racchiude tutto l'if else
dove c'è il buzzer.
Quindi se la variabile è false (cioè 0) non esegui l'accensione del buzzer.
Comincia con questo, poi bisognerà introdurre il reset della variabile dopo 5 minuti, ovvero 300000 millisecondi.
Li servirà la funzione millis(). Su questa funzione è stato scritto di tutto e di più. Cerca sul forum e su internet.

gianlucaf:
Alla pressione del pulsante assegni ad una variabile apposita di tipo bool il valore false
e la usi o nello stesso if del controllo della temperatura (in AND "&&") o in un if che racchiude tutto l'if else
dove c'è il buzzer.

Ciao, grazie per la risposta, effettivamente e´quello che sto facendo. Per provare se la istruzione
if (sensorValue > 200 && temperatura >= umbral) funziona ho dichiarato che premendo il bottone suoni in modo differente, e si suona. PEro se metto NoTone, viene ignorato.
Ho provato anche a a racchiudere il tutto in usa sola instruzione con 2 if e un else senza risultati.

  if (temperatura >= umbral) {
    tone(pinBuzzer, 440, 200);
    delay(5000);
  }
  else
    noTone(pinBuzzer);

  sensorValue = analogRead(sensorPin);   // realizar la lectura

  if (sensorValue > 200 && temperatura >= umbral)
  {
    Serial.println(sensorValue);
    tone(pinBuzzer, 2000, 300);
    delay(5000);
  }
  else
  {
    Serial.println(sensorValue);

  }
  delay(500);

Ciao! Secondo me non stai facendo quello che ti hanno suggerito per ottenere quello che volevi nel tuo precedente post :slight_smile:

Detto questo hai due if che azionano il tone, se il secondo if con >200 risulta falso può essere vero il primo if.

Un consiglio che aiuta a programmare, quando vuoi ottenere qualcosa descrivilo DETTAGLIATAMENTE IN ITALIANO e poi lo traduci nel linguaggio di programmazione, il tutto risulta molto più semplice e arrivi alla soluzione da solo, RIPETO DETTAGLIATAMENTE.

Esempio:

Adesso come accennavo, voglio implementare un pulsante che, se premuto, interrompe il suono del buzzer per 5 minuti, passati i quali se la temperatura continua ad essere alta ricomincia a suonare.

Alla pressione di un pulsante
Interrompo il suono
Inizio a conteggiare 5 minuti
Trascorsi 5 minuti controllo la temperatura
Se la temperatura è alta attivo nuovamente il suono

Per programmare bene devi dividere tutti i compiti in piccoli step e poi scrivere il codice per ogni step :slight_smile:

Iscrizione