Lektion 17/31: So unterbrechen Sie eine Verzögerung in Arduino und lichtabhängiger Widerstand LDR | Robojax
In dieser Anleitung erkunden wir zwei grundlegende Arduino-Konzepte: Interrupts und lichtabhängige Widerstände (LDRs). Sie lernen, wie Sie Verzögerungen in Ihrem Code unterbrechen können, damit Ihr Arduino sofort auf Tastendrücke reagieren kann, und dann bauen wir eine Lichtsensorsschaltung, die nachts automatisch einen Summer oder ein Licht einschalten kann. Dieses Projekt ist perfekt für alle, die über einfache Blink-LED-Skizzen hinausgehen und reaktionsfähige, reale Automatisierungsprojekte erstellen möchten. Sie können diese Fähigkeiten anwenden, um ein intelligentes Nachtlicht für Ihren Flur, einen einfachen Sicherheitsalarm, der ertönt, wenn eine Tür geöffnet wird, ein solarbetriebenes Gartenlicht, das in der Dämmerung aktiviert wird, oder einen automatischen Vorhang, der sich schließt, wenn die Sonne untergeht, zu erstellen. Die Lektion basiert auf dem SunFounder 3-in-1 Arduino-Kit, aber die Konzepte gelten für jedes Standard-Arduino-Board.

Hardware & Komponenten
Um dieses Projekt nachzuvollziehen, benötigen Sie die folgenden Komponenten. Ein Standard-Arduino Uno oder Nano ist perfekt für diesen Aufbau.
- Arduino Uno oder Nano
- Lichtabhängiger Widerstand (LDR), wie der Kweeds KM601
- 10k-Ohm-Widerstand
- Drucktaster
- Summer
- Breadboard und Jumper-Kabel
Arduino-Interrupts verstehen
In einer Standard-Arduino-Skizze läuft die loop()-Funktion kontinuierlich und führt Aufgaben Zeile für Zeile aus. Wenn Sie eine delay() verwenden, stoppt der Arduino für diese Dauer alles andere. Dies ist ein Problem, wenn Sie auf ein wichtiges Ereignis wie einen Tastendruck reagieren müssen, während eine andere Aufgabe läuft. Wenn Sie beispielsweise eine Ein-Sekunden-Verzögerung haben, um eine LED blinken zu lassen, wird ein Tastendruck möglicherweise erst nach bis zu einer Sekunde registriert, was sich träge anfühlt (im Video bei 08:13).
Arduino-Interrupts lösen dieses Problem. Ein Interrupt ist eine Hardware-Funktion, die es einem bestimmten Pin ermöglicht, das Hauptprogramm zu "unterbrechen", das, was gerade läuft, anzuhalten und eine spezielle Funktion namens Interrupt Service Routine (ISR) auszuführen. Dadurch kann Ihr Arduino sofort auf hochprioritäre Ereignisse reagieren, unabhängig davon, was sonst noch passiert. Es ist wichtig zu beachten, dass nicht alle Pins Interrupts unterstützen. Auf dem Arduino Uno und Nano können nur die Pins 2 und 3 für diesen Zweck verwendet werden (im Video bei 02:37). Andere Boards wie der Mega haben mehr Optionen, aber für dieses Projekt bleiben wir bei Pin 2.
Interrupts können durch verschiedene Zustandsänderungen am Pin ausgelöst werden: LOW, CHANGE, RISING und FALLING. Der CHANGE-Modus löst den Interrupt aus, wann immer sich der Zustand des Pins von HIGH auf LOW oder von LOW auf HIGH ändert, was perfekt für einen Tastendruck-Umschalter ist.
Verdrahtungsanleitung
Wir werden in dieser Lektion zwei Schaltungen aufbauen. Die erste demonstriert Interrupts mit einem Taster und Summer, und die zweite verwendet einen LDR, um Lichtverhältnisse zu erfassen. Beginnen wir mit der Interrupt-Schaltung.
Schaltung 1: Taster und Summer für die Interrupt-Demo
Diese Schaltung ist unkompliziert. Der Taster ist an Pin 2 angeschlossen, unserem Interrupt-Pin. Ein 10k-Ohm-Pulldown-Widerstand stellt sicher, dass der Pin LOW liest, wenn der Taster nicht gedrückt ist, und HIGH, wenn er gedrückt ist. Der Summer ist an Pin 8 angeschlossen.
Für die Interrupt-Demo verbinden Sie die Komponenten wie folgt:
- Drucktaster: Verbinden Sie ein Bein mit 5V und das andere Bein mit digitalem Pin 2. Verbinden Sie einen 10k-Ohm-Widerstand von Pin 2 zu GND.
- Summer: Verbinden Sie die negative Leitung mit GND und die positive Leitung mit digitalem Pin 8.
Schaltung 2: LDR und Summer für die Lichterkennung
Für die LDR-Schaltung verwenden wir eine Spannungsteiler-Konfiguration. Der Widerstand des LDR ändert sich mit dem Licht, was die Spannung am analogen Pin verändert. Wenn es dunkel ist, hat der LDR einen hohen Widerstand (etwa 10k Ohm), und wenn es hell ist, sinkt der Widerstand erheblich (im Video bei 16:25). Diese Widerstandsänderung messen wir.
Ein Spannungsteiler ist notwendig, da der Arduino nur Spannung lesen kann, nicht Widerstand. Indem der LDR in Reihe mit einem festen 10k-Ohm-Widerstand platziert wird, ändert sich die Spannung am Punkt zwischen ihnen proportional zum Widerstand des LDR. Diese Spannung wird dann vom Analog-Digital-Wandler (ADC) des Arduinos gelesen.
Für die LDR-Demo verbinden Sie die Komponenten wie folgt:
- LDR: Verbinden Sie ein Bein mit 5V und das andere Bein mit analogem Pin A0.
- 10k-Ohm-Widerstand: Verbinden Sie vom LDR-Bein, das zu A0 führt, nach unten zu GND. Dies erzeugt den Spannungsteiler.
- Summer: Verbinden Sie die negative Leitung mit GND und die positive Leitung mit digitalem Pin 8.
Hinweis: Die genauen Pin-Zuweisungen sind im Code definiert und können an Ihr Setup angepasst werden.
Code-Erklärung
Wir konzentrieren uns auf die benutzerkonfigurierbaren Teile des bereitgestellten Codes, die das Verhalten des Projekts steuern. Das vollständige Programm ist unten im Artikel zum Download verfügbar.
Der Code ist so konzipiert, dass er leicht geändert werden kann. Am Anfang der Skizze finden Sie die wichtigsten Variablen, die Sie anpassen können.
const byte buzzerPin = 8;
const byte interruptPin = 2;
volatile byte state = LOW;
int count=0;
Hier ist buzzerPin auf Pin 8 gesetzt, wo du den Summer anschließt. Der interruptPin ist auf Pin 2 gesetzt, der Pin, der auf den Tastendruck hört. Die Variable state ist ein volatile Byte, das den aktuellen Zustand des Summers (HIGH oder LOW) speichert. Sie ist als volatile markiert, weil sie innerhalb der Interrupt-Service-Routine (ISR) geändert wird, und dieses Schlüsselwort stellt sicher, dass der Arduino immer den neuesten Wert liest. Die Variable count ist ein einfacher Zähler, der in der Hauptschleife erhöht wird, um zu zeigen, dass die Schleife weiterläuft, während der Interrupt aktiv ist.
In der setup()-Funktion wird der Summer-Pin als OUTPUT und der Interrupt-Pin als INPUT festgelegt. Die entscheidende Zeile ist attachInterrupt(), wo der Interrupt konfiguriert wird. Diese Funktion teilt dem Arduino mit, welchen Pin er überwachen, welche Funktion er beim Auftreten des Interrupts aufrufen und welche Auslösebedingung er verwenden soll.
attachInterrupt(digitalPinToInterrupt(interruptPin), noisy, CHANGE);
Diese Zeile hängt einen Interrupt an den angegebenen Pin an. Die Funktion digitalPinToInterrupt() wandelt die Pinnummer in die korrekte Interruptnummer um. noisy ist der Name der Funktion, die aufgerufen wird, wenn der Interrupt ausgelöst wird. Schließlich ist CHANGE der Modus, der den Interrupt bei jeder Zustandsänderung des Pins auslöst. Du kannst dies je nach Bedarf in RISING, FALLING oder LOW ändern.
Die Funktion noisy() ist die ISR. Sie ist eine einfache Umschaltfunktion, die den Zustand des Summers umkehrt. Wenn die Taste gedrückt wird, löst der Interrupt diese Funktion aus, die die Variable state invertiert und an den Summer-Pin schreibt. So kannst du den Summer bei jedem Tastendruck ein- und ausschalten, selbst während die Hauptschleife mit Zählen und Verzögern beschäftigt ist.
Um das Verhalten des Projekts so zu ändern, dass der Summer nachts statt tagsüber aktiviert wird, müsstest du die bedingte Logik in der Hauptschleife ändern und die digitalWrite()-Befehle für die HIGH- und LOW-Zustände vertauschen.
Live-Projekt & Demonstration
In der Demonstration siehst du zwei wichtige Experimente. Zuerst wird die Interrupt-Schaltung ohne den Interrupt-Code gezeigt, wobei die Verzögerung in der Schleife die Tastenreaktion träge macht. Dies verdeutlicht das Problem, das Interrupts lösen.
Dann, mit geladenem Interrupt-Code, zeigt der serielle Monitor den Zähler, der jede Sekunde erhöht wird. Wenn die Taste gedrückt wird, schaltet der Summer sofort ein oder aus, unabhängig von der Verzögerung in der Hauptschleife. Dies beweist, dass der Interrupt die Wartezeit erfolgreich umgeht und seine Aufgabe sofort ausführt (im Video bei 14:07).
Für den LDR-Teil gibt der serielle Monitor den rohen analogen Wert aus. Du kannst sehen, dass der Wert bei hellem Licht hoch ist (etwa 960) und deutlich abfällt (auf etwa 400 oder weniger), wenn der Sensor abgedeckt wird. Dies zeigt, wie sich der Widerstand des LDR mit der Lichtintensität ändert. Der Code verwendet dann einen Schwellenwert, um zu bestimmen, ob es "Tag" oder "Nacht" ist, und steuert den Summer entsprechend. Indem du den Sensor abdeckst, um Nacht zu simulieren, kannst du den Summer auslösen, und durch Lichteinfall kannst du ihn ausschalten.
Kapitel
- [00:00] Einführung in Arduino-Interrupts und LDR
- [01:43] Das Problem mit Verzögerungen im Arduino-Code
- [03:37] Verständnis von Interrupt-Pins und Modi
- [04:20] Verdrahtung der Tasten- und Summersschaltung
- [06:22] Code-Erklärung für die Verzögerungs-Demo
- [07:48] Demonstration des Verzögerungsproblems
- [09:26] Implementierung und Codierung des Interrupts
- [11:50] Wie die Interrupt-Funktion funktioniert
- [14:26] Einführung in lichtabhängige Widerstände (LDR)
- [15:44] Messung des LDR-Widerstands mit einem Multimeter
- [17:22] Verdrahtung der LDR- und Summersschaltung
- [19:55] Code zum Lesen von LDR-Werten
- [20:49] Demonstration der LDR-Wertänderungen
- [22:08] Festlegen von Tag- und Nacht-Schwellenwerten
- [23:40] Code zur Steuerung eines Summers mit LDR
- [25:21] Demonstration des automatischen Nachtlichts
/*
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
Dinge, die Sie vielleicht brauchen
-
AmazonSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
Amazon
-
Amazon
-
Amazon
-
Amazon
Ressourcen & Referenzen
-
DokumentationDokumentation für das SunFounder 3 in 1 IoT/Smarte Auto/Lernkitdocs.sunfounder.com
-
ExternKaufe das 3-in-1 Smart Car Lernkit von SunFounder.sunfounder.com
Dateien📁
Arduino-Bibliotheken (zip)
-
SunFounder 3-in-1 Smart Car Lernkit Quellcode
3in1-kit-main-v2.zip12.80 MB