e come verrebbe secondo te?
Claudio_FF scusami ma non riesco a capire, potresti spiegarmi meglio!!!
![]()
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.