Vibrationserkennungssystem mit IFTTT

Dieses Projekt implementiert ein Vibrationserkennungssystem mit Hilfe eines Arduino-Boards (Uno R4 oder R3), eines ESP8266-Moduls und eines Vibrationssensors (SW-420). Bei erkannter Vibration sendet das System eine HTTP-Anfrage an einen IFTTT-Server und kann dadurch diverse Aktionen auslösen, wie zum Beispiel das Versenden einer Benachrichtigung oder einer E-Mail.

Um übermäßige Warnmeldungen in kurzer Zeit zu vermeiden, ist das System so programmiert, dass diese HTTP-Anfragen nur im Mindestabstand von 2 Minuten (120.000 Millisekunden) gesendet werden. Dieses Intervall kann nach Bedarf angepasst werden.

1. Den Schaltkreis aufbauen

Bemerkung

Das ESP8266-Modul benötigt einen hohen Stromfluss, um stabil zu funktionieren. Stellen Sie daher sicher, dass die 9-V-Batterie angeschlossen ist.

../_images/04-Wiring_Vibration_alert_system.png

2. IFTTT konfigurieren

IFTTT ist ein privates Handelsunternehmen, das 2011 gegründet wurde und digitale Automatisierungsplattformen als Dienstleistung anbietet. Die Plattform ermöglicht es den Nutzern, mit einer visuellen Oberfläche plattformübergreifende „Wenn-Dann“-Bedingungen zu erstellen. Stand 2020 zählt die Plattform 18 Millionen Nutzer.

../_images/04-ifttt_intro.png

IFTTT steht für „If This Then That“. Einfach gesagt: Wenn bestimmte Bedingungen erfüllt sind, wird eine entsprechende Aktion ausgelöst. Der „If This“-Teil wird Trigger genannt und der „Then That“-Teil wird als Aktion bezeichnet. IFTTT verbindet Smart-Home-Geräte, soziale Medien, Liefer-Apps und vieles mehr, um automatisierte Aufgaben durchzuführen.

https://images.contentful.com/mrsnpomeucef/78eXVQ2gXnWkCNCykr7Mdt/8b188790f1fda2ed84ab17afe06cf145/img-welcome-02_x2.jpg

2.1 Bei IFTTT anmelden

Geben Sie „https://ifttt.com“ in Ihren Browser ein und klicken Sie auf den zentral platzierten Button „Get started“. Füllen Sie das Formular mit Ihren Informationen aus, um ein Konto zu erstellen.

../_images/04-ifttt_signup.png

Klicken Sie auf „Back“, um den Schnellstart zu verlassen, kehren Sie zur IFTTT-Startseite zurück, aktualisieren Sie die Seite und melden Sie sich erneut an.

../_images/04-ifttt_signup_2.png

2.2 Das Applet erstellen

Klicken Sie auf „Create“, um mit der Erstellung des Applets zu beginnen.

../_images/04-ifttt_create_applet_1_shadow.png

Wenn dieser Auslöser

Klicken Sie neben „If This“ auf „Add“, um einen Auslöser hinzuzufügen.

../_images/04-ifttt_create_applet_2_shadow.png

Suchen Sie nach „Webhook“ und klicken Sie darauf.

../_images/04-ifttt_create_applet_3_shadow.png

Klicken Sie auf der folgenden Seite auf „Receive a web request“.

../_images/04-ifttt_create_applet_4_shadow.png

Setzen Sie den „Event Name“ auf „vibration_detected“.

../_images/04-ifttt_create_applet_5_shadow.png

Then That action

Klicken Sie neben „Then That“ auf „Add“, um eine Aktion hinzuzufügen.

../_images/04-ifttt_create_applet_6_shadow.png

Suchen Sie nach „email“ und klicken Sie darauf.

../_images/04-ifttt_create_applet_7_shadow.png

Klicken Sie auf der folgenden Seite auf „Send me a email“.

../_images/04-ifttt_create_applet_8_shadow.png

Legen Sie den Betreff und Inhalt der E-Mail fest, die bei erkannter Vibration versendet wird.

Als Referenz: Der Betreff ist auf „[ESP-01] Detected vibration!!!“ gesetzt und der Inhalt lautet „Detected vibration, please confirm the situation promptly! {{OccurredAt}}“. Beim Versand der E-Mail wird {{OccurredAt}} automatisch durch den Zeitpunkt des Ereignisses ersetzt.

../_images/04-ifttt_create_applet_9_shadow.png

Befolgen Sie die folgenden Schritte, um die Erstellung des Applets abzuschließen.

../_images/04-ifttt_create_applet_10_shadow.png ../_images/04-ifttt_create_applet_11_shadow.png ../_images/04-ifttt_create_applet_12_shadow.png

3. Code ausführen

  1. Öffnen Sie die Datei 04-Vibration_alert_system.ino im Verzeichnis ultimate-sensor-kit\iot_project\wifi\04-Vibration_alert_system, oder kopieren Sie den folgenden Code in die Arduino IDE.

  2. Tragen Sie die mySSID und das myPWD des verwendeten WLANs ein.

    String mySSID = "Ihr_SSID";     // WLAN-SSID
    String myPWD = "Ihr_Passwort";  // WLAN-Passwort
    
  3. Sie müssen auch die URL anpassen. Hierbei sollten Sie sowohl den von Ihnen festgelegten Ereignisnamen als auch Ihren API-Schlüssel eintragen.

    String URL = "/trigger/vibration_detected/with/key/xxxxxxxxxxxxxxxxxx";
    
    ../_images/04-ifttt_apikey_1_shadow.png ../_images/04-ifttt_apikey_2_shadow.png

    An dieser Stelle finden Sie Ihren persönlichen API-Schlüssel, den Sie unbedingt geheim halten sollten. Geben Sie den Ereignisnamen als vibration_erkannt ein. Die vollständige URL wird am unteren Ende der Webseite angezeigt. Kopieren Sie diese URL.

    ../_images/04-ifttt_apikey_3_shadow.png ../_images/04-ifttt_apikey_4_shadow.png
  4. Wählen Sie das korrekte Board und den passenden Port aus und klicken Sie auf die Schaltfläche Hochladen.

  5. Öffnen Sie den seriellen Monitor (Baudrate auf 9600 einstellen) und warten Sie auf eine entsprechende Meldung, die den erfolgreichen Verbindungsaufbau anzeigt.

    ../_images/04-ready_shadow.png

4. Code-Erklärung

Das ESP8266-Modul, das im Kit enthalten ist, ist bereits mit der AT-Firmware vorinstalliert. Daher kann das ESP8266-Modul über AT-Befehle gesteuert werden. In diesem Projekt verwenden wir die SoftwareSerial-Bibliothek, um die Kommunikation zwischen dem Arduino Uno Board und dem ESP8266-Modul zu ermöglichen. Das Arduino Uno Board sendet AT-Befehle an das ESP8266-Modul, um eine Netzwerkverbindung herzustellen und Anfragen zu senden. Weitere Informationen finden Sie unter ESP8266 AT Instruction Set.

Das Uno-Board liest Sensordaten und sendet AT-Befehle an das ESP8266-Modul, welches sich dann mit dem Netzwerk verbindet und Anfragen an die IFTTT-Server sendet.

  1. Einbindung der SoftwareSerial-Bibliothek für die serielle Kommunikation zwischen Arduino und ESP8266

    #include <SoftwareSerial.h>
    SoftwareSerial espSerial(2, 3);
    
  2. Konfiguration der WLAN-Zugangsdaten und IFTTT-Serverdetails

    String mySSID = "Ihre_SSID";
    String myPWD = "Ihr_Passwort";
    String myHOST = "maker.ifttt.com";
    String myPORT = "80";
    String URL = "/trigger/xxx/with/key/xxxx";
    
  3. Definition der Variablen für den Vibrationssensor und die Steuerung der Alarmfrequenz

    unsigned long lastAlertTime = 0;
    const unsigned long postingInterval = 120000L;
    const int sensorPin = 7;
    
  4. In der setup()-Methode Initialisierung der seriellen Kommunikation, des ESP8266-Moduls und Verbindung zum WLAN herstellen

    void setup() {
      Serial.begin(9600);
      espSerial.begin(115200);
    
      // Initialize the ESP8266 module
      sendATCommand("AT+RST", 1000, DEBUG);   //Reset the ESP8266 module
      sendATCommand("AT+CWMODE=1", 1000, DEBUG);  //Set the ESP mode as station mode
      sendATCommand("AT+CWJAP=\"" + mySSID + "\",\"" + myPWD + "\"", 3000, DEBUG);  //Connect to WiFi network
    
      while (!espSerial.find("OK")) {
        //Wait for connection
      }
    }
    
  5. In der loop()-Methode Vibrationen erkennen und Alarm senden, falls das Zeitintervall überschritten wurde

    void loop() {
    
      if (digitalRead(sensorPin)) {
        if (lastAlertTime == 0 || millis() - lastAlertTime > postingInterval) {
          Serial.println("Detected vibration!!!");
          sendAlert();  //Send an HTTP request to IFTTT server
        } else {
          Serial.print("Detected vibration!!! ");
          Serial.println("Since an email has been sent recently, no warning email will be sent this time to avoid bombarding your inbox.");
        }
      } else {
        if (DEBUG) {
          Serial.println("Detecting...");
        }
      }
      delay(500);
    }
    
  6. Die Funktion sendAlert() erstellt eine HTTP-Anfrage und sendet sie über das ESP8266-Modul

    void sendAlert() {
    
      String sendData = "GET " + URL + " HTTP/1.1" + "\r\n";
      sendData += "Host: maker.ifttt.com\r\n";
    
      sendATCommand("AT+CIPMUX=0",1000,DEBUG);
      sendATCommand("AT+CIPSTART=...",3000,DEBUG);
      sendATCommand("AT+CIPSEND=" + String(sendData.length()),1000,DEBUG);
      espSerial.println(sendData);
    
    }
    
  7. Behandlung der AT-Befehle mit der Methode sendATCommand()

    Diese Funktion sendet AT-Befehle an das ESP8266-Modul und sammelt die Antworten.

    void sendATCommand(String command, const int timeout, boolean debug) {
      // Print and send command
      Serial.print("AT Command ==> ");
      Serial.print(command);
      Serial.println();
      espSerial.println(command);  // Send the AT command
    
      // Get the response from the ESP8266 module
      String response = "";
      long int time = millis();
      while ((time + timeout) > millis()) {  // Wait for the response until the timeout
        while (espSerial.available()) {
          char c = espSerial.read();
          response += c;
        }
      }
    
      // Print response if debug mode is on
      if (debug) {
        Serial.println(response);
        Serial.println("--------------------------------------");
      }
    

Referenzen