Ho provato e dopo un paio di ore che impazzivo ci sono riuscito ma
// PARTE PER ACCENSIONE E SPEGNIMENTO ILLUMINAZIONE LCD // ACCENDE AL 100% DELLA LUMINOSITA' E SPEGNE IN DISSOLVENZA FINO AD ARRIVARE AL VALORE SETTATO DAL TRIMMER //ATTENZIONE: DURANTE IL CICLO FOR DI ATTENUAZIONE DELLA LUMINOSITA' IL MICRO NON ACCETTA ALTRI COMANDI!!!!!
if ((digitalRead (rele_AP) == HIGH)) { analogWrite(illumina_lcd, 255); //accende l'LCD con PWM a 100% stato_ap_on=1; //setta lo stato apertura a 1 }
if ((digitalRead (rele_AP))&(stato_ap_on == 1)) { tempo_lcd=millis(); }
if ((millis()-tempo_lcd)>2000) { if (stato_ap_on==1) { tempo_lcd=millis(); stato_ap_on=0; for (int i=255; i>= setbassaluce_lcd; i--) { analogWrite(illumina_lcd, i); delay(10); } } }
if ((digitalRead (rele_CH) == HIGH)) { analogWrite(illumina_lcd, 255); stato_ch_on=1; }
if ((digitalRead (rele_CH))&(stato_ch_on == 1)) { tempo_lcd=millis(); }
if ((millis()-tempo_lcd)>2000) { if (stato_ch_on==1) { tempo_lcd=millis(); stato_ch_on=0; for (int i=255; i>= setbassaluce_lcd; i--) { analogWrite(illumina_lcd, i); delay(10); } } }
if (RIPOSO == stato) // attesa avvio di un rele' { if (unReleAcceso) { analogWrite(illumina_lcd, 255); // PWM 100% stato = RELE_ATTIVI; } } else if (RELE_ATTIVI == stato) // attesa spegnimento rele' { if (!unReleAcceso) { tempo_lcd = millis(); stato = PAUSA; } } else if (PAUSA == stato) // pausa prima della dissolvenza { if (unReleAcceso) // se di nuovo un rele' acceso { stato = RELE_ATTIVI; } else if ((millis() - tempo_lcd) > 2000) // timeout { tempo_lcd = millis(); i = 255; stato = DISSOLVENZA; } } else if (DISSOLVENZA == stato) // esegue passi dissolvenza { if (unReleAcceso) // se si nuovo un rele' acceso { stato = RIPOSO; } else if ((millis() - tempo_lcd) > 10) // passo dissolvenza { tempo_lcd = millis(); i--; analogWrite(illumina_lcd, i); if (i
fiiiiiiii :-) Funziona ma solo col tasto di apertura, sembra che l'OR sul bool unReleAcceso non lavori ma il compilatore non da errore, che sia un limite di arduino?
Esiste un "metodo" per svolgere il codice e non perdersi nel susseguirsi delle istruzioni? Inizio a leggere poi mi perdo lungo la strada :-)
No, ci deve essere qualche inghippo nella parte che non vediamo.
L' OR si scrive ||
Invece tu metti quel diverso che di fatto e` uno XOR (che si scrive ^)
Visto che i termini di quell'espressione logica non sono mai veri contemporaneamente (o cosi` dovrebbe essere) usare OR o XOR e` indifferente.
Dietro la complessita` c'e` sempre una struttura generale piu` semplice. Dal mio punto di vista quelle non sono 43 righe di codice, ma un 'if/else if' a quattro rami. Ad ogni giro di loop viene eseguito solo quello selezionato dal valore attuale delle variabile 'stato' (che rappresenta la situazione attuale). Dentro lo stato/ramo attivo viene valutato if che controlla se avviene qualche evento interessante per quella situazione. Dopo di che le operazioni all'interno degli if interni sono le azioni da svolgere al verificarsi dell'evento.
E` semplicemente la traduzione letterale della logica scritta in italiano. Impostarla in questo modo (cioe` schematizzare tutto a "situazioni", eventi e azioni) semplifica molto qualsiasi compito:
SE situazione RIPOSO: SE viene acceso un rele`: accendi LCD nuova situazione = RELE_ATTIVI
INVECE SE situazione RELE_ATTIVI: SE tutti rele` spenti: memorizza tempo nuova situazione = PAUSA
INVECE SE situazione PAUSA: SE di nuovo un rele` acceso: torna a situazione RELE_ATTIVI INVECE SE timeout 2s: predisponi variabili per dissolvenza nuova situazione = DISSOLVENZA
INVECE SE situazione DISSOLVENZA: SE di nuovo un rele` acceso: torna a situazione RIPOSO (riaccende LCD) INVECE SE timeout passo dissolvenza di 10ms: aggiorna variabili dissolvenza scrivi nuova luminosita` LCD SE arrivati alla fine: nuova situazione = RIPOSO
Come si fa a capire quali situazioni devono essere contemplate? Semplice, si analizzano le fasi di funzionamento/avanzamento del sistema: o ogni attesa di qualcosa e` una diversa fase/situazione in cui si puo` permanere piu` o meno a lungo, fino al verificarsi di un qualche evento.
Tutto cio` non riguarda Arduino, o il linguaggio C, ma sono concetti generali di design applicabili ovunque (se situazione fermo al semaforo, se diventa verde, se a destra c'e` un incidente allora gira a sinistra).
Quindi e` cosi` che si legge: come sequenza esplicita di fasi/situazioni. Capito questo hai capito cose che tanti programmatori da anni non hanno ancora affrontato ;)
Non e` che provi a scrivere !! invece di || ? Comunque Arduino accetta direttamente anche le parole and or not.
Direi che e` fondamentale se lo si vuole "spiegare" alla macchina ;) Se funziona su carta poi salvo errori di traduzione funziona anche su silicio. Un errore comune e` quello ci buttare giu` righe "sperando" che le istruzioni facciano quello che ci serve, invece di chiarire prima di tutto a noi stessi le varie fasi.
Serve soprattutto all'inizio. Ci sono molti schemi diversi a seconda del tipo di analisi che si sta facendo, flusso delle informazioni, degli stati, delle singole istruzioni. Ma in pratica gia` riuscire a descrivere la logica in italiano come detto prima e` essere a cavallo.
Cercando in rete spiegazioni sugli operatori singoli e doppi che siano a prova di Drizzt :-) Ho trovato questa spiegazione che mi ha chiarito le differenze fa i tipi di operatori.
bella lacuna.
formatting link
int a = 9; int b = 0; if ((b != 0) && (a / b > 1)) { //
Se usi && vengono valutati i termini dell'espressione logica fino al primo trovato falso. Se tutti i termini sono veri l'espressione risulta vera, altrimenti falsa.
Se usi || vengono valutati i termini dell'espressione logica fino al primo trovato vero. Se tutti i termini sono falsi l'espressione risulta falsa, altrimenti vera.
Invece & | ^ ~ sono operatori matematici come + - * / %, effettuano operazioni sui valori per cui *non e` corretto* usarli per creare un'espressione logica (anche se per specifici casi funzionano lo stesso, quando il risultato matematico delle operazioni coincide con il risultato che fornirebbe l'espressione logica).
Se si lavora *solo* con valori 0/1 (o LOW/HIGH o false/true che sono la stessa cosa) il risultato finale non cambia, sono interscambiabili e si ottiene sempre uno 0 o un 1.
ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here.
All logos and trade names are the property of their respective owners.