Spiegazione perfetta ! Non dimentichi niente. Riascoltandolo diverse volte quel che mi sembrava troppo complesso per le mie facoltà è risultato chiarissimo ! Grazie 🌟
ottimo video chiaro e comprensibile... ti seguo da poco e le tue spiegazioni mi piacciono molto, sto provando 2 schede pcf8574 collegete a I2C una per ingressi e una per uscite. mi piacerebbe poter utilizzare i pulsanti come interruttori e i led come il tuo video ma con le 2 schede. se fosse possibile un tuo video su questo argomento sarebbe gradito... grazie e complimenti ancora per il canale.
Al momento non abbiamo un video al riguardo, ma ti può essere di aiuto l'articolo www.mischianti.org/2019/01/02/pcf8574-i2c-digital-i-o-expander-fast-easy-usage/
Ciao grazie per i tuoi video, volevo farti una domanda riguardo questo sketch, in pratica ho capito che la riga 18 è fondamentale affinché funzioni tutto alla perfezione, ma non mi è molto chiara, a cosa serve di preciso e cosa accade se non la mettiamo?... potrei avere dei ulteriori delucidazioni? ne sarei grato.
La riga 18 ( pulsanteStato = lettura; ) aggiorna la variabile "pulsanteStato". Nella riga 14 viene effettuato un confronto (... lettura != pulsanteStato ...) che verifica che lo stato attuale ( la variabile lettura ) è cambiato rispetto alla precedente esecuzione della funzione "loop". Senza la riga 18 la variabile "pulsanteStato" avrebbe sempre il valore iniziale (ovvero LOW impostato nella riga 4).
Buongiorno, complimenti per il video. Da principiante sono riuscito a seguire bene la prima parte del video mentre mi sono un po' perso sul discorso debounce. Non è possibile stampare a video nel monitor seriale lo stato delle variabili nel tempo ed eventualmente avere la possibilità di fare una stampa per avere la possibilità di analizzare i dati con più calma?
Sulle schede più recenti, basate su SAMD (come per esempio MKR WiFi 1010 o Nano 33 IoT) puoi attivare il debugger per analizzare lo svolgimento dello sketch. Se usi invece le schede come Uno, Mega, ecc, l'unico modo è inserire manualmente le istruzioni Serial.println nello sketch, per visualizzare il valore della variabile quando viene eseguito quel pezzo di codice.
Ciao e grazie dei video. Volevo fare una domanda: come è possibile che caricando il programma in modo identico del video 3(ho controllato e ricontrollato) e dopo aver collegato Led e pulsante come mostri nel video, il risultato non sia quello sperato? Cioè facendo una leggera pressione o sul jump collegato al pulsante o sul jump collegato al Led il Led si accenda e si spenga in modo casuale.
Ciao, i rimbalzi del pulsante possono essere misurati con un oscilloscopio, però in ogni caso non è tanto la questione che uno sketch soffre di rimbalzi, perché con un pulsante perfetto (che cambia stato istantamente senza oscillare) nello sketch non ci sarebbe bisogno di affrontare il problema. Purtroppo, in realtà, è molto difficile che un pulsante non oscilli minimamente quando viene premuto o rilasciato. Se provi il primo esempio del video, togliendo "delay(10)", molto probabilmente ti accorgi che a volte il led non cambia stato dopo aver premuto il pulsante.
Salve, e complimenti per i video molto chiari e utili. Avrei una domanda. Da poco mi sto cimentando nel mondo di arduino e gia' sono riuscito a fare qualche semplice progettino. Come posso utilizzare arduino con lo sketch utilizzato nel viedeo ma con 10 pulsanti? grazie mille per la disponibilita'.
Occorre creare delle variabili per ogni pulsante. Nel video www.italiantechproject.it/arduino/luci-di-natale-e-canzoni-natalizie-con-arduino trovi un esempio di come usare più di un pulsante nello stesso sketch.
Grazie per il tuo video, io dovrei usare, al posto del pulsante, un contatto pulito di un relè, quindi come se al posto del pulsante ci sia un interruttore con due poli (contato aperto / contatto chiuso), mi potresti indicare come devo cambiare il collegamento mettendo l'interruttore al posto del pulsante? Grazie per il tuo aiuto
Per usare un relè al posto del pulsante puoi collegare il contatto normalmente aperto a 5V, mentre il comune sia al pin di Arduino che a GND tramite un resistore.
Vorrei fare una domanda non direttamente collegata al video di questa lezione. Quanti if si possono nidificare? Il problema nasce dal fatto che volendo utilizzare 3 Led per simulare l'uscita di un dado a 6 facce, volevo farlo nidificando il comando if. Grazie
Ciao e grazie mille per questo ottimo tutorial! Volevo chiederti un aiuto. E' possibile modificare il codice in modo che, pigiando il pulsante, il LED inizi a lampeggiare (ossia, si accenda e si spenga con intervalli di un secondo) e, pigiandolo nuovamente, il LED si spenga? Grazie mille e un caro saluto!
@@TechMaker , Grazie mille! Mi daresti qualche suggerimento su come fare. Il problema è che non so come modificare il loop per ottenere l'intermittenza senza sovrappormi all'ultimo comando di aggiornamento della variabile "lettura". Un caro saluto!
Devi basarti sul tempo trascorso e non sui ritardi delay, per far lampeggiare il LED. Con un ritardo delay è impossibile eseguire altre azioni e di conseguenza rilevare la pressione del pulsante. Nel video con le luci di Natale ( www.italiantechproject.it/arduino/luci-di-natale-e-canzoni-natalizie-con-arduino ), puoi vedere un esempio di come integrare la lettura dei pulsanti con altre azioni eseguite all'interno dello stesso sketch.
ciao! bel video, io riscontro un problema: molto spesso premendo il tasto il led non si spegne, a volte si a volte no. Mi pare di capire che tutto dipenda dalla velocità d'esecuzione e dal fatto che l'arduino potrebbe non captare il segnale...ma come si risolve? Ho provato anche ad utilizzare il debounce ma non cambia nulla... grazie mille, buonaserata
La variabile "pulsanteStato" non avrà sempre il valore LOW, ma ad ogni esecuzione del loop assumerà il valore letto nell'iterazione precedente. Il controllo serve a evitare che LED cambi lo stato continuamente per tutta la durata quando sul pin viene rilevato il valore HIGH.
ciao vorrei porvi un problema che mi assilla e che non riesco a risolvere allego il file per chiarezza il punto è che voglio conteggiare dei numeri su 4 matrici a led e una per volta conteggiare da 0 a 9 raggiunto il numero desiderato passare alla successiva matrice . il problema è che lavora sempre sulla prima matrice e non riesco a farla conteggiare alla successiva ho usato return pur non sapendo come funziona ma vedo che no ho risolto sono quasi certo che l'inghippo è nel loop però non so risolverlo mi aiutate? grazie per quanto vorrete dirmi e ancora complimenti per il vostro lavoro
Nel codice, il numero di matrice viene incrementato soltanto quando il pin 7 ritorna LOW, quindi per passare alla matrice successiva bisogna rilasciare il pulsante nell'esatto millisecondo quando finisce il delay dopo l'ultima cifra sulla matrice precedente, che è fisicamente impossibile. L'incremento dovrebbe avvenire dopo aver terminato il conteggio sulla matrice precedente.
Per ogni pulsante o LED aggiuntivo serve dedicare un pin della scheda di Arduino e creare le relative variabili per gestirlo allo stesso modo di quelli già presenti.
Buonasera a tutti. Sono nuovo nell'ambiente di arduino. Non capisco come mai quando connetto Arduino al computer il LED lampeggia anziché rimanere spento e il pulsante non funziona. Mi potete dare una mano? Grazie mille
Avevo invertito il Senso del pulsante. Praticamente mi entra in loop , quindi il LED continuava a lampeggiare , e il pulsante, non avendo i collegamenti corretti , non funzionava .
ciao mi puoi spiegare if entrambi casi è vero ,sè clikko il pulsante la variabile lettura diventa HIGH diversa da pulsanteStato (LOW) ,if vero perché diversi,ma se rilasciato il pulsante lettura diventa LOW, pulsanteStato (LOW) ,in questo caso if non è più vero essendo che sono uguali e non diversi,perché dici entrambi casi veri? mi spieghi dove che sbaglio nel ragionamento? grazie mille
In entrambi i casi IF sarebbe vero, considerando che la variabile "pulsanteStato" non conterrà sempre il valore LOW, ma sarà aggiornata, alla fine dello sketch, con l'ultima lettura rilevata. Quindi in ogni ciclo del loop, conterrà il valore rilevato nel ciclo precedente. Il controllo con la lettura precedente è necessario per evitare che lo stato del LED cambi in continuazione mentre il pulsante è premuto. Quindi all'inizio "pulsanteStato" è uguale a LOW, di conseguenza finché il pulsante non è premuto, IF sarà falso, visto che "lettura" (LOW) è uguale a "pulsanteStato" (LOW). Se premiamo il pulsante, IF diventa vero, permettendo al LED di cambiare stato. Se, a questo punto, non venisse aggiornata la variabile "pulsanteStato", nel successivo ciclo del loop, la condizione sarebbe ancora vera e quindi il LED cambierebbe di nuovo lo stato, senza che il pulsante sia rilasciato e premuto di nuovo. L'aggiornamento della variabile "pulsanteStato" permette di evitare ciò, però allo stesso tempo fa si che IF diventi vero quando rilasciamo il pulsante, in quanto "lettura" (LOW) sarà diversa da "pulsanteStato" (HIGH). Per cui dobbiamo aggiungere "lettura" uguale a HIGH nella condizione, per assicurarci che il LED cambi stato solo quando premiamo il pulsante. Spero di essermi spiegato meglio, in quanto nel video ho dato per scontato che la variabile "pulsanteStato" dovesse essere aggiornata, ancora prima di averlo scritto.
Italian Tech Project ciao sto ancora ragionando sullo sketch ma ancora ragionando non arrivo,sbaglio qualcosa ,ecco il mio ragionamento: avvio il programma senza schiacciare niente non succede niente 😆😆 , lettura LOW pulsanteStato LOW, schiaccio il pulsante e rilascio lettura assume valore HIGH diverso pulsanteStato ma lettura ==HIGH (situazione vera) viene eseguito il codice tra le graffe avviene il cambio di stato del led da LOW a HIGH ,poi pulsanteStato = lettura; cioè lettera e HIGH pulsanteStato assume HIGH,ora nel if mi ritrovo lettura HIGH pulsante HIGH,cliccando di nuovo il pulsante lettura diventa LOW pulsanteStato HIGH sono diversi ma lettura non è uguale ==HIGH quindi non succede niente,c'è qualcosa che nn va nel mio ragionamento ma cosa? mi blocco la. grazie scusa che lo devo capire prima di andare avanti
Italian Tech Project Ciao facendo un ragionamento più lento lo possiamo sintetizzare in questo modo: Supponiamo di mettere il dito sul pulsante senza alzare Variabile lettura diventa HIGH diversa da pulsanteStato ==HIGH condizioni vera avviene il cambio di stato del led nella variabile pulsanteStato =lettura cioè pulsanteStato HIGH loop torna da capo nel if lettura risulta HIGH pulsanteStato HIGH e non succede niente appena alziamo il dito da pulsante variabile lettura diventa LOW PulsanteStato HIGH sono diversi ma non uguale a lettura ==HIGH quindi non succede niente,loop continua ad seguire il codice pulsanteStato =lettura diventa pulsanteStato LOW e viene inserito nel if ,quindi ci troveremo nelle situazione del if lettura LOW pulsanteStato LOW al prossimo clikko sul pulsante si avrà il cambio di stato giusto come ragionamento? Grazie
Si, il ragionamento è giusto. Visto che loop viene eseguito con una frequenza molto elevata, anche schiacciando il pulsante molto velocemente, Arduino riesce comunque a percepire sia quando il pulsante viene premuto che quando viene rilasciato. Nel secondo caso, rilasciando il pulsante, la variabile "pulsanteStato" torna al valore LOW e di conseguenza la situazione ritorna al punto di partenza, permettendo così il cambio di stato del LED alla successiva pressione sul pulsante.
Ciao scusami ho fatto tutto solo che nel set che ho preso di arduino ho resistenze da 10k per cui ne ho messe 10 in serie per arrivare a 100k ma non funziona sapresti dirmi per caso quale puo essere il problema?grazie
@@TechMaker Niente ho risolto semplicemente il pulsante non era connesso all'alimentazione a quanto pare l'alimentazione della mia breadboard funziona a metà e metà quindi se do alimentazione a sinistra mi alimenta solo la metà di sinistra e viceversa Quella di destra Grazie mille 😁
Avevo fatto questo progetto tempo fa e ora sto cercando di perfezionarlo... sono abbastanza nuovo con Arduino. Comunque quando provo a caricare un progetto sul mio Arduino Uno (originale) mi da un'errore di caricamento: Arduino:1.8.5 (Windows 10), Scheda:"Arduino/Genuino Uno" Lo sketch usa 1354 byte (4%) dello spazio disponibile per i programmi. Il massimo è 32256 byte. Le variabili globali usano 15 byte (0%) di memoria dinamica, lasciando altri 2033 byte liberi per le variabili locali. Il massimo è 2048 byte. avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x8e avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x8e avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x8e avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x8e avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x8e avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x8e avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x8e avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x8e avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x8e avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x8e Problema di caricamento sulla scheda. Guarda www.arduino.cc/en/Guide/Troubleshooting#upload per suggerimenti Qualcuno può aiutarmi?
Controlla che la versione dell'IDE sia aggiornata, e prova anche a disinstallare e reinstallare i driver. Se non funziona e se hai un'altra scheda di Arduino a disposizione, potresti provare a riscrivere il bootloader della scheda che non funziona (la procedura è analoga a come mostrato nel video "Come programmare il microcontrollore ATtiny85 usando la scheda di Arduino").
questo video perché e il momento di capire i millis (), nel video quando aggiungi: ultimoTempoDebounce=millis (); ultimoTempoDebounce prende il valore della conta di millis , ma quando inserisci : if ((millis ()-ultimoTempoDebounce)>attesaDebounce) i millis in questo ultimo if e il continuo della conta del primo millis ? (quello del primo if ultimoTempoDebounce=millis ();) grazie mille
I valori delle due chiamate alla funzione "millis" (anche se eseguite una dopo l'altra) potrebbero essere diversi, se tra una chiamata e l'altra sono trascorsi dei millisecondi. La funzione "millis" ritorna il numero di millisecondi dall'inizio del programma fino all'esatto momento della chiamata della funzione "millis", quindi ogni volta viene ritornato il valore aggiornato fino a quel momento.
in questo codice time=millis () nel void loop dopo che diventa maggiore e esegue il codice nel if al primo giro time e sempre uguale per il resto degli if? poi si aggiorna con il nuovo ciclo loop? void setup(){ time=millis(); letturaluce_time=mills(); servotime=millis(); letturadati=millis(); } void loop(){ time=millis(); if(time>letturaluce_time+5){ luce1=analogRead(SENSORELUCE1); letturaluce_time=millis(); } if(time>servotime1+15){ servo1.write(posservo1); servotime1=millis(); } if(time>letturadati+3000){ Serial.print("Sensore 1 : "); Serial.print(letturaluce1,DEC); Serial.print(" Posizione motore 1 : "); Serial.println(posservo1,DEC); Serial.print(" Differenza : "); Serial.println(letturaluce1-letturaluce2); letturadati=millis(); } }
Io da sempre utilizzo il sistema di una variabile di tipo int o anche più ampia che se minore di un certo tempo viene incrementata di 1. Quando raggiunto il valore scelto vado ad eseguire il codice all'interno dell' if che compara la mia variabile se è uguale a un valore scelto e poi la risetto a 0 e il ciclo ricomincia. Se imposto in alto un delay(1) tale variabile verrà incrementata di un millisecondo alla volta e se non metto delay devo aumentare il tempo poiché ho capito che il ciclo loop viene eseguito più velocemente di un millisecondo. Questo sistema ultra logico secondo te è corretto ? Perché con l'utilizzo del delay(1) impostato all'inizio del voidloop() se il programma deve scrivere su shiftregister e altre istruzioni complesse è come se il programma all'interno del Microcontrollore rallentasse e ho dovuto creare altri cicli void() che vengono eseguiti nel momento voluto e non sempre perché noto rallentamenti nel programma in esecuzione. È normale per te ?
Se vuoi eseguire una determinata azione a intervalli regolari, dovresti utilizzare la funzione millis() ed in particolare controllare il tempo passato dall'ultima volta che l'azione è stata eseguita. Contare i cicli loop è molto poco affidabile in quanto la velocità dipende dalla complessità delle istruzioni che vengono eseguite.
Immaginavo, infatti adesso sono riuscito a fare in modo che ad cambiamento del millis una variabile s'incrementa di 1 e posso utilizzarla per creare un sottoLoop più lento. Con questo principio quando i millis() vanno in overflow dal passagio dal numero massimo di nuovo allo zero comunque c'è una variazione del tempo trascorso e quindi la variabile viene sempre incrementata e così gestisce anche l'overflow del millis() perchè lo devo utilizzare in un orologio, e quindi deve funzionare sempre anche più di 47,7 giorni ovvero dopo il primo overflow dei millis(). Senza usare realtime rtc.
scusa, ma il pulsante lo metti in cortocircuito praticamente. Usi una resistenza per abbassare la corrente ma è in corto quando lo premi. giusto ? Non c'è un'altro sistema sulla bread per far rilevare ad arduino il cambio di stato del pulsante ?
La resistenza serve, infatti, per evitare il cortocircuito tra 5V e GND, quando il pulsante viene premuto. In questo modo puoi leggere sul pin digitale 5V (HIGH) quando premi il pulsante e 0V (LOW) quando lo rilasci.
ok. Ma come calcoli la resistenza da inserire ? Esiste poi un modo per arduino di verificare la pressione del tasto senza dare corrente ? magari valutando la resistenza ==> 0 (low) non premuto / X(high) premuto ?
Non c'è un valore giusto o sbagliato per la resistenza da inserire. Da un lato deve essere il più alto possibile per far passare il meno possibile la corrente quando il pulsante è premuto, però allo stesso tempo non troppo alto, perché altrimenti sarebbe equivalente a un circuito aperto, quindi il pulsante potrebbe risultare premuto anche se in realtà non lo è. Di solito si usa un valore di almeno 10kΩ. Per esempio con la tensione di 5V e la resistenza di 100kΩ, la corrente è di 0,05mA. Tutte le misurazioni effettuate da Arduino si basano sulla tensione, quindi è impossibile evitare completamente il passaggio della corrente.
ciao complimenti per il video,devo dire la verità nei tutorial che hai non è adatto a persone che si stanno avvicinando arduino e programmazione ,tutorial che fai già sono adatti per persone che hanno dimestichezza con C, io mi sto avvicinando da poco alla programmazione per fare un cambio di stato usi troppi variabili e incomicia a essere più complicato seguirti,puoi usare in metodo più semplice e comprensivo per noi, non ancora esperti,per poi più avanti spiegare questo altro metodo,sicuramente questo è un metodo migliore ,però un cambio di stato si può fare anche con meno variabile e meno codice, comunque complimenti sei molto esperto 😆
Grazie per la tua opinione, che ci aiuterà a migliorare. In effetti il secondo sketch, quello con la gestione "anti-rimbalzo", non è molto semplice da capire per chi non ha ancora molta pratica. L'intenzione era quella di offrire anche un modo alternativo per gestire il debouncing, senza aumentare eccessivamente il ritardo con la funzione delay, che impedisce al programma di eseguire il resto del codice. Se non si hanno particolari esigenze, ci si può fermare al primo sketch, che è più semplice. In questo caso, se il ritardo di 10 millisecondi, inserito alla fine, non dovesse bastare per contrastare i "rimbalzi", è sufficiente aumentare il tempo di attesa passato alla funzione delay.
sto provando questo codice if(digitalRead (10)==HIGH){ digitalWrite ((7),! digitalRead (7); } in pratica è un cambiamenti di stato del led, ho notato che avvolte avviene il cambiamento e avvolte no,così ho provato antiribalzo che usate voi , ma niente il cambiamento di stato avvolte avviene avvolte no, come mai? grazie
La condizione "digitalRead(10) == HIGH" non è sufficiente, perché anche premendo il pulsante molto velocemente, il codice del loop verrà eseguito moltissime volte e quindi il LED continuerà a cambiare lo stato da acceso a spento e viceversa, fino a fermarsi quando il pulsante viene rilasciato. Quei continui cambi di stato fanno si che alla fine ci sia solo circa 50% di probabilità che si fermi nello stato atteso. Per evitarlo devi o aggiungere un controllo dello stato precedente del pulsante, come mostrato nel video, oppure aggiungere un'attesa, finché il pulsante non viene rilasciato, dopo aver cambiato lo stato al LED.
Italian Tech Project ok pensavo che erano i rimbalzi,e usando antiribalzo si poteva risolvere,ma i rimbalzi quando si verificano? come si può notare a occhio (sempre se sono visivi),questo perché voglio provare milles () per correggere i rimbalzi.
I rimbalzi si verificano nel momento in cui il pulsante viene premuto o rilasciato. In pratica il segnale elettrico non passa improvvisamente da 0V a 5V, ma per un brevissimo periodo di tempo oscilla passando da 0V a 5V e viceversa molto velocemente, prima di stabilizzarsi su 5V. Dato che l'esecuzione del loop di Arduino è molto veloce, questi cambiamenti vengono rilevati e quindi percepiti come ripetute pressioni sul pulsante, facendo di conseguenza cambiare lo stato del LED diverse volte. Un modo per poter osservare i rimbalzi è attraverso un oscilloscopio, in alternativa puoi andare per tentativi, aumentado sempre di più il tempo di attesa, finché il problema smette di verificarsi.
ciao provo a fare qualche esercizio per vedere fin ora cosa ho capito, int ledPin = 9; int pulsantePin = 2; int ledStato = LOW; int pulsanteStato = LOW; int prova=HIGH; void setup(){ pinMode(ledPin, OUTPUT); pinMode(pulsantePin, INPUT); digitalWrite(ledPin, ledStato); } void loop(){ int lettura = digitalRead(pulsantePin); if(lettura != pulsanteStato and lettura == HIGH){ ledStato = !ledStato; digitalWrite(ledPin, ledStato); While (prova==ledStato){ crono++; Serialprintln (crono); } } pulsanteStato = lettura; delay(10); } In pratica volevo provare un cronometro in seriale,mi parte al clikko del pulsante ,ma poi non si ferma e come nel while non cambia ledStato al prossimo clikko,mi può spiegare grazie sono ancora in fase di studio e prove grazie mille
Ciao, per fare il cronometro che incrementa il valore ad ogni accensione del LED, dovresti sostituire WHILE con IF. Nel tuo codice all'interno del costrutto WHILE, le variabili "prova" e "ledStato" non cambiano mai il valore, quindi il ciclo WHILE continuerà all'infinito a incrementare la variabile "crono" e stamparla sul monitor seriale, perché la condizione "prova == ledStato" sarà sempre vera. Inoltre dovresti inizializzare la variabile "crono" prima di utilizzarla.
Italian Tech Project grazie per la risposta,ma perché non cambia?non dovrebbe cambiare appena ledStato diventa LOW,e nel while prova non è più uguale e si dovrebbe spegnere e fermare crono++?grazie per la tua pazienza
Non si ferma perchè il ciclo WHILE viene eseguito finché la condizione è vera. Una volta che "ledStato" diventa HIGH, vengono eseguite le righe dentro le parentesi graffe del WHILE, finché la condizione "prova == ledStato" è vera. Il codice dopo il WHILE non viene eseguito fino a quando la condizione non diventa falsa. Dato che dentro il ciclo WHILE l'unica variabile che cambia è "crono", ad ogni ciclo sia la variabile "prova", sia "ledStato" continueranno ad essere HIGH.
Italian Tech Project grazie cioè significa che pulsante =lettura; non cambia perché while si blocca sempre sul vero ripete il crono++, non va più avanti il cambiamento delle variabili nel if non avviene ?
Dopo circa 50 giorni la funzione millis() ricomincia di nuovo a contare da 0. Per poter lavorare con gli intervalli superiori di 50 giorni è consigliato utilizzare moduli RTC (Real Time Clock) esterni.
Era solo per dare un'alternativa nel caso in cui il limite di 50 giorni fosse troppo stretto. Comunque puoi contattarci all'indirizzo email arduino@italiantechproject.it.
A me sembra che si senta bene. E' la tua cafoneria invece che mi lascia basito. Fatti un corso di buone maniere...e dì alla mamma che era meglio se da piccolo ti insegnava l'educazione.
Spiegazione perfetta ! Non dimentichi niente. Riascoltandolo diverse volte quel che mi sembrava troppo complesso per le mie facoltà è risultato chiarissimo ! Grazie 🌟
Ci fa piacere che il video ti sia stato utile.
Complimenti al tuo canale e alle chiare spiegazioni
👍
Finalmente un pochino di entusiasmo!
Nei video più recenti stiamo cercando di migliorare la parte audio.
ottimo video chiaro e comprensibile... ti seguo da poco e le tue spiegazioni mi piacciono molto, sto provando 2 schede pcf8574 collegete a I2C una per ingressi e una per uscite. mi piacerebbe poter utilizzare i pulsanti come interruttori e i led come il tuo video ma con le 2 schede. se fosse possibile un tuo video su questo argomento sarebbe gradito... grazie e complimenti ancora per il canale.
Al momento non abbiamo un video al riguardo, ma ti può essere di aiuto l'articolo www.mischianti.org/2019/01/02/pcf8574-i2c-digital-i-o-expander-fast-easy-usage/
Grazie sicuramente mi può aiutare, me lo guarderò x bene.👍
Ciao grazie per i tuoi video, volevo farti una domanda riguardo questo sketch, in pratica ho capito che la riga 18 è fondamentale affinché funzioni tutto alla perfezione, ma non mi è molto chiara, a cosa serve di preciso e cosa accade se non la mettiamo?... potrei avere dei ulteriori delucidazioni? ne sarei grato.
Ti riferisci al primo o secondo sketch mostrato nel video?
@@TechMaker al primo
La riga 18 ( pulsanteStato = lettura; ) aggiorna la variabile "pulsanteStato". Nella riga 14 viene effettuato un confronto (... lettura != pulsanteStato ...) che verifica che lo stato attuale ( la variabile lettura ) è cambiato rispetto alla precedente esecuzione della funzione "loop". Senza la riga 18 la variabile "pulsanteStato" avrebbe sempre il valore iniziale (ovvero LOW impostato nella riga 4).
@@TechMaker gentilissimo grazie!
Buongiorno, complimenti per il video. Da principiante sono riuscito a seguire bene la prima parte del video mentre mi sono un po' perso sul discorso debounce. Non è possibile stampare a video nel monitor seriale lo stato delle variabili nel tempo ed eventualmente avere la possibilità di fare una stampa per avere la possibilità di analizzare i dati con più calma?
Sulle schede più recenti, basate su SAMD (come per esempio MKR WiFi 1010 o Nano 33 IoT) puoi attivare il debugger per analizzare lo svolgimento dello sketch. Se usi invece le schede come Uno, Mega, ecc, l'unico modo è inserire manualmente le istruzioni Serial.println nello sketch, per visualizzare il valore della variabile quando viene eseguito quel pezzo di codice.
Ciao e grazie dei video. Volevo fare una domanda: come è possibile che caricando il programma in modo identico del video 3(ho controllato e ricontrollato) e dopo aver collegato Led e pulsante come mostri nel video, il risultato non sia quello sperato? Cioè facendo una leggera pressione o sul jump collegato al pulsante o sul jump collegato al Led il Led si accenda e si spenga in modo casuale.
Prova a diminuire il resistore collegato con il pulsante. Vanno bene i valori da 10kohm a 100kohm.
@@TechMaker
Grazie
ciao ma il rimbalzi sotto quale forma li rilevi? cioè come ti rendo conto che uno sckech soffre si rimbalzi?
grazie
Ciao, i rimbalzi del pulsante possono essere misurati con un oscilloscopio, però in ogni caso non è tanto la questione che uno sketch soffre di rimbalzi, perché con un pulsante perfetto (che cambia stato istantamente senza oscillare) nello sketch non ci sarebbe bisogno di affrontare il problema. Purtroppo, in realtà, è molto difficile che un pulsante non oscilli minimamente quando viene premuto o rilasciato. Se provi il primo esempio del video, togliendo "delay(10)", molto probabilmente ti accorgi che a volte il led non cambia stato dopo aver premuto il pulsante.
Salve, e complimenti per i video molto chiari e utili. Avrei una domanda. Da poco mi sto cimentando nel mondo di arduino e gia' sono riuscito a fare qualche semplice progettino. Come posso utilizzare arduino con lo sketch utilizzato nel viedeo ma con 10 pulsanti? grazie mille per la disponibilita'.
Occorre creare delle variabili per ogni pulsante.
Nel video www.italiantechproject.it/arduino/luci-di-natale-e-canzoni-natalizie-con-arduino trovi un esempio di come usare più di un pulsante nello stesso sketch.
Grazie per il tuo video, io dovrei usare, al posto del pulsante, un contatto pulito di un relè, quindi come se al posto del pulsante ci sia un interruttore con due poli (contato aperto / contatto chiuso), mi potresti indicare come devo cambiare il collegamento mettendo l'interruttore al posto del pulsante? Grazie per il tuo aiuto
Per usare un relè al posto del pulsante puoi collegare il contatto normalmente aperto a 5V, mentre il comune sia al pin di Arduino che a GND tramite un resistore.
Vorrei fare una domanda non direttamente collegata al video di questa lezione. Quanti if si possono nidificare? Il problema nasce dal fatto che volendo utilizzare 3 Led per simulare l'uscita di un dado a 6 facce, volevo farlo nidificando il comando if. Grazie
Non ci sono limiti di IF nidificati, quindi puoi metterli a cascata come preferisci.
Ciao e grazie mille per questo ottimo tutorial! Volevo chiederti un aiuto. E' possibile modificare il codice in modo che, pigiando il pulsante, il LED inizi a lampeggiare (ossia, si accenda e si spenga con intervalli di un secondo) e, pigiandolo nuovamente, il LED si spenga? Grazie mille e un caro saluto!
Si, puoi eseguire dei comportamenti diversi in base ad una variabile che cambia il valore alla pressione del pulsante.
@@TechMaker , Grazie mille! Mi daresti qualche suggerimento su come fare. Il problema è che non so come modificare il loop per ottenere l'intermittenza senza sovrappormi all'ultimo comando di aggiornamento della variabile "lettura". Un caro saluto!
Devi basarti sul tempo trascorso e non sui ritardi delay, per far lampeggiare il LED. Con un ritardo delay è impossibile eseguire altre azioni e di conseguenza rilevare la pressione del pulsante. Nel video con le luci di Natale ( www.italiantechproject.it/arduino/luci-di-natale-e-canzoni-natalizie-con-arduino ), puoi vedere un esempio di come integrare la lettura dei pulsanti con altre azioni eseguite all'interno dello stesso sketch.
Salve, io le vorrei chiedere in quali casi il pinLed, all'avvio, può avere uno stato diverso da LOW (questa domanda in riferimento alla riga 9)
In effetti la funzione digitalWrite nel setup può essere omessa.
ciao! bel video, io riscontro un problema: molto spesso premendo il tasto il led non si spegne, a volte si a volte no. Mi pare di capire che tutto dipenda dalla velocità d'esecuzione e dal fatto che l'arduino potrebbe non captare il segnale...ma come si risolve? Ho provato anche ad utilizzare il debounce ma non cambia nulla... grazie mille, buonaserata
Prova a diminuire il resistore collegato al pulsante oppure a variare il tempo di attesa del debounce.
nella riga 14 in che modo la lettura può essere diversa la LOW (quindi HIGH) ma non uguale ad HIGH?
La variabile "pulsanteStato" non avrà sempre il valore LOW, ma ad ogni esecuzione del loop assumerà il valore letto nell'iterazione precedente. Il controllo serve a evitare che LED cambi lo stato continuamente per tutta la durata quando sul pin viene rilevato il valore HIGH.
ciao vorrei porvi un problema che mi assilla e che non riesco a risolvere allego il file per chiarezza il punto è che voglio conteggiare dei numeri su 4 matrici a led e una per volta conteggiare da 0 a 9 raggiunto il numero desiderato passare alla successiva matrice . il problema è che lavora sempre sulla prima matrice e non riesco a farla conteggiare alla successiva ho usato return pur non sapendo come funziona ma vedo che no ho risolto sono quasi certo che l'inghippo è nel loop però non so risolverlo mi aiutate? grazie per quanto vorrete dirmi e ancora complimenti per il vostro lavoro
Nel codice, il numero di matrice viene incrementato soltanto quando il pin 7 ritorna LOW, quindi per passare alla matrice successiva bisogna rilasciare il pulsante nell'esatto millisecondo quando finisce il delay dopo l'ultima cifra sulla matrice precedente, che è fisicamente impossibile. L'incremento dovrebbe avvenire dopo aver terminato il conteggio sulla matrice precedente.
Ciao,come posso aggiungere altri pulsanti e led con questa tecnica.Grazie
Per ogni pulsante o LED aggiuntivo serve dedicare un pin della scheda di Arduino e creare le relative variabili per gestirlo allo stesso modo di quelli già presenti.
Buonasera a tutti. Sono nuovo nell'ambiente di arduino. Non capisco come mai quando connetto Arduino al computer il LED lampeggia anziché rimanere spento e il pulsante non funziona. Mi potete dare una mano? Grazie mille
Ci non degli errori durante il caricamento dello sketch? I numeri dei pin nello sketch corrispondono a quelli usati nel circuito?
Avevo invertito il Senso del pulsante. Praticamente mi entra in loop , quindi il LED continuava a lampeggiare , e il pulsante, non avendo i collegamenti corretti , non funzionava .
ciao mi puoi spiegare if entrambi casi è vero ,sè clikko il pulsante la variabile lettura diventa HIGH diversa da pulsanteStato (LOW) ,if vero perché diversi,ma se rilasciato il pulsante lettura diventa LOW, pulsanteStato (LOW) ,in questo caso if non è più vero essendo che sono uguali e non diversi,perché dici entrambi casi veri? mi spieghi dove che sbaglio nel ragionamento?
grazie mille
In entrambi i casi IF sarebbe vero, considerando che la variabile "pulsanteStato" non conterrà sempre il valore LOW, ma sarà aggiornata, alla fine dello sketch, con l'ultima lettura rilevata. Quindi in ogni ciclo del loop, conterrà il valore rilevato nel ciclo precedente.
Il controllo con la lettura precedente è necessario per evitare che lo stato del LED cambi in continuazione mentre il pulsante è premuto.
Quindi all'inizio "pulsanteStato" è uguale a LOW, di conseguenza finché il pulsante non è premuto, IF sarà falso, visto che "lettura" (LOW) è uguale a "pulsanteStato" (LOW). Se premiamo il pulsante, IF diventa vero, permettendo al LED di cambiare stato. Se, a questo punto, non venisse aggiornata la variabile "pulsanteStato", nel successivo ciclo del loop, la condizione sarebbe ancora vera e quindi il LED cambierebbe di nuovo lo stato, senza che il pulsante sia rilasciato e premuto di nuovo.
L'aggiornamento della variabile "pulsanteStato" permette di evitare ciò, però allo stesso tempo fa si che IF diventi vero quando rilasciamo il pulsante, in quanto "lettura" (LOW) sarà diversa da "pulsanteStato" (HIGH).
Per cui dobbiamo aggiungere "lettura" uguale a HIGH nella condizione, per assicurarci che il LED cambi stato solo quando premiamo il pulsante.
Spero di essermi spiegato meglio, in quanto nel video ho dato per scontato che la variabile "pulsanteStato" dovesse essere aggiornata, ancora prima di averlo scritto.
Italian Tech Project grazie mille ora è più chiaro,che ora mi sto avvicinando alla programmazione,continua così.
grazie mille
Italian Tech Project ciao sto ancora ragionando sullo sketch ma ancora ragionando non arrivo,sbaglio qualcosa ,ecco il mio ragionamento:
avvio il programma senza schiacciare niente non succede niente 😆😆 , lettura LOW pulsanteStato LOW, schiaccio il pulsante e rilascio lettura assume valore HIGH diverso pulsanteStato ma lettura ==HIGH (situazione vera) viene eseguito il codice tra le graffe avviene il cambio di stato del led da LOW a HIGH ,poi pulsanteStato = lettura; cioè lettera e HIGH pulsanteStato assume HIGH,ora nel if mi ritrovo lettura HIGH pulsante HIGH,cliccando di nuovo il pulsante lettura diventa LOW pulsanteStato HIGH sono diversi ma lettura non è uguale ==HIGH quindi non succede niente,c'è qualcosa che nn va nel mio ragionamento ma cosa?
mi blocco la.
grazie scusa che lo devo capire prima di andare avanti
Italian Tech Project Ciao facendo un ragionamento più lento lo possiamo sintetizzare in questo modo:
Supponiamo di mettere il dito sul pulsante senza alzare
Variabile lettura diventa HIGH diversa da pulsanteStato ==HIGH condizioni vera avviene il cambio di stato del led nella variabile pulsanteStato =lettura cioè pulsanteStato HIGH loop torna da capo nel if lettura risulta HIGH pulsanteStato HIGH e non succede niente appena alziamo il dito da pulsante variabile lettura diventa LOW PulsanteStato HIGH sono diversi ma non uguale a lettura ==HIGH quindi non succede niente,loop continua ad seguire il codice pulsanteStato =lettura diventa pulsanteStato LOW e viene inserito nel if ,quindi ci troveremo nelle situazione del if lettura LOW pulsanteStato LOW al prossimo clikko sul pulsante si avrà il cambio di stato giusto come ragionamento?
Grazie
Si, il ragionamento è giusto. Visto che loop viene eseguito con una frequenza molto elevata, anche schiacciando il pulsante molto velocemente, Arduino riesce comunque a percepire sia quando il pulsante viene premuto che quando viene rilasciato. Nel secondo caso, rilasciando il pulsante, la variabile "pulsanteStato" torna al valore LOW e di conseguenza la situazione ritorna al punto di partenza, permettendo così il cambio di stato del LED alla successiva pressione sul pulsante.
Ciao scusami ho fatto tutto solo che nel set che ho preso di arduino ho resistenze da 10k per cui ne ho messe 10 in serie per arrivare a 100k ma non funziona sapresti dirmi per caso quale puo essere il problema?grazie
Qual è il comportamento? Il LED non si accende quando viene premuto il pulsante oppure ogni tanto si accende anche senza aver premuto il pulsante?
@@TechMaker Niente ho risolto semplicemente il pulsante non era connesso all'alimentazione a quanto pare l'alimentazione della mia breadboard funziona a metà e metà quindi se do alimentazione a sinistra mi alimenta solo la metà di sinistra e viceversa Quella di destra Grazie mille 😁
Non capisco perché ma mi da sempre errore alla riga 15 eppure ho ricontrollato tutto passo per passo, può essere colpa dell'ultima versione software?
Chiedo scusa, sbagliavo a scrivere ledStato, tutto ok
L'importante che adesso funzioni :)
Tutto ok @@TechMaker
Avevo fatto questo progetto tempo fa e ora sto cercando di perfezionarlo... sono abbastanza nuovo con Arduino. Comunque quando provo a caricare un progetto sul mio Arduino Uno (originale) mi da un'errore di caricamento:
Arduino:1.8.5 (Windows 10), Scheda:"Arduino/Genuino Uno"
Lo sketch usa 1354 byte (4%) dello spazio disponibile per i programmi. Il massimo è 32256 byte.
Le variabili globali usano 15 byte (0%) di memoria dinamica, lasciando altri 2033 byte liberi per le variabili locali. Il massimo è 2048 byte.
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x8e
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x8e
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x8e
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x8e
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x8e
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x8e
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x8e
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x8e
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x8e
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x8e
Problema di caricamento sulla scheda. Guarda www.arduino.cc/en/Guide/Troubleshooting#upload per suggerimenti
Qualcuno può aiutarmi?
Controlla che la versione dell'IDE sia aggiornata, e prova anche a disinstallare e reinstallare i driver. Se non funziona e se hai un'altra scheda di Arduino a disposizione, potresti provare a riscrivere il bootloader della scheda che non funziona (la procedura è analoga a come mostrato nel video "Come programmare il microcontrollore ATtiny85 usando la scheda di Arduino").
Italian Tech Project Grazie, proverò
questo video perché e il momento di capire i millis (),
nel video quando aggiungi:
ultimoTempoDebounce=millis ();
ultimoTempoDebounce prende il valore della conta di millis ,
ma quando inserisci :
if ((millis ()-ultimoTempoDebounce)>attesaDebounce)
i millis in questo ultimo if e il
continuo della conta del primo millis ? (quello del primo if ultimoTempoDebounce=millis ();)
grazie mille
I valori delle due chiamate alla funzione "millis" (anche se eseguite una dopo l'altra) potrebbero essere diversi, se tra una chiamata e l'altra sono trascorsi dei millisecondi. La funzione "millis" ritorna il numero di millisecondi dall'inizio del programma fino all'esatto momento della chiamata della funzione "millis", quindi ogni volta viene ritornato il valore aggiornato fino a quel momento.
in questo codice time=millis () nel void loop dopo che diventa maggiore e esegue il codice nel if al primo giro time e sempre uguale per il resto degli if? poi si aggiorna con il nuovo ciclo loop?
void setup(){
time=millis();
letturaluce_time=mills();
servotime=millis();
letturadati=millis();
}
void loop(){
time=millis();
if(time>letturaluce_time+5){
luce1=analogRead(SENSORELUCE1);
letturaluce_time=millis();
}
if(time>servotime1+15){
servo1.write(posservo1);
servotime1=millis();
}
if(time>letturadati+3000){
Serial.print("Sensore 1 : ");
Serial.print(letturaluce1,DEC);
Serial.print(" Posizione motore 1 : ");
Serial.println(posservo1,DEC);
Serial.print(" Differenza : ");
Serial.println(letturaluce1-letturaluce2);
letturadati=millis();
}
}
Si, la variabile "time" rimane uguale, finché non viene sovrascritta nel successivo ciclo loop.
Io da sempre utilizzo il sistema di una variabile di tipo int o anche più ampia che se minore di un certo tempo viene incrementata di 1. Quando raggiunto il valore scelto vado ad eseguire il codice all'interno dell' if che compara la mia variabile se è uguale a un valore scelto e poi la risetto a 0 e il ciclo ricomincia. Se imposto in alto un delay(1) tale variabile verrà incrementata di un millisecondo alla volta e se non metto delay devo aumentare il tempo poiché ho capito che il ciclo loop viene eseguito più velocemente di un millisecondo. Questo sistema ultra logico secondo te è corretto ? Perché con l'utilizzo del delay(1) impostato all'inizio del voidloop() se il programma deve scrivere su shiftregister e altre istruzioni complesse è come se il programma all'interno del Microcontrollore rallentasse e ho dovuto creare altri cicli void() che vengono eseguiti nel momento voluto e non sempre perché noto rallentamenti nel programma in esecuzione. È normale per te ?
Se vuoi eseguire una determinata azione a intervalli regolari, dovresti utilizzare la funzione millis() ed in particolare controllare il tempo passato dall'ultima volta che l'azione è stata eseguita.
Contare i cicli loop è molto poco affidabile in quanto la velocità dipende dalla complessità delle istruzioni che vengono eseguite.
Immaginavo, infatti adesso sono riuscito a fare in modo che ad cambiamento del millis una variabile s'incrementa di 1 e posso utilizzarla per creare un sottoLoop più lento. Con questo principio quando i millis() vanno in overflow dal passagio dal numero massimo di nuovo allo zero comunque c'è una variazione del tempo trascorso e quindi la variabile viene sempre incrementata e così gestisce anche l'overflow del millis() perchè lo devo utilizzare in un orologio, e quindi deve funzionare sempre anche più di 47,7 giorni ovvero dopo il primo overflow dei millis(). Senza usare realtime rtc.
è normale che dopo aver caricato 1 volta il tutto su Arduino mi dia errore????
Qual è il messaggio di errore?
scusa, ma il pulsante lo metti in cortocircuito praticamente. Usi una resistenza per abbassare la corrente ma è in corto quando lo premi. giusto ? Non c'è un'altro sistema sulla bread per far rilevare ad arduino il cambio di stato del pulsante ?
La resistenza serve, infatti, per evitare il cortocircuito tra 5V e GND, quando il pulsante viene premuto. In questo modo puoi leggere sul pin digitale 5V (HIGH) quando premi il pulsante e 0V (LOW) quando lo rilasci.
ok. Ma come calcoli la resistenza da inserire ? Esiste poi un modo per arduino di verificare la pressione del tasto senza dare corrente ? magari valutando la resistenza ==> 0 (low) non premuto / X(high) premuto ?
Non c'è un valore giusto o sbagliato per la resistenza da inserire. Da un lato deve essere il più alto possibile per far passare il meno possibile la corrente quando il pulsante è premuto, però allo stesso tempo non troppo alto, perché altrimenti sarebbe equivalente a un circuito aperto, quindi il pulsante potrebbe risultare premuto anche se in realtà non lo è. Di solito si usa un valore di almeno 10kΩ. Per esempio con la tensione di 5V e la resistenza di 100kΩ, la corrente è di 0,05mA. Tutte le misurazioni effettuate da Arduino si basano sulla tensione, quindi è impossibile evitare completamente il passaggio della corrente.
ciao complimenti per il video,devo dire la verità nei tutorial che hai non è adatto a persone che si stanno avvicinando arduino e programmazione ,tutorial che fai già sono adatti per persone che hanno dimestichezza con C, io mi sto avvicinando da poco alla programmazione per fare un cambio di stato usi troppi variabili e incomicia a essere più complicato seguirti,puoi usare in metodo più semplice e comprensivo per noi, non ancora esperti,per poi più avanti spiegare questo altro metodo,sicuramente questo è un metodo migliore ,però un cambio di stato si può fare anche con meno variabile e meno codice, comunque complimenti sei molto esperto 😆
Grazie per la tua opinione, che ci aiuterà a migliorare.
In effetti il secondo sketch, quello con la gestione "anti-rimbalzo", non è molto semplice da capire per chi non ha ancora molta pratica. L'intenzione era quella di offrire anche un modo alternativo per gestire il debouncing, senza aumentare eccessivamente il ritardo con la funzione delay, che impedisce al programma di eseguire il resto del codice.
Se non si hanno particolari esigenze, ci si può fermare al primo sketch, che è più semplice. In questo caso, se il ritardo di 10 millisecondi, inserito alla fine, non dovesse bastare per contrastare i "rimbalzi", è sufficiente aumentare il tempo di attesa passato alla funzione delay.
Italian Tech Project grazie mille ,gentilmente mi spieghi if sempre vero ho fatto un pò di ragionamento,ma non mi trovo e non riesco a capire
sto provando questo codice
if(digitalRead (10)==HIGH){
digitalWrite ((7),! digitalRead (7);
}
in pratica è un cambiamenti di stato del led, ho notato che avvolte avviene il cambiamento e avvolte no,così ho provato antiribalzo che usate voi , ma niente il cambiamento di stato avvolte avviene avvolte no, come mai?
grazie
La condizione "digitalRead(10) == HIGH" non è sufficiente, perché anche premendo il pulsante molto velocemente, il codice del loop verrà eseguito moltissime volte e quindi il LED continuerà a cambiare lo stato da acceso a spento e viceversa, fino a fermarsi quando il pulsante viene rilasciato. Quei continui cambi di stato fanno si che alla fine ci sia solo circa 50% di probabilità che si fermi nello stato atteso.
Per evitarlo devi o aggiungere un controllo dello stato precedente del pulsante, come mostrato nel video, oppure aggiungere un'attesa, finché il pulsante non viene rilasciato, dopo aver cambiato lo stato al LED.
Italian Tech Project ok pensavo che erano i rimbalzi,e usando antiribalzo si poteva risolvere,ma i rimbalzi quando si verificano? come si può notare a occhio (sempre se sono visivi),questo perché voglio provare milles () per correggere i rimbalzi.
I rimbalzi si verificano nel momento in cui il pulsante viene premuto o rilasciato. In pratica il segnale elettrico non passa improvvisamente da 0V a 5V, ma per un brevissimo periodo di tempo oscilla passando da 0V a 5V e viceversa molto velocemente, prima di stabilizzarsi su 5V.
Dato che l'esecuzione del loop di Arduino è molto veloce, questi cambiamenti vengono rilevati e quindi percepiti come ripetute pressioni sul pulsante, facendo di conseguenza cambiare lo stato del LED diverse volte.
Un modo per poter osservare i rimbalzi è attraverso un oscilloscopio, in alternativa puoi andare per tentativi, aumentado sempre di più il tempo di attesa, finché il problema smette di verificarsi.
ciao provo a fare qualche esercizio per vedere fin ora cosa ho capito,
int ledPin = 9;
int pulsantePin = 2;
int ledStato = LOW;
int pulsanteStato = LOW;
int prova=HIGH;
void setup(){
pinMode(ledPin, OUTPUT);
pinMode(pulsantePin, INPUT);
digitalWrite(ledPin, ledStato);
}
void loop(){
int lettura = digitalRead(pulsantePin);
if(lettura != pulsanteStato and lettura == HIGH){
ledStato = !ledStato;
digitalWrite(ledPin, ledStato);
While (prova==ledStato){
crono++;
Serialprintln (crono);
}
}
pulsanteStato = lettura;
delay(10);
}
In pratica volevo provare un cronometro in seriale,mi parte al clikko del pulsante ,ma poi non si ferma e come nel while non cambia ledStato al prossimo clikko,mi può spiegare grazie sono ancora in fase di studio e prove grazie mille
Ciao, per fare il cronometro che incrementa il valore ad ogni accensione del LED, dovresti sostituire WHILE con IF.
Nel tuo codice all'interno del costrutto WHILE, le variabili "prova" e "ledStato" non cambiano mai il valore, quindi il ciclo WHILE continuerà all'infinito a incrementare la variabile "crono" e stamparla sul monitor seriale, perché la condizione "prova == ledStato" sarà sempre vera.
Inoltre dovresti inizializzare la variabile "crono" prima di utilizzarla.
Italian Tech Project grazie per la risposta,ma perché non cambia?non dovrebbe cambiare appena ledStato diventa LOW,e nel while prova non è più uguale e si dovrebbe spegnere e fermare crono++?grazie per la tua pazienza
Non si ferma perchè il ciclo WHILE viene eseguito finché la condizione è vera. Una volta che "ledStato" diventa HIGH, vengono eseguite le righe dentro le parentesi graffe del WHILE, finché la condizione "prova == ledStato" è vera.
Il codice dopo il WHILE non viene eseguito fino a quando la condizione non diventa falsa. Dato che dentro il ciclo WHILE l'unica variabile che cambia è "crono", ad ogni ciclo sia la variabile "prova", sia "ledStato" continueranno ad essere HIGH.
Italian Tech Project grazie cioè significa che pulsante =lettura; non cambia perché while si blocca sempre sul vero ripete il crono++, non va più avanti il cambiamento delle variabili nel if non avviene ?
Si, finché la condizione del WHILE è vera, vengono eseguite, in continuazione, soltanto le istruzioni dentro le parentesi graffe del WHILE
Cosa succede dopo i 50 giorni ?
E da riprogrammare ???
Dopo circa 50 giorni la funzione millis() ricomincia di nuovo a contare da 0.
Per poter lavorare con gli intervalli superiori di 50 giorni è consigliato utilizzare moduli RTC (Real Time Clock) esterni.
Italian Tech Project
RTC ??? Non sono ancora arrivato a questi livelli
Scusa sono ancora ai primi passi
Puoi inviarmi la tua e-mail personale ???
Era solo per dare un'alternativa nel caso in cui il limite di 50 giorni fosse troppo stretto. Comunque puoi contattarci all'indirizzo email arduino@italiantechproject.it.
mi è un po più chiaro ora studierò il modo e poi .....aiutino? vedremo prima provo grazzzie per la risposta
A disposizione :)
Comprati un microfono decente. ♥
Grazie per il consiglio.
A me sembra che si senta bene. E' la tua cafoneria invece che mi lascia basito.
Fatti un corso di buone maniere...e dì alla mamma che era meglio se da piccolo ti insegnava l'educazione.