DIY Bewegungsmelder selbst bauen

Zur Steuerung meiner Gartenbeleuchtung, Ein- und Ausschalten via Shelly, baute ich mir einen Bewegungsmelder mit einem ESP8266 als Herzstück.

!!Nachbau wie immer auf eigene Gefahr!!

Benötigte Bauteile:

  • 1 x ESP8266 (NodeMCU V3)
  • 1 x LDR5528-Modul
  • 1 x HC-SR501 Bewegungssensor
  • diverse Kabel und Litzen für Stromversorgung und Zusammenbau
  • Teilstück 3-Loch-Streifenrasterplatine

Versuchsaufbau

/*********
  Michael Wiesner
  Complete project details at https://4bastler.de
*********/
// Including the ESP8266 WiFi library
#include <ESP8266WiFi.h>
#define brightnessPin 14

//WLAN-Daten
const char* ssid = "IhreSSID";
const char* password = "IhrWLANPasswort";

// Web Server Port definieren
WiFiServer server(80);

//Variablen Serveraufruf
const char* host = "DeineSteuerzentraleIP";   //IP Raspi als Steuerzentrale
const char* host2 = "DeinzusteuerndesGerätIP";  //IP geschalteter Shelly

int motionPin = D1;
int displayLED = D2;
boolean brightness_ldr = false;
String tageslicht;

void setup()
{ 
  // Start the Serial Monitor
  Serial.begin(115200);

  //Helligkeitsmessung
  pinMode(brightnessPin, INPUT);
  
  // Mit Wifi verbinden
  Serial.print("Verbinden mit: "); 
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi verbunden");
  // Eigene IP ausgeben
  Serial.print("Diese URL zum Verbinden aufrufen: ");
  Serial.print("http://");
  Serial.print(WiFi.localIP());
  Serial.println("/");
  pinMode(motionPin, INPUT);
  pinMode(displayLED, OUTPUT);
  digitalWrite(displayLED, LOW);
  delay(5000);
}
void loop() {

  brightness_ldr = digitalRead(brightnessPin);
  if (brightness_ldr) {
    tageslicht = "No";
    Serial.print("Light detected: ");
    Serial.println(tageslicht);
    delay(2000);
    if(digitalRead(motionPin)==HIGH)
    {
      ausfuehren(); 
    }
    else
    {
      digitalWrite(displayLED, LOW);
    }
  }
  else {
  tageslicht = "Yes";
  Serial.print("Light detected: ");
  Serial.println(tageslicht);
  delay(2000);
  }
}

void ausfuehren()
{
  digitalWrite(displayLED, HIGH);
  // Einschalten
  String url2 = "/relay/0?turn=on";
  delay(1000);
  Serial.print("url");
  Serial.print("Requesting URL: ");
  Serial.println(url2);
  WiFiClient client;
 if (!client.connect(host2, 80)) {
    Serial.println("connection failed");
    return;
 }
 client.print(String("GET ") + url2 + " HTTP/1.1\r\n" +
 "Host: " + host2 + "\r\n"+
 "Connection: close\r\n\r\n");
 if (!client.connect(host2, 80)) {
    Serial.println("connection failed");
    return;
 }
 Serial.println();
 Serial.println("closing connection");
 //Ende Einschalten
 delay(600000);
 digitalWrite(displayLED, LOW);
 // Wieder ausschalten
 url2 = "/relay/0?turn=off";
 delay(1000);
 Serial.print("url");
 Serial.print("Requesting URL: ");
 Serial.println(url2);
 //Daten auf Krake speichern
 if (!client.connect(host2, 80)) {
    Serial.println("connection failed");
    return;
 }
 client.print(String("GET ") + url2 + " HTTP/1.1\r\n" +
 "Host: " + host2 + "\r\n"+
 "Connection: close\r\n\r\n");
 if (!client.connect(host2, 80)) {
    Serial.println("connection failed");
    return;
 }
 Serial.println();
 Serial.println("closing connection");
 //Ende Wieder ausschalten
 delay(5000);
}

Der Quellcode ist eine erste Programmierung und natürlich noch optimierungsbedürftig.
Aber das Wichtige für mich:
Er funktioniert!

Die Umsetzung

Bilder folgen!

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert