Ho fatto la dissolvenza sull'illuminazione del LCD...

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); } } }

Reply to
Drizzt do'Urden
Loading thread data ...

Il 29/10/19 23:20, Drizzt do'Urden ha scritto:

Piu`facile postare l'esempio che spiegare (soprattutto a quest'ora :P), se non e` chiaro fischia.

bool unReleAcceso = ( (digitalRead(rele_AP) == HIGH) || (digitalRead(rele_CH) == HIGH) );

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

Reply to
Claudio_F

Il 30/10/2019 01:41, Claudio_F ha scritto:

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 :-)

Reply to
Drizzt do'Urden

Il 30/10/2019 09:57, Drizzt do'Urden ha scritto:

Falso allarme, era un filino del tasto_CH scollegato, ora funziona

chiamate la protezione civile che mi sono perso fra il codice :-)

Reply to
Drizzt do'Urden

Il 30/10/19 09:57, Drizzt do'Urden ha scritto:

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 ;)

Reply to
Claudio_F

Il 30/10/2019 10:37, Claudio_F ha scritto:

Forse non hai letto il mio precedente post il problema era un filo staccato del pulsante chiusura.

Ora funziona tutto perfettamente, sei un genio, davvero, sono sbalordito

Esiste un "metodo" per svolgere il codice e non perdersi nel susseguirsi delle istruzioni?

Inizio a leggere poi mi perdo lungo la strada

facile :-)

In pratica, la cosa da fare prima di iniziare sarebbe quella di

Con tutta la pazienza che avete con me vi meritate quanto meno una

Reply to
Drizzt do'Urden

Il 30/10/19 11:08, Drizzt do'Urden ha scritto:

Non avevo fatto in tempo.

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.

Eh si ci vorrebbe :DDD

Reply to
Claudio_F

Il 30/10/2019 11:48, Claudio_F ha scritto:

ho provato tutte le combinazioni ma vuole solo il punto esclamativo e =

manuale fa vedere !=

vero, ho provato ora e funziona :-)

Io sono romagnolo di Ravenna, se sei vicino... :-)

Reply to
Drizzt do'Urden

"Drizzt do'Urden" ha scritto nel messaggio news:qpbnf6$taq$ snipped-for-privacy@gioia.aioe.org...

!= vuol dire diverso, la or logica si scrive ||, la or a bit si scrive |

quale e' la parte di codice incriminata ?

Reply to
alfio

"Drizzt do'Urden" ha scritto nel messaggio news:qpbrqu$1io2$ snipped-for-privacy@gioia.aioe.org...

=

altro

sono 2 operatori diversi, quindi stai sbagliando qualcosa.

posta il codice con il != che tu scambi per OR.

Reply to
alfio

Il 30/10/19 18:54, alfio ha scritto:

bool unReleAcceso = ( (digitalRead(rele_AP) == HIGH) || (digitalRead(rele_CH) == HIGH) );

Io chiederei... esattamente che errore segnala il compilatore?

Reply to
Claudio_F

Il 30/10/2019 19:12, Claudio_F ha scritto:

Eppure mi ha dato errore ogni volta che provavo (ma non ho letto attentamente il tipo di errore, mi indicava la riga e il simbolo quindi

errore. Boh, evidentemente sbagliavo qualcosa -_-

Reply to
Drizzt do'Urden

Il 30/10/2019 19:12, Claudio_F ha scritto:

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)) { //

Reply to
Drizzt do'Urden

Il 30/10/2019 19:12, Claudio_F ha scritto:

digitale AND l'ho sempre visto come "entrambi" invece in programmazione

quindi

if (stato1==0) && (stato2==1)

significa che basta che stato1 sia a 0 per far eseguire l'if

invece

if (stato1==0) & (stato2==1)

significa che verifica anche stato2

Giusto?

Reply to
Drizzt do'Urden

Il 30/10/19 20:09, Drizzt do'Urden ha scritto:

Si che e` la stessa cosa...

No :)

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).

Reply to
Claudio_F

Il 30/10/2019 20:19, Claudio_F ha scritto:

sono proprio negato :-(

fosse vero comunque non servirebbe.

altrimenti basta il primo che sia vero.

Ok, ora ho capito, anche stavolta hai spiegato perfettamente, grazie :-)

Si ma qui le pizze aumentano di numero :-P

Reply to
Drizzt do'Urden

Il 31/10/2019 07:40, alfio ha scritto:

funzionamento del programma non cambia.

--
Saluti da Drizzt. 


www.agidone.altervista.org 
http://www.tappezzeriagraziella.com/ 
MAI PIU' OPEL IN VITA MIA!!!!
Reply to
Drizzt do'Urden

Il 31/10/19 10:20, Drizzt do'Urden ha scritto:

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.

Invece:

12 && 3 = 1 12 & 3 = 0
Reply to
Claudio_F

Il 30/10/2019 20:31, Drizzt do'Urden ha scritto:

Ricordo che AND significa che tutti e due gli stati devono essere veri

OK" altrimenti "se A OR B sono veri allora basta che uno degli operatori

Gab

--

https://www.avast.com/antivirus
Reply to
Gab

da".

Reply to
marimbarza

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.