Aiuto programma semplice semplice

Ciao a tutti, ho il seguente programma

/Sketch per rilevare la pioggia (valore analogico)/
void setup()
{
Serial.begin(9600);
pinMode(2, OUTPUT); //Led Rosso
pinMode(4, OUTPUT); //Led Verde
pinMode(5, OUTPUT); //Led Giallo
}
void loop()
{
int sensorValue = analogRead(A0); //Legge il valore analogico
Serial.println(sensorValue); //Stampa a schermo il valore
delay(2000); //Attende due secondi
if (analogRead(A0)<700) digitalWrite(2, HIGH);
if (analogRead(A0)<700) digitalWrite(4, LOW);
if (analogRead(A0)<700) digitalWrite(5, LOW);
if (analogRead(A0)>1000) digitalWrite(4, HIGH);
if (analogRead(A0)>1000) digitalWrite(2, LOW);
if(analogRead(A0)>1000) digitalWrite(5, LOW);
if(analogRead(A0)>700) digitalWrite(5, HIGH);
if(analogRead(A0)>700) digitalWrite(4, LOW);
if(analogRead(A0)>700) digitalWrite(2, LOW);
}

In poche parole, ho un sensore di pioggia, quando lo bagno il suo valore analogico scende.
Asciutto vale 1023, quando lo bagno scende fino anche a 300.
Vorrei che quando sia completamente asciutto (valore analogico 1023), il led verde si accenda, quando il valore logico sia tra 700 e 1000 si accenda quello giallo e quando sia sotto 700 accenda quello rosso.
Quando è sotto 700 accende quello rosso e va bene, non va bene invece quando è maggiore di 700, poiché rimane sempre acceso quello giallo. Sicuramente sto sbagliando qualcosa (sono un neofita) potreste aiutarmi? Grazie.

i digital write non vanno nell’if :wink:

if (analogRead(A0)<700) 
{
digitalWrite (2, HIGH);
}

tipo così

ma prima di void setup non c’è niente?

Ciao,
hai fatto errori gravissimi nella stesura dello sketch, prima di tutto si tratta di un valore analogico e non “logico” come hai scritto, bisogna fare la distinzione. Pensa come se fossi tu ad eseguire le operazioni. Inanzi tutto, lo sketch va formattato secondo regole precise ma puoi risparmiarti il lavoro con “formattazione automatica”.

Pensa come la macchina:

gruppoDiOperazioni continuemente() {
  valore = leggiIDati(A0);
  Scrivi(valore);
  
  se (valore < 700) {
    spegni(4, 5);
    accendi(2);
  } altrimente se ((valore => 700) & (valore < 1000)) {
    spegni(2, 4);
    accendi(5);
  } altrimenti se (valore => 1000) {
    spegni(2, 5);
    accendi(4);
  }
}

Lascio a te il compito di tradurre, spero davvero sia stato un ottimo chiarimento. “else if” va usata perché accendere un LED perché val>700 e poi spegnerlo perché val >1000 non serve a nulla, usa le parentesi graffe {} e togli un po’ di “if”. Hai inoltre creato la variabile sensorValue ma la usi una sola volta, leggere il pin A0 molte volte una dopo l’altra è solo un modo per perdere cicli di clock e rendere lento il programma.

As_Needed:
i digital write non vanno nell’if :wink:

if (analogRead(A0)<700) 

{
digitalWrite (2, HIGH);
}




tipo così

ma prima di void setup non c'è niente?

guarda meglio, quei digitalWrite non sono nell’argomento dell’'if.
quando l’if ha una sola istruzione da eseguire si può scrivere benissimo

if (analogRead(A0)<700) digitalWrite (2, HIGH);

:wink:

@Enrichetto
nell’if puoi verificare anche più di una condizione alla volta. esempio

if ( valore > 700 && valore < 1000) {
  digitalWrite (ledGiallo, HIGH);
  digitalWrite (ledRosso, LOW);
  digitalWrite (ledVerde, LOW);
}

questo significa che, se il valore è compreso tra 700 e 1000 si accende il giallo.
così si semplifica lo sketch ed è più facile seguirne la logica :wink:

ricdata:
guarda meglio, quei digitalWrite non sono nell’argomento dell’'if.
quando l’if ha una sola istruzione da eseguire si può scrivere benissimo

if (analogRead(A0)<700) digitalWrite (2, HIGH);

:wink:

Hai ragione :wink: