Problema con variabile contatore

ciao a tutti. ho scritto questo codice ma vorrei risolvere un problema. in pratica tenendo premuto un sensore si accende un led, allo stesso tempo parte un contatore. Quando il contatore arriva a 10 il led si dovrebbe spegnere, anche se il sensore continua ad essere premuto, e rimanere spento. Come mai questo non succede? Ho pensato al fatto che dovrebbe esserci un comando che blocchi il contatore a 10 e per questo ho inserito if (t > tMax) {t = tMax}, il contatore si ferma a tMax ma il led non si spegne, o per lo meno si spegne giusto per il tempo del delay che ho inserito per distanziare le misurazioni del sensore :face_with_monocle:
qualche consiglio/aiuto?
grazie in anticipo

int led = 6;
int t = 0;
int tMax = 10;

void setup() {
  pinMode(2, INPUT);
  pinMode(6, OUTPUT);
  Serial.begin(9600);

}

void loop() {
  if (digitalRead(2) == HIGH){
    t++;
    Serial.println(t);
    digitalWrite(led, HIGH);
    delay(500);
}
  if (t > tMax) {t = tMax;}

  if (digitalRead(2) == HIGH && t == 10){
    digitalWrite(led, LOW);
    delay(500);
    
}
  if (digitalRead(2) == LOW){
    Serial.println("Sensor untuched");
    digitalWrite(led, LOW);
    delay(500);
}


}

Ciao, penso che nel primo e nell’ultimo if dovresti controllare come sta questo t, vedi se ti si addice meglio:

int led = 6;
int t = 0;

void setup() {
  pinMode(2, INPUT);
  pinMode(6, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  if (digitalRead(2) == HIGH) {
    Serial.println("premuto il pulsante ");
    while (digitalRead(2) == HIGH) { //correre fino al rilascio del pulsante
      t++;
      Serial.println(t);
      if (t <= 10)
        digitalWrite(led, HIGH);
      }
      else {
        digitalWrite(led, LOW);
      }
      delay(500);
    }
  }
  digitalWrite(led, LOW);
  Serial.println("rilasciato il pulsante ");
  //mettere t = 0 quando applicabile
}

Saluti.

1 Like

Restando sulla logica iniziale, io toglierei il terzo if e nel primo aggiungerei l’and con t < tMax

1 Like

ottima soluzione, arrivato a 10 il led si spegne e anche riattivando il sensore rimane spento. magari aggiungerò per conto mio un pulsante di reset.
grazie!!

ok l’ho adattato un pochino, il risultato è questo:

int led = 6;
int t = 0;

void setup() {
  pinMode(2, INPUT);
  pinMode(6, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  if (digitalRead(2) == HIGH) {
    Serial.println("premuto il pulsante ");
    digitalWrite(led, HIGH);
    while (digitalRead(2) == HIGH) { //correre fino al rilascio del pulsante
      t++;
      delay(500);
      Serial.println(t);
      if (t > 10){
        digitalWrite(led, LOW);
      }
    }
  }
      else {
        digitalWrite(led, LOW);
      }
      delay(500);
   
  
  digitalWrite(led, LOW);
  Serial.println("rilasciato il pulsante ");
  //mettere t = 0 quando applicabile
}

funziona anche questa soluzione, ma mi fa un piccolo errore: quando sono passati i 10 conteggi e si riattiva il sensore, per una frazione di secondo si riattiva anche il led. Credo comunque di riuscire a risolverlo. Grazie mille per il vostro tempo!!

Questo piccolo errore si verifica perché si accende il led senza aver prima controllato la t. Modificare:
digitalWrite (led, HIGH); per:
if (t <= 10) {digitalWrite (led, HIGH); }.
e l’errore sarà risolto.
Saluti.

1 Like

ottimo, grazie! :+1: