Temporizzazione variabile ledState

e come verrebbe secondo te?

Claudio_FF scusami ma non riesco a capire, potresti spiegarmi meglio!!! :slight_smile: :slight_smile:

Nel post #18 ho scritto in chiaro l'intera procedura stato per stato, basandomi su quello che hai provato a fare nel post #17. Cosa non è chiaro?

non è chiaro perchè non mi funziona ancora:
ecco il listato

void loop0() {

  if (cont2 == 0) {
    digitalWrite (ledPin110, LOW);
    digitalWrite (ledPin230, LOW);
    t4 = millis();
    stato1 = 1;
  }
}

void loop1() {
  dt4 = millis() - t4;
  if (dt4 >= 500) {
    digitalWrite (ledPin110, LOW);
    digitalWrite (ledPin230, HIGH);
    stato1 = 2;
  }
}

void loop2() {
  if (cont2 == 1 or cont2 == 2 or cont2 == 3) {
    digitalWrite (ledPin230, LOW);
    digitalWrite (ledPin110, LOW);
    t5 = millis();
    stato1 = 3;
  }
}

void loop3() {
    dt5 = millis() - t5;
    if (dt5 >= 500) {
      digitalWrite (ledPin230, ledState3);
      digitalWrite (ledPin110, ledState4);
      stato1 = 0;
  }
}

se potresti dargli un'occhiata

Gli stati sono sintatticamente corretti, la gestione dei tempi è formalmente corretta.

Quello che non possiamo sapere è:

  • se la macchina a stati viene chiamata correttamente senza impedimenti da altre parti del programma
  • se il valore delle variabili 'ledState3' 'ledState4' che usi alla fine è sensato
  • se i tipi e i valori iniziali delle variabili sono corretti
  • se le condizioni di transizione
    if (cont2 == 0)
    e
    if (cont2 == 1 or cont2 == 2 or cont2 == 3)
    che sono corrette sintatticamente, lo sono anche dal punto di vista della logica che vuoi realizzare.

se la macchina a stati viene chiamata correttamente senza impedimenti da altre parti del programma
credo di si, ecco la parte messa nel loop:

switch (stato1) {

   case 0:

     loop0();

     break;

   case 1:

     loop1();

     break;

   case 2:

     loop1();

     break;

   case 3:

     loop1();

     break;

 }

se il valore delle variabili 'ledState3' 'ledState4' che usi alla fine è sensato
ecco la parte del 'ledState3' 'ledState4':

int reading3 = digitalRead(puls110e230);

 if (reading3 != lastButtonState3) {

   lastDebounceTime3 = millis();

 }

 if ((millis() - lastDebounceTime3) > debounceDelay3) {

   if (reading3 != buttonState3) {

     buttonState3 = reading3;

     if (buttonState3 == HIGH) {

       if (cont2 == 1 or cont2 == 2 or cont2 == 3) {

         ledState3 = !ledState3;

         ledState4 = !ledState4;

         digitalWrite (ledPin230, LOW);

         digitalWrite (ledPin110, LOW);

         delay (500);

         digitalWrite (ledPin230, ledState3);

         digitalWrite (ledPin110, ledState4);

       }

     }

   }

 }


 lastButtonState3 = reading3;

se i tipi e i valori iniziali delle variabili sono corretti
le variabili sono tutte dichiarate come int

se le condizioni di transizione
if (cont2 == 0)
e
if (cont2 == 1 or cont2 == 2 or cont2 == 3)
che sono corrette sintatticamente, lo sono anche dal punto di vista della logica che vuoi realizzare.
si la logica è giusta, nel case3 voglio ritrovare i valori di ledState3 e ledState4

Non so proprio da che parte partire.

Sono due pezzi di software che non fanno altro che darsi fastidio, è del tutto inutile una macchina a stati se deve fare (quasi) lo stesso lavoro di un'altra parte di programma scritta non a stati, contenente dei delay, e che agisce sulle stesse uscite.

Manca completamente la logica di funzionamento complessiva.

Ripartiamo dall'inizio, quali ingressi, quali uscite, e procedura per fasi di funzionamento senza ambiguità o aspetti non chiari o dati per scontati, altrimenti a singoli pezzi scollegati tra loro e senza un progetto di insieme non se ne può uscire.

allora ho risolto brillantemente e soddisfacendo la mia esigenza con nella parte voidloop mettendo:

switch (stato1) {
    case 0:
      loop0();
      break;
    case 1:
      loop1();
      break;
    case 2:
      loop2();
      break;
    case 3:
      loop3();
      break;
  }

e fuori dal loop:

void loop0() {
  if (cont2 == 0) {
    if (ledState4 == HIGH) {
      digitalWrite (ledPin110, LOW);
      digitalWrite (ledPin230, LOW);
      t4 = millis();
      stato1 = 1;
    }
  }
}

void loop1() {
  dt4 = millis() - t4;
  if (dt4 >= 500) {
    digitalWrite (ledPin110, LOW);
    digitalWrite (ledPin230, HIGH);
    stato1 = 2;
  }
}

void loop2() {
  if (cont2 == 1 or cont2 == 2 or cont2 == 3) {
    digitalWrite (ledPin230, LOW);
    digitalWrite (ledPin110, LOW);
    t5 = millis();
    stato1 = 3;
  }
}

void loop3() {
  dt5 = millis() - t5;
  if (dt5 >= 500) {
    digitalWrite (ledPin230, ledState3);
    digitalWrite (ledPin110, ledState4);
    stato1 = 0;
  }
}

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.