Klingeldraht

20Klingeldraht_Steckplatine.pngArduinoprogramm 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);
}

4-Bit Binär zu Dezimal

Hier ist eine Tabelle, die alle 4-Bit-Binärzahlen und ihre entsprechenden Dezimalwerte zeigt:

Binär Dezimal
00000
00011
00102
00113
01004
01015
01106
01117
10008
10019
101010
101111
110012
110113
111014
111115

Die Umrechnung erfolgt durch die Summe der Potenzen von 2, die den Positionen der gesetzten Bits entsprechen.