Arduinoprogramm für den ESP8266 Modul 12x
/* 3.3V
│
Klingeldraht (Taster)
│
GPIO5 -------┴------- GND (über Taster)
GPIO4 (Speaker) -- Piezo/Lautsprecher -- GND
GPIO14 (LED0) -----> LED + Widerstand -> GND
GPIO12 (LED1) -----> LED + Widerstand -> GND
GPIO13 (LED2) -----> LED + Widerstand -> GND
GPIO15 (LED3) -----> LED + Widerstand -> GND
GPIO0 (Reset-Button) -- Taster -- GND
LED_BUILTIN (GPIO2) -> onboard LED (intern)
Grundpotentiale
+3,3V
│
+---- 10kΩ ----+
| |
EN/CH_PD RST
| |
+---- 10kΩ ----+
|
GPIO0 ---- 10kΩ Pullup ---- 3,3V
GPIO2 ---- 10kΩ Pullup ---- 3,3V
GPIO15 ---- 10kΩ Pulldown -- GND
VCC (3,3V) ----> an 3,3V-Versorgung
GND ----> an Masse/0V
*/
/******************************************************
* Beispielcode für einen ESP8266 (z.B. NodeMCU)
* Funktion:
* - Klingeldraht-Eingang auf GPIO5 (D1 bei NodeMCU)
* - Lautsprecher-Ausgang auf GPIO4 (D2 bei NodeMCU)
* - 4 LEDs (binäre Anzeige) auf GPIO14(D5), GPIO12(D6), GPIO13(D7), GPIO15(D8)
* - Reset-Taster auf GPIO0 (D3 oder D0 je nach Board)
* - Onboard LED (LED_BUILTIN) blinkt kurz bei Berührung
*
* Hinweis:
* - Für tone() auf ESP8266 ggf. Library installieren
* - Achte auf die richtigen Pinbezeichnungen für dein Board
******************************************************/
#include <ESP8266WiFi.h> // nur um WLAN zu deaktivieren
// Pin-Zuweisungen (anpassen, wenn du andere Pins willst):
const int PIN_KLINGELDRAHT = 5; // GPIO5
const int PIN_SPEAKER = 4; // GPIO4
const int PIN_LED0 = 14; // GPIO14
const int PIN_LED1 = 12; // GPIO12
const int PIN_LED2 = 13; // GPIO13
const int PIN_LED3 = 15; // GPIO15
const int PIN_RESET_BUTTON = 0; // GPIO0 (D3 oder D0, je nach Board)
// Auf manchen ESP-Boards ist LED_BUILTIN = 2 (GPIO2)
const int PIN_ONBOARD_LED = LED_BUILTIN;
// Globale Variablen
volatile unsigned int counter = 0; // Zähler für die LED-Anzeige
bool previousState = HIGH; // Vorheriger Zustand des Klingeldraht-Eingangs (für Flankenerkennung)
void setup() {
// Serielle Schnittstelle für Debug (optional)
Serial.begin(115200);
delay(100);
// WLAN deaktivieren
WiFi.mode(WIFI_OFF);
WiFi.forceSleepBegin();
delay(1);
// Pins konfigurieren
pinMode(PIN_KLINGELDRAHT, INPUT_PULLUP); // Taster nach GND, PullUp aktiv
pinMode(PIN_SPEAKER, OUTPUT);
pinMode(PIN_LED0, OUTPUT);
pinMode(PIN_LED1, OUTPUT);
pinMode(PIN_LED2, OUTPUT);
pinMode(PIN_LED3, OUTPUT);
pinMode(PIN_RESET_BUTTON, INPUT_PULLUP); // Taster nach GND
pinMode(PIN_ONBOARD_LED, OUTPUT);
digitalWrite(PIN_ONBOARD_LED, HIGH); // Onboard LED aus (bei manchen Boards invertiert)
// LED 5 Sekunden lang blinken lassen
for (int i = 0; i < 5; i++) {
digitalWrite(PIN_ONBOARD_LED, LOW); // LED an (bei vielen Boards ist LOW an)
delay(500);
digitalWrite(PIN_ONBOARD_LED, HIGH); // LED aus
delay(500);
}
Serial.println("System gestartet");
}
// Hilfsfunktion: gibt den Zähler im Binärformat auf die 4 LEDs aus
void showBinaryOnLEDs(unsigned int value) {
// Wir betrachten nur die unteren 4 Bits des Zählers
digitalWrite(PIN_LED0, (value & 0x01) ? HIGH : LOW);
digitalWrite(PIN_LED1, (value & 0x02) ? HIGH : LOW);
digitalWrite(PIN_LED2, (value & 0x04) ? HIGH : LOW);
digitalWrite(PIN_LED3, (value & 0x08) ? HIGH : LOW);
}
void loop() {
// --- Klingeldraht abfragen und Flankenerkennung ---
bool currentState = digitalRead(PIN_KLINGELDRAHT);
// Wenn wir eine fallende Flanke erkennen (von HIGH -> LOW),
// bedeutet das, dass der Klingeldraht-Taster betätigt wurde.
if (previousState == HIGH && currentState == LOW) {
counter++;
// Debug-Ausgabe
Serial.print("Berührung erkannt! Neuer Zählerstand: ");
Serial.println(counter);
// Kurz Onboard LED einschalten
digitalWrite(PIN_ONBOARD_LED, LOW); // Achtung: bei manchen Boards ist LOW = LED an
delay(100);
digitalWrite(PIN_ONBOARD_LED, HIGH);
// Schriller Ton am Lautsprecher (z.B. 2000 Hz für 200 ms)
// ACHTUNG: tone() ist auf ESP8266 u.U. nicht nativ vorhanden.
// Bitte ggf. eine passende Bibliothek installieren oder ersetzen.
tone(PIN_SPEAKER, 2000, 200); // Frequenz 2000 Hz, Dauer 200 ms
// LEDs aktualisieren
showBinaryOnLEDs(counter);
}
previousState = currentState;
// --- Reset-Taster abfragen ---
// Wenn gedrückt, dann Zähler zurücksetzen
if (digitalRead(PIN_RESET_BUTTON) == LOW) {
// Debounce Wartezeit
delay(30);
if (digitalRead(PIN_RESET_BUTTON) == LOW) {
Serial.println("Zähler wird zurückgesetzt.");
counter = 0;
showBinaryOnLEDs(counter);
}
}
// Kurze Pause (kann man anpassen)
delay(10);
}
Hier ist eine Tabelle, die alle 4-Bit-Binärzahlen und ihre entsprechenden Dezimalwerte zeigt:
| Binär | Dezimal |
|---|---|
| 0000 | 0 |
| 0001 | 1 |
| 0010 | 2 |
| 0011 | 3 |
| 0100 | 4 |
| 0101 | 5 |
| 0110 | 6 |
| 0111 | 7 |
| 1000 | 8 |
| 1001 | 9 |
| 1010 | 10 |
| 1011 | 11 |
| 1100 | 12 |
| 1101 | 13 |
| 1110 | 14 |
| 1111 | 15 |
Die Umrechnung erfolgt durch die Summe der Potenzen von 2, die den Positionen der gesetzten Bits entsprechen.