Lezione 17/31: Come interrompere un ritardo in Arduino e Resistore Dipendente dalla Luce LDR | Robojax
In questa guida esploreremo due concetti essenziali di Arduino: gli interrupt e i resistori dipendenti dalla luce (LDR). Imparerai come interrompere i ritardi nel tuo codice così che il tuo Arduino possa rispondere istantaneemente alle pressioni dei pulsanti, e poi costruiremo un circuito di rilevamento della luce che può accendere automaticamente un cicalino o una luce di notte. Questo progetto è perfetto per chiunque voglia andare oltre i semplici sketch con LED lampeggianti e iniziare a creare progetti di automazione reattivi e nel mondo reale. Puoi applicare queste competenze per creare una luce notturna intelligente per il tuo corridoio, un semplice allarme di sicurezza che suona quando una porta si apre, una luce da giardino a energia solare che si attiva al crepuscolo, o una tenda automatica che si chiude quando il sole tramonta. La lezione si basa sul kit Arduino 3-in-1 SunFounder, ma i concetti si applicano a qualsiasi scheda Arduino standard.

Hardware e componenti
Per seguire questo progetto, avrai bisogno dei seguenti componenti. Un Arduino Uno o Nano standard è perfetto per questa realizzazione.
- Arduino Uno o Nano
- Resistore dipendente dalla luce (LDR), come il Kweeds KM601
- Resistore da 10k Ohm
- Pulsante
- Cicalino
- Breadboard e cavi jumper
Capire gli interrupt di Arduino
In uno sketch Arduino standard, la funzione loop() viene eseguita continuamente, svolgendo i compiti riga per riga. Quando usi un delay(), l'Arduino smette di fare qualsiasi altra cosa per quella durata. Questo è un problema se devi rispondere a un evento importante, come la pressione di un pulsante, mentre un altro compito è in esecuzione. Ad esempio, se hai un ritardo di un secondo per far lampeggiare un LED, una pressione del pulsante potrebbe non essere registrata fino a un secondo, il che sembra poco reattivo (nel video a 08:13).
Gli interrupt di Arduino risolvono questo problema. Un interrupt è una funzionalità hardware che consente a un pin specifico di "interrompere" il programma principale, mettere in pausa ciò che sta facendo ed eseguire una funzione speciale chiamata Routine di Servizio Interrupt (ISR). Questo permette al tuo Arduino di rispondere istantaneamente a eventi ad alta priorità, indipendentemente da ciò che sta accadendo. È importante notare che non tutti i pin supportano gli interrupt. Sull'Arduino Uno e Nano, solo i pin 2 e 3 possono essere usati per questo scopo (nel video a 02:37). Altre schede come la Mega hanno più opzioni, ma per questo progetto useremo il pin 2.
Gli interrupt possono essere attivati da diversi cambi di stato sul pin: LOW, CHANGE, RISING e FALLING. La modalità CHANGE attiva l'interrupt ogni volta che lo stato del pin cambia da HIGH a LOW o da LOW a HIGH, il che è perfetto per un toggle con pulsante.
Guida al cablaggio
Costruiremo due circuiti in questa lezione. Il primo dimostra gli interrupt con un pulsante e un cicalino, e il secondo usa un LDR per rilevare i livelli di luce. Iniziamo con il circuito degli interrupt.
Circuito 1: Pulsante e cicalino per la demo degli interrupt
Questo circuito è semplice. Il pulsante è collegato al pin 2, che è il nostro pin di interrupt. Un resistore pull-down da 10k Ohm assicura che il pin legga LOW quando il pulsante non è premuto e HIGH quando lo è. Il cicalino è collegato al pin 8.
Per la demo degli interrupt, collega i componenti come segue:
- Pulsante: Collega una gamba a 5V e l'altra al pin digitale 2. Collega un resistore da 10k Ohm dal pin 2 a GND.
- Cicalino: Collega il terminale negativo a GND e il terminale positivo al pin digitale 8.
Circuito 2: LDR e cicalino per il rilevamento della luce
Per il circuito con LDR, usiamo una configurazione a partitore di tensione. La resistenza dell'LDR cambia con la luce, il che altera la tensione sul pin analogico. Quando è buio, l'LDR ha una resistenza elevata (circa 10k Ohm), e quando è luminoso, la resistenza diminuisce notevolmente (nel video a 16:25). Questo cambiamento di resistenza è ciò che misuriamo.
Un partitore di tensione è necessario perché l'Arduino può leggere solo la tensione, non la resistenza. Posizionando l'LDR in serie con un resistore fisso da 10k Ohm, la tensione nel punto tra di loro cambia proporzionalmente alla resistenza dell'LDR. Questa tensione viene poi letta dal convertitore analogico-digitale (ADC) dell'Arduino.
Per la demo con LDR, collega i componenti come segue:
- LDR: Collega una gamba a 5V e l'altra al pin analogico A0.
- Resistore da 10k Ohm: Collega dalla gamba dell'LDR che va a A0 fino a GND. Questo crea il partitore di tensione.
- Cicalino: Collega il terminale negativo a GND e il terminale positivo al pin digitale 8.
Nota: Le assegnazioni esatte dei pin sono definite nel codice e possono essere modificate per adattarsi alla tua configurazione.
Spiegazione del codice
Ci concentreremo sulle parti configurabili dall'utente del codice fornito che controllano il comportamento del progetto. Il programma completo è disponibile per il download sotto l'articolo.
Il codice è progettato per essere facilmente modificato. All'inizio dello sketch troverai le variabili chiave che puoi regolare.
const byte buzzerPin = 8;
const byte interruptPin = 2;
volatile byte state = LOW;
int count=0;
Qui, buzzerPin è impostato sul pin 8, che è dove colleghi il buzzer. Il interruptPin è impostato sul pin 2, che è il pin che ascolterà la pressione del pulsante. La variabile state è un byte volatile che contiene lo stato attuale del buzzer (HIGH o LOW). È marcata come volatile perché viene modificata all'interno della routine di servizio dell'interrupt (ISR), e questa parola chiave garantisce che l'Arduino legga sempre il valore più recente. La variabile count è un semplice contatore che viene incrementato nel loop principale per dimostrare che il loop continua a funzionare mentre l'interrupt è attivo.
Nella funzione setup(), il pin del buzzer è impostato come OUTPUT, e il pin dell'interrupt è impostato come INPUT. La riga critica è attachInterrupt(), dove configuri l'interrupt. Questa funzione dice all'Arduino quale pin osservare, quale funzione chiamare quando si verifica l'interrupt, e quale condizione di trigger utilizzare.
attachInterrupt(digitalPinToInterrupt(interruptPin), noisy, CHANGE);
Questa riga collega un interrupt al pin specificato. La funzione digitalPinToInterrupt() converte il numero del pin nel numero di interrupt corretto. noisy è il nome della funzione che verrà chiamata quando l'interrupt viene attivato. Infine, CHANGE è la modalità, che attiva l'interrupt su qualsiasi cambiamento di stato del pin. Puoi cambiarlo in RISING, FALLING o LOW a seconda delle tue esigenze.
La funzione noisy() è l'ISR. È una semplice funzione di toggle che inverte lo stato del buzzer. Quando il pulsante viene premuto, l'interrupt attiva questa funzione, che inverte la variabile state e la scrive sul pin del buzzer. Questo ti permette di accendere e spegnere il buzzer a ogni pressione del pulsante, anche mentre il loop principale è occupato a contare e a eseguire ritardi.
Per cambiare il comportamento del progetto e attivare il buzzer di notte invece che durante il giorno, dovresti modificare la logica condizionale nel loop principale, scambiando i comandi digitalWrite() per gli stati HIGH e LOW.
Progetto Live e Dimostrazione
Nella dimostrazione, vedrai due esperimenti chiave. Prima, il circuito con interrupt viene mostrato in esecuzione senza il codice dell'interrupt, dove il ritardo nel loop rende la risposta del pulsante lenta. Questo evidenzia il problema che gli interrupt risolvono.
Poi, con il codice dell'interrupt caricato, il monitor seriale mostra il contatore che incrementa ogni secondo. Quando il pulsante viene premuto, il buzzer si accende o si spegne istantaneamente, indipendentemente dal ritardo nel loop principale. Questo dimostra che l'interrupt bypassa con successo il tempo di attesa ed esegue il suo compito immediatamente (nel video a 14:07).
Per la parte con l'LDR, il monitor seriale stampa il valore analogico grezzo. Puoi vedere che il valore è alto (circa 960) in luce intensa e diminuisce significativamente (a circa 400 o meno) quando il sensore viene coperto. Questo dimostra come la resistenza dell'LDR cambi con l'intensità della luce. Il codice usa poi un valore di soglia per determinare se è "giorno" o "notte" e controlla il buzzer di conseguenza. Coprendo il sensore per simulare la notte, puoi attivare il buzzer, e esponendolo alla luce, puoi spegnerlo.
Capitoli
- [00:00] Introduzione agli Interrupt Arduino e all'LDR
- [01:43] Il Problema dei Ritardi nel Codice Arduino
- [03:37] Comprensione dei Pin e delle Modalità degli Interrupt
- [04:20] Cablaggio del Circuito con Pulsante e Buzzer
- [06:22] Spiegazione del Codice per la Demo del Ritardo
- [07:48] Dimostrazione del Problema del Ritardo
- [09:26] Implementazione e Codifica dell'Interrupt
- [11:50] Come Funziona la Funzione dell'Interrupt
- [14:26] Introduzione alle Fotoresistenze (LDR)
- [15:44] Misurazione della Resistenza dell'LDR con un Multimetro
- [17:22] Cablaggio del Circuito con LDR e Buzzer
- [19:55] Codice per Leggere i Valori dell'LDR
- [20:49] Dimostrazione dei Cambiamenti dei Valori dell'LDR
- [22:08] Impostazione delle Soglie Giorno e Notte
- [23:40] Codice per Controllare un Buzzer con l'LDR
- [25:21] Dimostrazione della Luce Notturna Automatica
/*
Lesson 20/31: interrupt a delay in Arduino and Light Dependent Resistor LDR
Get this code and watch video Download and resource page https://robojax.com/RJT600
YouTube video https://www.youtube.com/watch?v=N_L11m1v_yk
* This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.*
* This code has been download from Robojax.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
const byte buzzerPin = 8;
const byte interruptPin = 2;
volatile byte state = LOW;
int count=0;
void setup() {
pinMode(buzzerPin, OUTPUT);
pinMode(interruptPin, INPUT);
attachInterrupt(digitalPinToInterrupt(interruptPin), noisy, CHANGE);
Serial.begin(9600);
digitalWrite(buzzerPin, state);
}
void loop() {
count++;
Serial.println(count);
delay(1000);
}
void noisy() {
state = !state;
digitalWrite(buzzerPin, state);
}
Common Course Links
Common Course Files
Cose di cui potresti avere bisogno
-
AmazonSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
Amazon
-
Amazon
-
Amazon
-
Amazon
Risorse e riferimenti
-
DocumentazioneDocumentazione per il kit di apprendimento SunFounder 3 in 1 IoT/Smart Car.docs.sunfounder.com
-
Esterno
File📁
Librerie Arduino (zip)
-
Codice sorgente del kit di apprendimento Smart Car 3-in-1 di SunFounder
3in1-kit-main-v2.zip12.80 MB