Cicli if con while

Ciao a tutti, sto cercando di fare n cicli modulari che mi accendano un sensore, verifichino lo stato del sensore e se questo è HIGH spenga un rele, mentre se è LOW accenda il rele e non lo spenga finchè il sensore non diventa HIGH. Solo a questa condizione si dovrà passare allo step successivo perfettamente uguale a questo.
Vi incollo il codice, con il while messo così (infatti l'ho commentato) non va.
Mi sapete dire dove sbaglio?
Grazie a tutti

int chocolatePump =23;
int chocolate =22;
const unsigned int chocoA = 44;
void setup() {
  pinMode(chocolatePump, OUTPUT);
  pinMode(chocolate, INPUT);
  pinMode(chocoA, OUTPUT);
  Serial.begin(9600);
}
void loop() {
  
  Serial.println(chocoA);
  digitalWrite(chocoA, HIGH);
  delay(1000);
 // while (digitalRead(chocolate) == HIGH) {
  if(digitalRead(chocolate) == HIGH){
    digitalWrite(chocolatePump, LOW);
    Serial.println("IF");
  } 
  else {
    digitalWrite(chocolatePump, HIGH);
    delay(1000);
    Serial.println("Else");
  //}
  }
  digitalWrite(chocoA, LOW);
  delay(1000);
}
/[code]

edita il post e metti il codice nei tag code prima che passino a caziarti...

quel while con l'if subito dopo ha poco senso... entri nel while se il sensore è HIGH, perché dentro il while verifichi se è HIGH o LOW?

bisognerebbe capire bene cosa vuoi fare, ma io userei o l'if o il while.

Grazie Fratt, ora spero sia inserito correttamente.
Il progetto prevede l'alimentazione alternata di 6 sensori di umidità del terreno, e quando un sensore rileva la necessità di acqua comanda un rele con una elettrovalvola e dà acqua. Sino a che non chiude l'elettrovalvola non può passare al sensore successivo, altrimenti lascia l'acqua aperta e fa un macello. Pensavo quindi di mettere il while fintanto che non termina di irrigare non chiude il ciclo.

int chocolatePump =23;
int chocolate =22;
const unsigned int chocoA = 44;
void setup() {
  pinMode(chocolatePump, OUTPUT);
  pinMode(chocolate, INPUT);
  pinMode(chocoA, OUTPUT);
  Serial.begin(9600);
}
void loop() {
  
  Serial.println(chocoA);
  digitalWrite(chocoA, HIGH);
  delay(1000);
 // while (digitalRead(chocolate) == HIGH) {
  if(digitalRead(chocolate) == HIGH){
    digitalWrite(chocolatePump, LOW);
    Serial.println("IF");
  } 
  else {
    digitalWrite(chocolatePump, HIGH);
    delay(1000);
    Serial.println("Else");
  //}
  }
  digitalWrite(chocoA, LOW);
  delay(1000);
}

digital_OK.ino (592 Bytes)

a dir la verità era meglio modificare e correggere il primo post...

quindi non c'è una "priorità" tra i sensori, vanno solo controllati uno dopo l'altro, giusto?
puoi provare così...
(non ho capito la logica dei nomi delle variabili... per capirmi le ho cambiate, poi sistema tu)

void loop() {
  // primo sensore
  if (digitalRead(sensore1) == HIGH) { 
    while (digitalRead(sensore1) == HIGH) {
      // tengo attiva l'elettrovalvola
      digitalWrite(elettrov1, HIGH / LOW); // metti il valore corretto
    }
  } else {
    // chiudo l'elettrovalvola
    digitalWrite(elettrov1, LOW / HIGH); // metti il valore corretto
  }
  // secondo sensore
  if (digitalRead(sensore2) == HIGH) { 
    while (digitalRead(sensore2) == HIGH) {
      // tengo attiva l'elettrovalvola
      digitalWrite(elettrov2, HIGH / LOW); // metti il valore corretto
    }
  } else {
    // chiudo l'elettrovalvola
    digitalWrite(elettrov2, LOW / HIGH); // metti il valore corretto
  }
  // ecc...
}

docsavage sono in piena produzione di peperoncini :grin: ma per fortuna/purtroppo devo partire per 1 mese fuori e non ho nessuno che riesca a seguirli, siccome sono da febbraio che mi sbatto mi scoccerebbe tanto perderci tutto!
Il fatto di non poter passare alla lettura successiva deriva dal fatto che se mi tiene aperta l'acqua per troppo tempo mi allaga tutto, anche perchè i sensori li accendo ogni tot di tempo per prevenirne la corrosione.
Fratt la tua soluzione è perfetta! Grazie mille!
docsavage il tuo consiglio è un ottimo spunto su come gestire i cicli!
Grazie a tutti!

felice che tu abbia risolto... però devo ammettere che vedendo la soluzione proposta da docsavage, la mia sembra più una soluzione da agricoltore piuttosto che da programmatore... ma bene o male siamo comunque in argomento... :wink:

docsavage:
@Fratt
detto da te è un bel complimento, grazie

bah, non esageriamo, quelli bravi qui sopra sono sicuramente altri.

piccola curiosità OT... io cominciai col C solo un anno dopo di te...

doc . si vede che scrivi bene ...

ho capito + cose dai tuoi post che sulla guida di ARDUINO .. grazie

ci provo anche io con mio figlio .... ma credo sia necessario insegnargli prima a scrivere :slight_smile:

ma perché ho il limite dei 5 minuti ????? è snervante >:(

lelo732000:
ma perché ho il limite dei 5 minuti ????? è snervante >:(

Perché sei nuovo e NON hai ancora il numero di post sufficienti per eliminare la limitazione (fatta per limitare gli "Spammer").

Guglielmo