Tutorial: Arduino interrupt

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.

interrupt

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:

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

led rosso

e verde

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

Il video

ho realizzato anche un piccolo video della mia demo:

Buon divertimento !!!

  • Questo sito ed i suoi contenuti è fornito "così com'è" e Mauro Alfieri non rilascia alcuna dichiarazione o garanzia di alcun tipo, esplicita o implicita, riguardo alla completezza, accuratezza, affidabilità, idoneità o disponibilità del sito o delle informazioni, prodotti, servizi o grafiche correlate contenute sul sito per qualsiasi scopo.
  • Ti chiedo di leggere e rispettare il regolamento del sito prima di utilizzarlo
  • Ti chiedo di leggere i Termini e Condizioni d'uso del sito prima di utilizzarlo
  • In qualità di Affiliato Amazon io ricevo un guadagno dagli acquisti idonei qualora siano presenti link al suddetto sito.

Permalink link a questo articolo: https://www.mauroalfieri.it/elettronica/tutorial-arduino-interrupt.html

61 commenti

2 ping

Vai al modulo dei commenti

    • Elia il 9 Agosto 2012 alle 14:56
    • Rispondi

    Bello e semplice, il tuo progetto può aiutare a spiegare meglio come vengono gestiti gli interrupt dai microcontrollori.
    Grazie della guida 🙂

    1. Ciao Elia,
      sono contento ti sia stato utile, scrivo questi tutorial con quell’intento 🙂

      Mauro

      • bertonc96 il 3 Luglio 2018 alle 14:16
      • Rispondi

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

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

    • santo il 28 Maggio 2013 alle 08:42
    • Rispondi

    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

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

    • michele il 8 Giugno 2013 alle 12:39
    • Rispondi

    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

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

    • michele il 9 Giugno 2013 alle 09:04
    • Rispondi

    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

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

    • Mauro C. il 10 Luglio 2013 alle 10:29
    • Rispondi

    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.

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

        • Mauro C, il 11 Luglio 2013 alle 15:34
        • Rispondi

        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.

    • massimo il 23 Agosto 2013 alle 23:35
    • Rispondi

    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

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

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

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

    • Andrea il 19 Settembre 2013 alle 03:43
    • Rispondi

    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 !! 😉

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

    • Luigi il 18 Ottobre 2013 alle 20:26
    • Rispondi

    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

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

    • fabio il 12 Maggio 2014 alle 19:27
    • Rispondi

    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

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

    • fabio il 13 Maggio 2014 alle 16:40
    • Rispondi

    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

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

    • Guido il 29 Agosto 2014 alle 21:03
    • Rispondi

    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

    1. Ciao Guido,
      io userei millis(), ho scritto un tutorial ad hoc e mi sembra che possa essere impiegata facilmente nel tuo progetto.

    • LUIGI il 5 Marzo 2015 alle 17:10
    • Rispondi

    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.

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

    • luigi il 6 Marzo 2015 alle 17:34
    • Rispondi

    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

      • luigi il 6 Marzo 2015 alle 23:30
      • Rispondi

      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

      1. Ciao Luigi,
        nessun problema ti ho scritto sopra.

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

    • luigi il 8 Marzo 2015 alle 08:36
    • Rispondi

    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

    1. Bene Luigi,
      sono contento.

    • ONCIRO il 6 Gennaio 2016 alle 11:18
    • Rispondi

    buon giorno a tutti, io vorrei sapere come posso utilizzare il timer per avere un Interrupt per esempio ogni 100 millisecondi. grazie.

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

    • ONCIRO il 7 Gennaio 2016 alle 17:59
    • Rispondi

    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

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

    • ONCIRO il 8 Gennaio 2016 alle 19:38
    • Rispondi

    grazie Mauro dove posso reperire gli articoli in merito per capire qualcosa in più?
    buona serata.

    1. Ciao ONCIRO,
      trovi tutto usando la funzione cerca del Blog o seguendo il mio corso base arduino gratuito on-line.

    • ONCIRO il 11 Gennaio 2016 alle 16:17
    • Rispondi

    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.

    • Daniela Russo il 15 Marzo 2016 alle 22:22
    • Rispondi

    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

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

    • lampone1967 il 10 Aprile 2016 alle 11:17
    • Rispondi

    Ciao interessante ma se volessi usare i minuti come posso fare vorrei evitare di fare la conversione in millisecondo

    1. Ciao Lampone,
      non ho compreso la richiesta.

    • Savogin Amerigo il 3 Febbraio 2017 alle 18:44
    • Rispondi

    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.

    1. Ciao Amerigo,
      sei certo che la funzione “interruptGiallo” esista e non ci sia qualche carattere differente, ricorda che arduino è case sensitive

        • savogin Amerigo il 7 Febbraio 2017 alle 22:12
        • Rispondi

        Non avevo chiuso la parentesi graffe dopo la riga di comando :voidinterruptGiallo().

        1. Grazie Amerigo

    • Daniele il 22 Marzo 2017 alle 14:29
    • Rispondi

    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

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

    • alex il 27 Settembre 2017 alle 15:03
    • Rispondi

    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

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

    • MAURO BERNARDETTO il 9 Gennaio 2018 alle 16:29
    • Rispondi

    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

    1. Ciao Mauro,
      stando alla nota non è possibile usare ne delay() ne millis() nella funzione di interrupt

    • Simone Dallai il 1 Marzo 2018 alle 21:59
    • Rispondi

    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 !

    1. Ciao Simone,
      potrebbe dipendere dai terminali che fanno falso contatto.

    • Simone Dallai il 3 Marzo 2018 alle 18:32
    • Rispondi

    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!

    • DIEGO il 2 Luglio 2022 alle 12:09
    • Rispondi

    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

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

  1. […] 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 […]

  2. […] Trovi maggiori informazioni sugli interrupt in questo articolo: Tutorial: Arduino interrupt […]

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.