Lichtschranke mit ESP8266 und der Arduino Entwicklungsumgebung

Bauteileliste

Aufbau auf dem Steckbrett

Steckbrett

Fertig aufgebaut

Steckbrett

Programm-Code

  #define LDR_PIN A0                // LDR-Sensor an A0
#define AUSGABE_PIN D1            // Ausgangs-Pin D1 (GPIO5)

int schwellenwert = 50;           // Schwellwert für die Lichtänderung
int vorherigerWert = 0;           // Vorheriger LDR-Wert
bool istDunkel = false;           // Status: Hell oder Dunkel
unsigned long alarmStartzeit = 0; // Startzeit des Alarms
unsigned long tonStopzeit = 0;    // Zeitpunkt, zu dem der Ton gestoppt werden soll
const int alarmDauer = 180000;    // Maximal zulässige Alarmdauer in Millisekunden (180 Sekunden)
const int tonDauer = 30000;       // Ton-Dauer in Millisekunden (30 Sekunden)
const int frequenz = 800;




void setup() {
  pinMode(AUSGABE_PIN, OUTPUT);  // Ausgangspin als Ausgabe definieren

}

void loop() {
  int aktuellerWert = analogRead(LDR_PIN); // Aktuellen Wert des LDR lesen
  
  // Prüfen, ob der Unterschied von Hell zu Dunkel den Schwellwert überschreitet
  if (vorherigerWert - aktuellerWert > schwellenwert && !istDunkel) {
    istDunkel = true;  // Licht wurde dunkler
    tone(AUSGABE_PIN, frequenz);  // 1000 Hz auf AUSGABE_PIN ausgeben
    alarmStartzeit = millis(); // Startzeit des Alarms speichern
    tonStopzeit = millis() + tonDauer; // Zeitpunkt berechnen, wann der Ton gestoppt werden soll
  }

  // Wenn es heller wird, Ton nicht sofort stoppen, sondern nach 30 Sekunden
  if (aktuellerWert - vorherigerWert > schwellenwert && istDunkel) {
    tonStopzeit = millis() + tonDauer; // Ton-Dauer zurücksetzen
  }

  // Alarm nach zulässiger Gesamtdauer stoppen
  if (millis() - alarmStartzeit >= alarmDauer) {
    noTone(AUSGABE_PIN); // Ton stoppen
    istDunkel = false;   // Alarm zurücksetzen
  }

  // Ton stoppen, wenn die 30 Sekunden vergangen sind
  if (millis() >= tonStopzeit) {
    noTone(AUSGABE_PIN); // Ton stoppen
  }

  // Vorherigen Wert aktualisieren
  vorherigerWert = aktuellerWert;
  
  delay(100); // Kurze Verzögerung für Stabilität
}
  
  
  
  
  

Erklärung des Codes:

Ganz oben im Code


- `#define LDR_PIN A0`
👉 Das sagt dem Computer, dass der Licht-Sensor (wie ein Auge für Licht) am Platz A0 angeschlossen ist.
- `#define AUSGABE_PIN D1`
👉 Hier steht, dass das Gerät einen Ton an den Platz D1 (einen kleinen Anschluss) ausgeben soll.

---

Variablen (Zahlen und Schalter)


- `int schwellenwert = 50;`
👉 Das ist der Unterschied, ab dem der Computer merkt, dass es plötzlich dunkler oder heller wird.
- `int vorherigerWert = 0;`
👉 Das merkt sich, wie hell oder dunkel es vor einer Sekunde war.
- `bool istDunkel = false;`
👉 Ein Schalter: Ist es gerade dunkel? Am Anfang steht: Nein.
- `unsigned long alarmStartzeit = 0;`
👉 Das merkt sich, wann der Alarm (der Ton) gestartet ist.
- `unsigned long tonStopzeit = 0;`
👉 Das merkt sich, wann der Ton aufhören soll.
- `const int alarmDauer = 180000;`
👉 Der Alarm soll maximal 180.000 Millisekunden dauern (das sind 180 Sekunden oder 3 Minuten).
- `const int tonDauer = 30000;`
👉 Der Ton selbst soll immer nur 30 Sekunden lang dauern.
- `const int frequenz = 800;`
👉 Der Ton, den wir hören, hat eine Frequenz (eine Art Tonhöhe) von 800.

---

Im `setup()`


- `pinMode(AUSGABE_PIN, OUTPUT);`
👉 Hier wird D1 vorbereitet, damit der Computer dort einen Ton ausgeben kann.

---

Im loop()


Das ist der Teil, der immer wieder ausgeführt wird (wie eine Schleife):

1. `int aktuellerWert = analogRead(LDR_PIN);`
👉 Der Computer schaut nach, wie hell oder dunkel es gerade ist (der aktuelle Wert).

2. Wenn es dunkler wird:
   if (vorherigerWert - aktuellerWert > schwellenwert && !istDunkel) {
istDunkel = true;
tone(AUSGABE_PIN, frequenz);
alarmStartzeit = millis();
tonStopzeit = millis() + tonDauer;
}

👉 Wenn es plötzlich viel dunkler wird, sagt der Computer:
- "Oh, es ist dunkel!" (`istDunkel = true;`).
- Er macht den Ton an (`tone(...)`).
- Er merkt sich, wann der Alarm gestartet ist (`alarmStartzeit = millis();`).
- Und er plant, wann der Ton aufhören soll (`tonStopzeit = millis() + tonDauer;`).

3. Wenn es heller wird:
   if (aktuellerWert - vorherigerWert > schwellenwert && istDunkel) {
tonStopzeit = millis() + tonDauer;
}

👉 Wenn es wieder heller wird, bleibt der Ton noch für 30 Sekunden an. Der Computer verlängert die Zeit.

4. Alarmzeit vorbei:
   if (millis() - alarmStartzeit >= alarmDauer) {
noTone(AUSGABE_PIN);
istDunkel = false;
}

👉 Wenn der Alarm zu lange an war (mehr als 3 Minuten), wird der Ton ausgemacht, und der Computer sagt: "Es ist nicht mehr dunkel."

5. Ton stoppen:
   if (millis() >= tonStopzeit) {
noTone(AUSGABE_PIN);
}

👉 Wenn die 30 Sekunden für den Ton vorbei sind, wird der Ton gestoppt.

6. Vorherigen Wert aktualisieren:
   vorherigerWert = aktuellerWert;

👉 Der Computer merkt sich, wie hell es gerade war, damit er später vergleichen kann.

7. Kurze Pause:
   delay(100);

👉 Das Programm wartet ein bisschen (100 Millisekunden), bevor es wieder von vorne anfängt. So ist alles stabil.

Zusammenfassung


Dieses Programm benutzt ein "Licht-Auge" (den LDR), um zu sehen, ob es plötzlich dunkler oder heller wird. Wenn es dunkler wird, macht der Computer für eine Weile einen Ton. Dann wartet er, ob es heller wird, oder er stoppt den Ton, wenn die Zeit abgelaufen ist.

Begriffe


Ein LDR (Abkürzung LDR steht für Light Dependent Resistor, was auf Deutsch lichtabhängiger Widerstand) ist ein besonderer Widerstand, der auf Licht reagiert. Sein Name bedeutet auf Deutsch „lichtabhängiger Widerstand“.

Das funktioniert so:
- Wenn es hell ist, lässt der LDR mehr Strom durch (der Widerstand wird klein).
- Wenn es dunkel ist, lässt er weniger Strom durch (der Widerstand wird groß).

Man benutzt LDRs oft, um Dinge zu bauen, die das Licht messen können, wie z. B. Lampen, die sich im Dunkeln von selbst einschalten.