Arduino, istruzione if fra due valori.

Oct 07, 2019 47 Replies

Il 07/10/19 23:50, Franz_aRTiglio ha scritto:

Sono costanti predefinite:

1 == true == HIGH 0 == false == LOW

Tant'e` vero che (1 + true + HIGH) == 3 :)

per via dei multistati pull_up/down ?

Il 08/10/19 00:08, Franz_aRTiglio ha scritto:

eh? (cit.)

Il 07/10/2019, Franz_aRTiglio ha detto :

Poi leggo che il dialetto arduino supporta il boleano true e false quindi non servono proprio "ON e OFF":

Boolean tasto = (digitalRead(8) = HIGH)

ogni altro caso; rimaneggiando il tuo codice:

int stato; //e questo a che serve ???? non c'e' nel codice int conteggio;

const int PREMUTO = 1; const int RILASCIATO = 0;

long t0; long t;

void setup() { Serial.begin(9600); pinMode(8, INPUT); stato = RILASCIATO; //e questo a che serve ???? non c'e' nel codice conteggio = 0; }

void loop(){

Boolean tasto = (digitalRead(8) = HIGH) if ((conteggio == 0) && tasto == true) { conteggio = true; t0 = millis(); digitalWrite(12, HIGH); Serial.println("Premiuto tasto"); }

if ((conteggio == true) && (tasto == false)) { conteggio = false; t = millis() - t0; if ((t >= 100) && (t 1000){ digitalWrite (12, LOW);} Serial.print("tempo="); Serial.println(t); } }

Il 08/10/2019, Claudio_F ha detto :

per me e' la cipolla (semicit.)

Dopo dura riflessione, Franz_aRTiglio ha scritto :

intendevo: dato che non ho MAI maneggiato arduino non capisco lo scopo di HIGH e LOW se poi sono ridondanti con TRUE e FALSE, chiedevo per

diversi oltre che al riferimento mnemonico, io arrivo da una "scuola" ove ogni bit e ciclo macchina era preziosissimo e fatico a concepire

e domandavo se potesse avere un senso visto che se nonho male l'oggetto e' multistato on/pull_up/pull_down/off...

Il 08/10/2019, Franz_aRTiglio ha detto :

dislessia portami via, manca un "capito":

capito

Il 08/10/19 00:21, Franz_aRTiglio ha scritto:

Immagino che gli ideatori abbiano pensato di "astrarre":

- usare true/false per le condizioni e variabili booleane

- usare LOW/HIGH per i livelli di ingresso/uscita

- usare 0/1 dove si trattano valori numerici

...il tutto solo per "chiarezza" o_O

Il fatto e` che e` una chiarezza niente affatto chiara per i principianti quali sono la maggior parte degli utenti arduini

Personalmente non vedrei nessuna difficolta` nell'usare dappertutto solo

0 e 1.

Il 08/10/19 00:15, Franz_aRTiglio ha scritto: > Boolean tasto = (digitalRead(8) = HIGH)

boolean tasto = (digitalRead(8) == HIGH)

ma allora ancora meglio e piu` espressivo:

boolean premuto = (digitalRead(8) == HIGH)

Claudio_F ha spiegato il 08/10/2019 :

guarda, mi son trattenuto dal postare arcani tipo

if ( variabile = true == true) per semplificare per non complicargli

simulatore e ora sto pasticciando, tempo permettendo.

Il 07/10/19 17:03, Drizzt do'Urden ha scritto:

Il problema e` che va eliminato sia all'attacco che al rilascio.

Effettuare il debounce dentro la logica di gestione e` complicatissimo.

Effettuarlo invece "a parte", appena dopo la lettura dell'ingresso, e dare alla logica un valore pulito, e` molto piu` semplice.

unsigned long t; boolean inConteggio; unsigned long tDeb; byte premutoPrec; //------------------------------------------------- void setup() { pinMode(8, INPUT); inConteggio = false; premutoPrec = LOW; tDeb = millis() } //------------------------------------------------- void loop() { boolean premuto = (digitalRead(8) == HIGH);

if (premuto == premutoPrec) { tDeb = millis(); } else if (millis()-tDeb > 50) { premutoPrec = premuto; } premuto = premutoPrec;

if (!inConteggio && premuto) { t = millis(); accendi(); inConteggio = true; } else if (inConteggio && !premuto) { unsigned long trascorso = millis() - t; if (trascorso > 1000) { spegni(); } inConteggio = false; } }

Il 07/10/2019 23:31, Franz_aRTiglio ha scritto:

Ciao e grazie per l'impegno, spero tanto non stiate "lavorando" per nulla visto quanto sono zuccone :-)

Il codice per misurare il tempo premuto l'ho preso da un tutorial di Paolo Aliverti, me li sto guardando per imparare qualcosa e mi sto anche

attivare l'uscita quando mi serve, effettivamente anche io mi sono

miglior chiarezza per chi non conosce l'elettronica:

Il 08/10/2019 00:15, Franz_aRTiglio ha scritto:

Dunque, stamattina, prima di fare qualsiasi modifica al programma ho creato un anti rimbalzo hardware, giusto per vedere come reagiva Arduino e infatti il programma funziona (al di la di come sia scritto, sicuramente da snellire), mi rimane il dubbio del funzionamento del if

non vedo altro motivo per cui i rimbalzi vengano visti. Ora provo anche il tuo listato :-)

thread.

Prova questo sito di simulazione con arduino :

formatting link

programmazione, funziona bene.

In questo caso non ti aspettare la giusta soluzione in simulazione :)

Il 08/10/2019 00:15, Franz_aRTiglio ha scritto:

Ho provato e con le dovute modifiche date dal linguaggio di arduino, funziona pure questo perfettamente, naturalmente con l'anti rimbalzo hardware, senza fa lo stesso difetto:

const int PREMUTO = 1; const int RILASCIATO = 0; int stato; int conteggio; long t0; long t;

void setup() { Serial.begin(9600); pinMode(2, INPUT); pinMode (12, OUTPUT); stato = RILASCIATO; //e questo a che serve ???? non c'e' nel codice conteggio = 0; }

void loop(){

boolean tasto = (digitalRead(2) == true); if ((conteggio == 0) && tasto == HIGH) { conteggio = HIGH; t0 = millis(); digitalWrite(12, HIGH); Serial.println("Premiuto tasto"); }

if ((conteggio == HIGH) && (tasto == LOW)) { conteggio = LOW; t = millis() - t0; if ((t >= 100) && (t 1000){ digitalWrite (12, LOW);} Serial.print("tempo="); Serial.println(t); } }

Il 08/10/2019 11:53, Franco Af ha scritto:

Grazie :-)

casi simili a quelli di un campo di database che distingue tra valore nullo e campo non assegnato. Non sono nel linguaggio C/C++ ma si incontrano spessissimo programmando.

- Vuoi la risposta in cm o in Euro?

Nel suo scritto precedente, Drizzt do'Urden ha sostenuto : ro che

No: e' il risultato logico dei controlli tra le parentesi:

int zz;

void loop() { zz++; if (zz >10 && zz

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

Alla pressione mi sembra che non ci siano effetti negativi sull'uscita, la variabile conteggio puo` oscillare un po' di volte da ON a OFF e viceversa ma l'uscita HIGH rimane HIGH (a proposito la digitalWrite HIGH nel secondo if non serve a niente, l'uscita e` gia` stata accesa nel primo if).

Invece al rilascio ogni rimbalzo fa riattivare il primo if e riaccendere l'uscita.

Hai visto anche la mia soluzione dell'1:22?

Il 08/10/2019 17:41, Claudio_F ha scritto:

Si, l'ho vista ora, oggi ho avuto da fare e non ho avuto tempo di fare delle prove, spero domani pomeriggio... non riesco mai a seguire la cosa come vorrei.

Saluti da Drizzt. www.agidone.altervista.org http://www.tappezzeriagraziella.com/ MAI PIU' OPEL IN VITA MIA!!!!

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required