Kontaktsensor (MC-38) Tutorial für ESP8266, ESP32, Raspberry Pi Pico W

In diesem Abschnitt zeigen wir dir, wie du mit einem ESP32, ESP8266 oder Raspberry Pi Pico W einen Kontaktsensor (auch Türsensor, Einbruchsensor oder Fenstersensor genannt) baust und anschließend den Öffnen/Schließen-Status in Alexa, Google Home, SmartThings oder der Sinric Pro App anzeigst.

Sinric Pro contact sensor tutorial

Voraussetzungen :

  1. ESP32, ESP8266 oder Raspberry Pi Pico W x 1.
  2. Kontaktsensor (MC-38) x 1.
  3. Jumper-Kabel.

Kurze Einführung in den Kontaktsensor

Ein Kontaktsensor ist ein Gerät, das erkennt, ob eine Tür, ein Fenster oder ein anderes Objekt offen oder geschlossen ist. Ein Kontaktsensor besteht aus zwei Komponenten – einem Sensor und einem Magneten –, die verwendet werden, um den Status von Objekten wie Türen oder Fenstern zu bestimmen, also ob sie offen oder geschlossen sind.

Sinric Pro Contact Sensor Reed Switch Open Close

Der Sensor wird am Rahmen des Schiebefensters angebracht, während der Magnet am Fenster selbst befestigt wird. Wenn das Schiebefenster geschlossen ist, kommt der Magnet in die Nähe des Sensors und stellt eine Verbindung zwischen den beiden Komponenten her. Wird das Schiebefenster hingegen geöffnet, entfernt sich der Magnet vom Sensor und die Verbindung zwischen ihnen wird unterbrochen.

Verdrahtung des Kontaktsensors

Sinric Pro contact sensor wiring

Hinweis: Wir verwenden INPUT_PULLUP, anstatt einen 10-kΩ-Widerstand zwischen dem Reed-Schalter und GND anzuschließen.

MCU GPIO Pin
ESP32 19
ESP8266 4 (D2)
Pico W GP5

Lass uns prüfen, ob der Kontaktsensor richtig verdrahtet ist und funktioniert.

#if defined(ESP8266)
  #define SENSOR_PIN        D2
#elif defined(ESP32) 
  #define SENSOR_PIN        26
#elif (ARDUINO_ARCH_RP2040)
  #define SENSOR_PIN        5
#endif

int newState;
int oldState;

void setup() {
  Serial.begin(9600);
  pinMode(SENSOR_PIN, INPUT_PULLUP);

  oldState = digitalRead(SENSOR_PIN); // read the starting state
}

void loop() {
  newState = digitalRead(SENSOR_PIN); // read current state

  if(oldState != newState) {
    if (newState == HIGH) {
      Serial.println("Sliding window is open");
    } else {
      Serial.println("Sliding window is closed");
    }
    oldState = newState;
  }  
}

Diesen Code auf GitHub Gist ansehen

Schritt 1 : Einen neuen Kontaktsensor in Sinric Pro erstellen

Sinric Pro create device alexa

Sinric Pro contact sensor device notifications

Hier kannst du die Schalter für Open und Close aktivieren, um über die Sinric Pro App eine Push-Benachrichtigung zu erhalten, wenn sich der Status des Kontaktsensors zwischen Open und Close ändert.

Sinric Pro copy device id

Schritt 2 : Mit Sinric Pro verbinden

Schritt 2.1 Sinric Pro Bibliothek installieren

Sinric Pro install SinricPro library

Du kannst den Code generieren lassen, indem du die Zero Code Funktion nutzt, oder ihn selbst schreiben. Wenn du keine Programmiererfahrung hast, empfehlen wir dir, die Zero Code Funktion im Portal zu nutzen, um den Code zu generieren, herunterzuladen und zu flashen.

2.2 Vollständiger Code

#ifdef ENABLE_DEBUG
  #define DEBUG_ESP_PORT Serial
  #define NODEBUG_WEBSOCKETS
  #define NDEBUG
#endif 

#include <Arduino.h>
#if defined(ESP8266)
  #include <ESP8266WiFi.h>
#elif defined(ESP32) || defined(ARDUINO_ARCH_RP2040)
  #include <WiFi.h>
#endif

#if defined(ESP8266)
  #define SENSOR_PIN        D2
#elif defined(ESP32) 
  #define SENSOR_PIN        26
#elif (ARDUINO_ARCH_RP2040)
  #define SENSOR_PIN        5
#endif

#include "SinricPro.h"
#include "SinricProContactsensor.h"

#define WIFI_SSID         ""   // Your WiFI SSID name 
#define WIFI_PASS         ""   // Your WiFi Password.
#define APP_KEY           ""   // Should look like "de0bxxxx-1x3x-4x3x-ax2x-5dabxxxxxxxx" (Get it from Portal -> Secrets)
#define APP_SECRET        ""   // Should look like "5f36xxxx-x3x7-4x3x-xexe-e86724a9xxxx-4c4axxxx-3x3x-x5xe-x9x3-333d65xxxxxx" (Get it from Portal -> Secrets)
#define CONTACT_ID        ""   // Should look like "5dc1564130xxxxxxxxxxxxxx" (Get it from Portal -> Devices)
#define BAUD_RATE         115200              // Change baudrate to your need (used for serial monitor)

int actualContactState;
int lastContactState;
 
void handleContactSensor() {
  actualContactState = digitalRead(SENSOR_PIN); // read current state
  // If inverted change to !digitalRead(SENSOR_PIN)

  if (actualContactState != lastContactState) {         // if state has changed
    Serial.printf("Contact Sensor is %s now\r\n", actualContactState ? "open":"closed");
    lastContactState = actualContactState;              // update last known state
    
    SinricProContactsensor &myContact = SinricPro[CONTACT_ID]; // get contact sensor device

    // actualContactState == true then contact is closed 
    // actualContactState == false then contact is open 
    myContact.sendContactEvent(!actualContactState);      // send event with actual state
  }
}

// setup function for WiFi connection
void setupWiFi() {
  Serial.printf("\r\n[Wifi]: Connecting");

  #if defined(ESP8266)
    WiFi.setSleepMode(WIFI_NONE_SLEEP); 
    WiFi.setAutoReconnect(true);
  #elif defined(ESP32)
    WiFi.setSleep(false); 
    WiFi.setAutoReconnect(true);
  #endif

  WiFi.begin(WIFI_SSID, WIFI_PASS); 

  while (WiFi.status() != WL_CONNECTED) {
    Serial.printf(".");
    delay(250);
  }
  IPAddress localIP = WiFi.localIP();
  Serial.printf("connected!\r\n[WiFi]: IP-Address is %d.%d.%d.%d\r\n", localIP[0], localIP[1], localIP[2], localIP[3]);
}

Diesen Code auf GitHub Gist ansehen

Jetzt solltest du den Kontaktstatus über Alexa, Google Home, SmartThings und die Sinric Pro App sehen können

Sinric Pro Alexa Contact Sensor

Schritt 3 : Sprachansagen!

✅ So funktioniert’s:

1️⃣ Füge in SinricPro einen Switch hinzu (dein geheimer Auslöser!)

2️⃣ Erstelle eine Alexa Routine, die deine Nachricht ausspricht, wenn „Someone is at the door!“, wenn der Switch eingeschaltet wird

3️⃣ Sende aus deinem Code ein Power-State-Event, um diesen Switch einzuschalten

void triggerVoiceAnnouncement() {
    SinricProSwitch& mySwitch = SinricPro[SWITCH_ID];
    mySwitch.sendPowerStateEvent(true);
}

Fehlerbehebung

  1. Weitere Details findest du auf unserer Seite Troubleshooting.

Verwandte Tutorials

This document is open source. See a typo? Please create an issue