In questi giorni mi sono imbattuto in alcuni progetti che fanno uso di interrupt e incuriosito ho deciso di approfondire l’argomento, realizzando un tutorial semplice per comprendere meglio come funzionano in arduino.
Non voglio dilungarmi su trattati di filosofia informatica in merito a cosa sia un interrupt, per conoscenza e punto di partenza riporto la descrizione pubblicata su wikipedia:
In informatica, un interrupt o interruzione è un segnale asincrono che indica il ‘bisogno di attenzione’ da parte di una periferica finalizzata ad una particolare richiesta di servizio, un evento sincrono che consente l’interruzione di un processo qualora si verifichino determinate condizioni (gestione dei processi) oppure più in generale una particolare richiesta al sistema operativo da parte di un processo in esecuzione.
sottolineo solo la prima riga di questa definizione:
un interrupt é un segnale asincrono che indica il “bisogno di attenzione”
lo so è un po’ psicologico-filosofica come affermazione ma rende bene l’idea, puoi immaginare un interrupt come qualcosa sempre in allerta da parte di arduino, quando su verifica la condizione per cui è stato impostato il programma si sgancia dall’esecuzione in corso e va ad eseguire una parte dello sketch che hai definito come legata all’evento di interrupt.
Cosa ti occorre
per questo esperimento ti occorre:
- 1 Arduino uno
- 1 led verde
- 1 led rosso
- 1 led giallo
- 1 pulsante N/A
- 1 resistenza da 470Ω
- 1 resistenza da 1KΩ
- 1 breadboard e relativi cavetti
lo schema
ecco lo schema elettrico:
collega il pulsante al pin 2 che utilizzerai come interrupt, alla pressione del pulsante il valore letto sul pin 2 sarà HIGH in quanto la pressione dl pulsante mette in contatto il pin 2 di arduino con il polo positivo +5v.
in pratica
parti dallo sketch che ho scritto e ti sarà più chiaro come funziona un interrupt, premetto solo che in Arduino Uno i pin che puoi legare a interrupt sono il pin 2 ed il pin 3 rispettivamente come interrupt 0 ( il pin 2 ) e 1 ( il pin 3 ).
/** * Interrupt Test - Alfieri Mauro * * Web: www.mauroalfieri.it * Tw: @mauroalfieri */ int ledRed=8; int ledGreen=7; int ledYellow=12; int interrCount=0; void setup() { pinMode(ledRed, OUTPUT); pinMode(ledGreen, OUTPUT); pinMode(ledYellow, OUTPUT); digitalWrite(ledRed, LOW); digitalWrite(ledGreen, LOW); digitalWrite(ledYellow, LOW); attachInterrupt(0, interruptGiallo, RISING); } void loop() { interrCount++; digitalWrite(ledRed, HIGH); digitalWrite(ledGreen, LOW); delay(300); digitalWrite(ledRed, LOW); digitalWrite(ledGreen, HIGH); delay(300); if ( interrCount == 10 ) { interrCount = 0; digitalWrite(ledYellow, LOW); } } void interruptGiallo() { digitalWrite(ledYellow, HIGH); }
lo sketch ha lo scopo di far lampeggiare alternatamente i due led rosso
e verde
con una frequenza di 300 millisecondi tra l’uno e l’altro, alla pressione del pulsante si accende il led giallo e resta accesso fino a quando la funzione loop() non ha eseguito i suoi 10 cicli.
leggendo linea per linea:
linea 08: definisci una variabile di tipo integer denominata ledRed il cui valore è quello del pin a cui è collegato il pin rosso;
linea 09: definisci una variabile simile alla precedente per il led verde;
linea 10: definisci una variabile simile alle precedenti per il led giallo;
linea 11: definisci una variabile che utilizzerai per contare i cicli di loop() dopo cui spegnere il led giallo;
linee 15-17: per ciascun pin legato ad un led imposta la modalità di OUTPUT;
linee 19-21: per ciascun led spegni il led corrispondente portando a LOW il valore digitale del pin corrispondente;
linea 23: è il cuore di questo esempio, il comando attachInterrupt( interrupt, function, mode ) i cui parametri indicano
INTERRUPT: il pin di interrupt ( 0 o 1 ) a cui attaccare la funzione specificata come secondo parametro
FUNCTION: la funzione da richiamare quando si verifica un evento sul pin specificato
MODE: la modalità in cui l’interrupt è attivato, per questo punto sul sito Arduino sono riportate le 4 modalità di funzionamento
- LOW fa scattare l’evento di interrupt ogni volta che il pin ( 2 o 3 ) ha valore logico basso
- CHANGE fa scattare l’evento di interrupt quando il pin cambia stato
- RISING fa scattare l’evento di interrupt quando il pin passa da LOW a HIGH
- FALLING fa scattare l’evento di interrupt quando il pin passa da HIGH a LOW
nel tuo caso potresti utilizzare sia CHANGE sia RISING io consiglio RISING in modo che il l’interrupt sia verificato solo alla pressione del pulsante e non anche quando rilasci il pulsante.
linea 27: subito dopo la definizione della funzione loop() incrementa il valore della variabile interrCount ad ogni loop();
linea 29-34: si occupano di accendere e spegnere in nodo alternato i due led rosso e verde, queste semplici righe servono anche a dimostrarti come funziona l’interrupt in quanto si alternano indipendentemente dalla funzione di interrupt o dal verificarsi dell’evento;
linea 36: verifica che il numero di cicli di loop eseguiti sia 10;
linea 38: reimposta a 0 il valore di interrCount, in modo che il conteggio possa ricominciare al loop() successivo;
linea 39: spegne il led giallo, indipendentemente se sia mai stato acceso o meno, ha il solo scopo di far continuare l’esperimento.
linea 44: definisci la funzione interruptGiallo che hai indicato, alla linea 23, come funzione da richiamare in caso di evento di interrupt rilevato.
linea 46: accendi il led giallo utilizzando il comando digitalWrite e portando a HIGH il valore del pin a cui è collegato il led.
Important!
Alcune note sulla funzione richiamata dal comando attachInterrupt: il comando delay() non funziona, così come il valore restituito dalla funzione millis() non si incrementa e non puoi usarlo come contatore del tempo.
Il video
ho realizzato anche un piccolo video della mia demo:
Buon divertimento !!!
61 commenti
2 ping
Vai al modulo dei commenti
Bello e semplice, il tuo progetto può aiutare a spiegare meglio come vengono gestiti gli interrupt dai microcontrollori.
Grazie della guida 🙂
Autore
Ciao Elia,
sono contento ti sia stato utile, scrivo questi tutorial con quell’intento 🙂
Mauro
Una buona guida all’uso degli interrupt. Un piccolo consiglio: come da documentazione varrebbe la pena citare la funzione digitalPinToInterrupt(pin) per un uso più corretto della funzione di attachInterrupt() invece di usare il codice di interrupt diretto (https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/)
Autore
Ciao Berto,
interessante spunto di riflessione e precisione sulla documentazione, questa info mi era sfuggita al momento della scrittura dell’articolo.
Lascio il tuo commento online come approfondimento per chi lo desiderasse e da oggi in poi userò sempre il metodo corretto quando userò la funzione attachInterrupt()
Ciao Mauro, da circa 6 mesi mi sono addentrato nel mondo di Arduino e oggi cercando come creare un interrupt ho scoperto il tuo sito. La domanda che ti pongo è se quando compiliamo un interrupt si possono inserire più istruzioni ed eseguire dei ritardi al suo interno. Ma grazie a te ho trovato la risposta, quindi ho cambiato il programma mettendo i ritardi fuori l’interrupt e avviandoli se un registro (all’interno dell’interupt )cambia da 0 a 1.
Complimenti per il sito e grazie per tutto quello che metti a disposizione per noi.
Santo
Autore
Ciao Santo,
sono felice della tua riuscita.
Se vorrai condividere qualcuno dei tuoi progetti con gli appassionati del Blog sarò lieto di pubblicarti un articolo.
Mauro
ciao Mauro io ho creato una pagina HTML per gestire l’apertura e la chiusura delle tapparelle di casa ora vorrei inserire uno stop e quindi avevo pensato all’interrupt, però io vorrei creare il pulsante sulla pagina HTML come stop in modo che quando eseguo il loop e per motivi vari voglio fermare le tapparelle a una certa altezza premo il pulsante e blocca tutto
mi potresti aiutare grazie
Autore
Ciao Michele,
l’interrupt, se hai letto bene l’articolo funziona bene con attuatori fisici, non con pulsanti virtuali su HTML
Per fare quello e vuoi dovrai controllare durante l’apertura/chiusura della tapparella se arriva un comando di STOP dalla tua pagina HTML e fermare l’azione.
Mauro
ciao Mauro un altro problema che ho e che invio un comando da HTML ad arduino durante il loop non riesco ad inviare nessun altro comando finché il loop non termina.
come posso fare per evitare ciò ???
mi potresti fare un esempio ?
grazie
Autore
Ciao Michele,
probabilmente fai uso dei delay() ossia di tempi di attesa durante i quali Arduino non si aspetta alcun comando.
Cerca nel blog come sostituirli con il comando millis(), necessita di alcune righe di codice, ma non interrompe il ciclo di attesa comandi.
Il blog è pieno di esempi che puoi riadattare.
Mauro
In una void cui si accede da interrupt, lettura codici DTMF, ho notato che:
– alcune righe comando non funzionano e li si blocca tutto
– funzioni “if ( )” scritte su più righe con le graffe non funzionano, invece scriitte sulla stessa riga funzionano!
– non riesco a lanciare un altro “void ()” per eseguire altri comandi.
Non uso delay() nel ciclo o millis(), anche se per prova ho visto che da me invece millis() viene incrementato!
Mi sembra strano: a te pare normale? magari in interrupt vengono alterati i normali cicli di lavoro del micro?
Mai sperimentato questi problemi?
Saluti
Mauro C.
Autore
Ciao Mauro,
francamente non ho mai rilevato i problemi che mi segnali, tuttavia mi sono sempre limitato nell’uso degli interrupt.
Se mi capita un progetto che coinvolge le situazioni di cui mi scivi cercherò di approfondire i motivi che inducono arduino a causare questi blocchi.
Oggi ho pubblicato un articolo sui Timer interni di arduino, prova a leggerlo e comprendere se chiarisce il rapporto tra Timer e Interrupt.
Mauro
Grazie per la cortese risposta!
In effetti la cosa è strana: sposto una riga e funziona. Capitava a volte coi primissimi compilatori.
Non so invece se da Interrupt è possibile chiamare una altra void/funzione: a me si blocca.
Il programma è di 16Kb, quindi circa della metà del massimo possibile.
Al momento ho ovviato portando fuori dall’ISR le variabili “volatile” e processandole nel loop principale, poi se avrò tempo vedrò.
Ciao ancora e Grazissime!
Mauro C.
Ciao Mauro,
Complimenti x il sito, davvero ben fatto.
Ti chiedo solo una delucidazione, dallo sketch che hai pubblicato mi sembra di capire che il led giallo non compie il “loop” completo ( 10 lampeggi ), bensì si spegne quando il contatore arriva a 10, variandone cosi la durata (dipende da quando premi il pulsante),
A meno che l’interrupt non resetti tuttoresettando il contatore. Grazie Max
Autore
Ciao Davide,
in parte ciò c’è scrivi é corretto, il led giallo resta acceso dalla pressione del pulsante fino al raggiungimento del valore 10 del contatore.
In pratica il tempo in cui il led resta acceso dipende dal momento in cui premi il pulsante rispetto al lampeggio dei due led rosso e verde.
Se al momento in cui premi il pulsante il contatore vale 5 resterà acceso per i 5 cicli successivi, supponendo che valda 3 resterà acceso per i 7 cicli successivi, ecc…
Mauro
Ciao Mauro,
“BRAVISSSIMOOO” e grazie per tutto che ci stai dando.
Sto usando Arduino 2009 e come estensione di IO il Tlc 5940 che usa i pin 13,11,10,9 e 3 per essere pilotato, volendo utilizzare gli interrupt sono limitato all’ uso del solo pin 2, visto che il 3 e’ utilizzato dal Tlc? Oppure ho altre alternative?
In attesa grazie e ciao.
Autore
Ciao Aldo,
purtroppo su Arduino Uno hai solo 2 pin da utilizzare come interrupt: il pin 2 ed il pin 3.
Puoi collegare il TLC5940 ad un altro pin di Arduino libero che non possieda caratteristiche di interrupt.
Mauro
Scusami… So programmare ma ancora non ho messo le mani su arduino e mi sto documentando.
Leggendo il codice, mi sembra che il led non stia necessariamente acceso 10 cicli perché quando arriva l’interrupt il contatore potrebbe stare a 9 e quindi essere azzerato al primo ciclo successivo…
Giusto o mi sfugge qualcosa ? Non vedo modifiche al contatore nella routine di interrupt.
Giusto per capire eh… Non voglio criticare la tua ottima spiegazione !! 😉
Autore
Ciao Andrea,
corretto, i led rosso e verde lampeggiano indipendentemente da interrupt o altri eventi. L’interrupt accende il led giallo solo se rileva il cambio di stato del pin 2 e si spegne quando la variabile di count arriva a 10 indipendentemente dal momento di accensione.
Mauro
Ciao Mauro, ti faccio i compliment per il sito.
Ho da proporti un quesito e viste le tue conoscenze sono certo che
mi potrai aiutare.
Premetto che non capisco niente di elettronica e non sono
interessato alla materia.
Mi diletto solo a programmare in Visual Basic, ma da un mese circa
sto lavorando ad un piccolo progetto ed avrei bisogno
di visualizzare su un display a segmenti o matrice di led un
numero che viene restituito da una query eseguita su di un database.
Ho quindi acquistato una scheda Arduino UNO e un display a matrice
di led 8×8.
Ho cominciato a fare dei piccoli esperimenti ma sono ancora ben
lontano dal raggiungere il risultato sperato.
Ho pensato di caricare su Arduino il software in C con la gestione
dei numeri da 1 a 99, ma il mio problema è che non so
come fare a scatenare l’evento, cioè se la query mi
restituisce ad esempio il numero 26, come faccio a far scattare
l’evento che mi ricrea il numero 26 sul display?
Non posso usare una variabile contatore perchè il numero non è progressivo e non si incrementa sempre
di 1.
Non so se sono stato chiaro.
Puoi illuminarmi?
Ti ringrazio.
Ciao.
Luigi
Autore
Ciao Luigi,
hai pensato alla comunicazione seriale?
Da VB generi un flusso di dati seriali con il numero che vuoi visualizzare e lato Arduino, quando ricevi un input seriale, scrivi il numero che vuoi visualizzare sul display o altro dispositivo.
Ti potrebbe essere utili leggere i miei ultimi articoli sulla comunicazione con XBee, se elimini la parte di trasmissione via XBee la comunicazione seriale è identica.
Mauro
Ciao Mauro, sono nuovo del forum e visto che sei un esperto di Arduino dati gli innumerevole progetti tutorial e quant’altro hai pubblicato……volevo chiederti una mano alla realizzazione di uno sketch x arduino uno che credo x te risulterà banale ma x me che sono alle prime armi è difficile.
In breve, con Arduino uno ho bisogno di comandare due led che si devono accendere contemporaneamente per 15min e poi spegnersi x altri 15 min il tutto per un tempo tot di due ore(15min accesi, 15 min spenti, 15 min accesi…).
Grazie anticipatamente e a presto.
Ciao Fabio
Autore
Ciao Fabio,
il blog è nato per insegnare a tutti gli appassionati a programmare ecco il perché del corso on-line gratuito e dei tanti esperimenti pubblicati.
La realizzazione di sketch su misura è per chi deve realizzare un proprio progetto e non è interessato ad imparare arduino.
Se vuoi che ti realizzi uno sketch inviami una richiesta sulla casella info del blog e provvederò a farti un preventivo.
capisco la tua filosofia e concordo con il tuo ragionamento, cercherò di studiare da solo e spero di riuscire a creare da me cio di cui ho bisogno. grazie comunque x l’offerta del preventivo
Autore
Ottimo Fabio,
spirito giusto.
Se leggendo qualche tutorial incontri qualcosa di poco chiaro usa pure i commenti per chiedere delucidazioni.
Io proverò a risponderti e chiarirteli.
Ciao Mauro, sto cercando di costruire un “autovelox” con Arduino e vorrei capire come poter far partire un timer al momento giusto, mi spiego meglio. utilizzo un laser ed una fotoresistenza, vorrei che il timer partisse quando il fascio viene interrotto. Tramite la funzione attachInterrupt ho capito come posso richiamare un’altra funzione al momento del cambiamento di stato di un sensore, ma il mio problema riguarda il timer, quale funzione posso usare per calcolare il tempo? Grazie in anticipo
Autore
Ciao Guido,
io userei millis(), ho scritto un tutorial ad hoc e mi sembra che possa essere impiegata facilmente nel tuo progetto.
Ciao Mauro, ho appena finito di costruire unesemplare di motore a scoppio per una squola, tutto in legno ma funzionante.Sezionato frontalmente per vedere il moto dei pistoni. Il problema mio è questo. tu sai benissimo che un motore deve rispettare le 4 fasi aspirazione compressione scoppio e scarico, con punto di inizio del pistone al punto morto superiore. im motore che muove l’albero motore è un passo passo, con semplice andatura regolare. andatura che posso regolare a mio piacimento. Ho voluto colorare le 4 fasi con dei colori led: azzurro aspirazione; verde compressione; rosso scoppio; senza colore l’espulsione. Io avrei gia risolto il problema con dei reed magnetici, ma volevo delgare il tutto all’arduino uno, e vengo al dunque.Premetto che io sono un obbista non un genio come te. Leggevo il tuo tutorial su arduino interrupt…. Quando fermo il motore, la posizione dei pistoni è casuale. Quando lo faccio ripartire,” il motore dovrebbe posizionarsi al punto morto superiore, ma il codice dovrebbe ripartire da capo”. il motore è gestito da un l298 tramite arduino. Il motore è un 200 passi con rapporto pignone corona di 1 a 5 .Cinque giri del motore per un giro dell’albero motore completo. Ogni 2,5 giri del motore dovrei avere un segnale per accendere i reltivi led.
Non so se sia abbastanza confusa questa mia richiesta, comunque ti ringrazio per quello che ci hai regalato nei tuoi tutorial. Quando avrò finito il motore ti invierò un video.
Autore
Ciao Luigi,
bel progetto 🙂 mi piacerebbe potergli dedicare un articolo con tanto di foto e video del progetto.
Se ho compreso quello che mi chiedi è di riportare la posizione del motore al punto morto superiore all’accensione dell’arduino e quindi al ciclo di demo; io procederei inserendo un microswitch con funzione di finecorsa in corrispondenza del punto morto superiore, in questo modo nella funzione di setup() potresti inserire un while( digitalRead(pinButton) == HIGH ) { — fai girare il motore — } ottenendo che il pistone si posizioni sempre in questo punto all’accensione.
Grazie mauro per la risposta
Però non riesco a tirar fuori un ragno dal buco ….come si suol dire. Ti mostro l’inizio del codice impostato
mi puoi mostrare come inseriresti i dati che mi hai mandato? Grazie
[[ codice rimosso in automatico ]]
Ti ho inserito una parte del void loop , ma tu senz’altro avrai gia capito come prosegue
Anticipatamente ti ringrazio
luigi
Scusa mauro
ti ho fatto una domanda un po’ troppo affrettata .Mi riferivo al progetto del motore, dove il moto è dato da motore passo passo con un l298
Quando hai un po di tempo se puoi darmi una dritta, ti ringrazio
luigi
Autore
Ciao Luigi,
nessun problema ti ho scritto sopra.
Autore
Ciao Luigi,
innanzitutto ti chiedo la cortesia di rispettare le poche regole che ha il blog, una tra tutte è scritta in fondo ad ogni articolo ed è vietato incollare codice nei commenti.
Purtroppo non possiedo doti che tu mi attribuisci per cui oltre a non aver capito cosa vuoi fare non ho possibilità di comprendere come aiutarti.
Io ti ho scritto la logica da applicare e di metterla nel setup() e non nel loop(), questo ti permette di riportare il pistone sempre in posizione iniziale ogni volta che accendi il circuito, il resto mi hai scritto di averlo già fatto e non devi modificarlo.
ciao mauro
penso di aver risolto il problema. Ho impostato un altro codice ho smanettato un po’ ma adesso funziona .
Appena finito ti manderò qualche foto se mi dai un indirizzo.
luigi
Autore
Bene Luigi,
sono contento.
buon giorno a tutti, io vorrei sapere come posso utilizzare il timer per avere un Interrupt per esempio ogni 100 millisecondi. grazie.
Autore
Ciao ONCIRO,
non ho compreso la tua richiesta e lo scopo del tuo progetto.
Lascio il commento on-line in modo che altri appassionati possano darti risposta.
intendevo dire che, mentre il programma esegue altre istruzioni nella routine principale, vorrei che il timer generasse l interrupt per leggere delle istruzioni nel suo interno ogni 100 o 200 millisecondi,giusto per dire un tempo, e non utilizzare il cambiamento di stato su un ingresso del chip.
nel frattempo ringrazio tutti anticipatamente
Autore
Attenzione ONCIRO,
gli interrupt descritti in questo articolo sono in input ad arduino.
Se devi far generare un pseudo multitasking devi usare il millis e fare tutti i controlli sui cicli, ho scritto alcuni articoli in merito.
Dico “pseudo” in quanto arduino non è multitasking.
grazie Mauro dove posso reperire gli articoli in merito per capire qualcosa in più?
buona serata.
Autore
Ciao ONCIRO,
trovi tutto usando la funzione cerca del Blog o seguendo il mio corso base arduino gratuito on-line.
grazie mille Mauro, io ho lavorato per una vita con la serie st6 e 7, ma sembra che il futuro sia questo cominciamo ad entrarci e man mano ci adegueremo.
Salve,
ho bisogno di avere un ulteriore pin di interrupts su Arduino uno. E’ possibile aggiungere uno?
Ho trovato questa libreria, l’ha mai usata?
https://github.com/GreyGnome/EnableInterrupt
grazie
Autore
Ciao Daniela,
purtroppo no. Sto scrivendo proprio in questi giorni degli articoli su come usare degli AtTiny85 per controllare via i2c degli interrupt da arduino, poichè anche a me spesso non bastano i soli 2 presenti nell’arduino uno.
Ciao interessante ma se volessi usare i minuti come posso fare vorrei evitare di fare la conversione in millisecondo
Autore
Ciao Lampone,
non ho compreso la richiesta.
Quando compilo la riga :attachInterrupt(0;interruptGiallo,RISING);
per accendere altervativamente un led rosso e verde, al caricamento del programma mi da sempre il seguente messaggio di errore:interruptGiallo’ was not declaredin in this scope.
Ho provato in tutti i modi,ma sono sempre bloccato.
Grazie.
Autore
Ciao Amerigo,
sei certo che la funzione “interruptGiallo” esista e non ci sia qualche carattere differente, ricorda che arduino è case sensitive
Non avevo chiuso la parentesi graffe dopo la riga di comando :voidinterruptGiallo().
Autore
Grazie Amerigo
Salve,
ho un semplice programma che conta quanti click vengono fatti con un bottone
____________________________________________________
[[ codice rimosso in automatico ]]
______________________
A volte ad ogni click conta non 1 ma 2 clic, dove potrebbe essere l’errore?
Daniele
Autore
Ciao Daniele,
il codice viene rimosso in automatico nel rispetto delle regole del blog che hai letto in fondo ad ogni articolo.
con i bottoni può accedere ce tu abbia un doppio conteggio, devi inserire un codice di debouncer.
ciao Mauro,
una domanda io dovrei utilizzare 2 interrupt potrei usare lo stesso tu codice (modificandolo per due variabili )
e poi sul Arduino non si usa l’interrupt solo sui piedini 2 e 3
Autore
Ciao Alex,
si puoi utilizzare il mio codice come base se ti serve sperimentare con gli interrupt.
Gli interrupts su Aruino Uno sono i pin 2 e 3.
Salve,
solo una piccola delucidazione:
“il valore restituito dalla funzione millis() non si incrementa”, ma da dentro la funzione ISR posso leggerlo ?? e mi rende il valore corrente al momento in cui e’ scattato l’interrupt ??
Lo chiedo perche’ ho un contatto (girante di anemometro) di cui devo contare le attivazioni durante un prefissato tempo (2 secondi) e vorrei fare un minimo di debouncing inibendo il tutto per qualche centinaio di microsecondi dopo la prima attivazione..
Grazie dell’attenzione.
Cordiali saluti
Mauro
Autore
Ciao Mauro,
stando alla nota non è possibile usare ne delay() ne millis() nella funzione di interrupt
Ciao Mauro io ho appena realizzato uno schetc simile al tuo con interrupts ma ho il problema che anche senza pressione del pulsante mi esegue la funzione dell’interrupts ugualmente ,sinceramente non capisco il perché mi legga la variazione del segnale quando non c’è nessuna variazione di segnale!
Grazie intanto !
Autore
Ciao Simone,
potrebbe dipendere dai terminali che fanno falso contatto.
Perché assieme all’ interrupts utilizzo la funzione delay,la funzione servo, se non sono queste due che mi mandano in conflitto l interrupts allora sono i contatti immagino come tu dici!
Salve, non posso dire certo che sono un esperto programmatore di Arduino, però qualche progetto l’ho fatto, e in elettronica me la cavo abbastanza. Dato che ho anche la passione dell’acquariofilia ho un acquario e senza dilungarmi ho costruito un refrigeratore per l’acqua. A questo scopo mi serviva controllare la portata della pompa dello scambiatore, cosi ho preso un Arduino nano per leggere i litri di portata e nel caso diminuiscano troppo o la pompa si fermi spegnere il refrigeratore. Venendo al punto nello sketch ho usato gli Interrupt, per questo motivo ho letto questo tutorial, perché funzionerebbe tutto bene se non fosse che se il flusso so blocca di colpo (pompa ferma) il programma si blocca, e da qui non ne esco. Quello che penso di aver capito è che non arrivando nessun impulso il programma si fermi all’Interrupt in attesa. Cosa si può fare, abbandono gli Interrupt??
Diego
Autore
Ciao Diego,
mi sembra strano che lo sketch si fermi quando l’interrupt non riceve dati, l’interrupt serve proprio ad evitare questo.
Controlla nel codice che non sia stato tu ad inserire una condizione di fermo se i valori di interrupt non cambiano, in tal caso rimuovi tale condizione e/o sostituiscila con una condizione che prevenga tale blocco.
[…] eseguito due, entrambi si basano sull’uso degli interrupt di Arduino e prendono spunto da questo esempio di codice ben fatto: Rotary Encoder + Arduino puoi […]
[…] Trovi maggiori informazioni sugli interrupt in questo articolo: Tutorial: Arduino interrupt […]