sensore umidità terreno

:confused:
Salve, ho iniziato da poco a imparare come usare arduino e sto cercando il modo per accendere tre led che indicano lo stato della terra per una pianta. Ho creato questo programma in cui il pin 13 sarebbe il led verde, il 12 uno giallo e il 13 rosso. A determinare quale si accende dovrebbe essere la percentuale(p); ho visto che mettendo questo sensore in acqua dava il valore 800 circa. Non riesco proprio a pensare altre soluzioni.

int x;
int p;

void setup() {
Serial.begin(9600);
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
}

void loop() {

x=analogRead(A0);
p=(x*100)/800;

if (p<45){
if (13==HIGH){
digitalWrite(13, LOW);}
if (12==HIGH){
digitalWrite(12, LOW);}

digitalWrite(11, HIGH);
delay(100);
digitalWrite(11, LOW);
delay(100);
Serial.println(“PERICOLO DI MORTE!!!”);
}

if ((p>=45) and (p<50)){
if (13==HIGH){
digitalWrite(13, LOW);}
if (12==HIGH){
digitalWrite(12, LOW);}

digitalWrite(11, HIGH);
Serial.println(“PERICOLO!!!”);

}
if ((p>=50) and (p<60)){
if (11==HIGH){
digitalWrite(11, LOW);}
if (13==HIGH){
digitalWrite(13, LOW);}

digitalWrite(12, HIGH);
Serial.println(“attenzione!”);

}
if ((p>=60) and (p<=80)){
if (11==HIGH){
digitalWrite(11, LOW);}
if (12==HIGH){
digitalWrite(12, LOW);}

digitalWrite(13, HIGH);
Serial.println(“La pianta sta bene”);

}
if ((p>80) and (p<=90)){
if (11==HIGH){
digitalWrite(11, LOW);}
if (13==HIGH){
digitalWrite(13, LOW);}

digitalWrite(12, HIGH);
Serial.println(“attenzione!”);

}
if ((p>90) and (p<=95));{
if (13==HIGH){
digitalWrite(13, LOW);}
if (12==HIGH){
digitalWrite(12, LOW);}

digitalWrite(11, HIGH);
Serial.println(“PERICOLO!!!”);

}
if (90<p);{
if (13==HIGH){
digitalWrite(13, LOW);}
if (12==HIGH){
digitalWrite(12, LOW);}

digitalWrite(11, HIGH);
delay(100);
digitalWrite(11, LOW);
delay(100);
Serial.println(“PERICOLO DI MORTE!!!”);

}

}

Ecco non riesco a capire come mai il led rosso(11) lampeggia sempre e contemporaneamente il verde(13) e il giallo rimangono accesi. Provato a tirare fuori e dentro il sensore per vedere se cambiava qualcosa, ma niente. Forse sarà anche qualche errore stupido, data la mia “ignoranza” su questo ambito.
Non guardate se proprio una pianta x crepa col 90% di acqua, intanto ho messo quello.
grazie in anticipo per i vostri chiarimenti

stato_pianta.ino (1.64 KB)

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento se non lo hai già fatto: Regolamento
Qui una serie di link utili, non inerenti al tuo problema:

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare ( pulsante </> ).
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

Se per leggere un pin analogico usi analogRead(numeropin) e se per scrivere un pin digitale usi digitalWrite(numeropin) ed in tutti e due i casi gli dici su quale pin usare, logicamente questo NON ha senso:

 if (13==HIGH ){

Forse questo è meglio:

 if ( digitalRead(13)==HIGH ){

ho provato come mi ha detto, ma ora il led rosso lampeggia sempre e il led giallo o verde invece lampeggiano invece di rimanere accesi, ma almeno questi lo fanno solo quando p corrisponde alla loro accensione

1.Per il calcolo puoi usare la comoda map() che prende una scala e ne fa un rapporto https://www.arduino.cc/en/Reference/Map

p=map(x,0,1023,0,100)

2.Hai le graffe aperte e chiuse alla cavolo, molti if racchiudono solo parte del codice che volevi.

  1. dichiara i pin con delle costanti, ch poi usi nel codice esempio:
const byte pinV=13;
...
pinMode(pinV,OUTPUT);
...
digitalWrite(pinV);

Questo ti permette di cambiare all'inizio il numero senza modificare tutto.

4.Anche perchè questo è sempre falso

if (13==HIGH ){

HIGH è una costante e vale 1 quindi 13==1 sempre falso

  1. INOLTRE mi pare inutile che nelle varie percentuali tu ti chieda se il pin è high o no, mettilo in tutti i casi a low, se era già a low mica gli fa male. Quindi semplifica il codice.
if (p<45)
{ digitalWrite(13, LOW);
  digitalWrite(12, LOW);
  digitalWrite(11, HIGH);
  Serial.println("PERICOLO DI MORTE!!!");
} else if( p<50) 
{ digitalWrite(13, LOW);
  digitalWrite(12, LOW);
  digitalWrite(11, HIGH);
  Serial.println("PERICOLO!!!");
} else if( p<60) 
{ digitalWrite(13, LOW);
  digitalWrite(12, HIGH);
  digitalWrite(11, HIGH);
  Serial.println("xxxx");
} ... etcetera...

Se usi dei pin PWM puoi usare la analogWrite() su quei pin digital accendendoli tra 0-255 con luminosità da poca a totale, aumentando il numero di “segnali” visivi che dai.
https://www.arduino.cc/en/Reference/AnalogWrite

Ho trovato finalmente il banalissimo errore. era soltanto che gli ultimi due blocchi dopo l' if eccetera avevano il ; quindi li leggeva come istruzioni. Comunque grazie per il suo aiuto