Helligkeitssensor zur Lichtsteuerung

Da mir die LED-Stripes immer entweder zu hell oder zu dunkel waren wollte ich diese abhängig von der sonstigen Helligkeit dimmbar machen.

Also ein D1mini und ein BH1750 als Sensor wie unten gezeichnet verkabelt.

Und folgendes Programm:

#include <Wire.h>
#include <BH1750.h>
#include <PubSubClient.h>
#include <ESP8266WiFi.h>
#include <ArduinoOTA.h>

// #############################################
// WLAN-Zugang
// #############################################
#define wifi_ssid "SSID"
#define wifi_password "PW"

// #############################################
// MQTT-Server (Openhab)
// #############################################
#define mqtt_server "192.168.2.12"
#define mqtt_user "openhabian"         
#define mqtt_password ""     

// #############################################
// MQTT-Topics für BME280
// ############################################
#define lux_topic "light/lux"

// #############################################
// Datentypen BH1750 definieren
// #############################################
BH1750 lightMeter;
float lux = 0.0;
bool BH1750Check = false;

WiFiClient espClient;
PubSubClient client(espClient);

unsigned long delayTime;
long lastMsg = 0;
char msg[50];
int value = 0;

void setup() {
  
  Serial.begin(115200);

  delay(1000);

  setup_wifi();
  client.setServer(mqtt_server, 1883);
  
  delay(1000);
  
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
  
  Wire.begin();

  BH1750Check = lightMeter.begin();
  if (BH1750Check) {
    Serial.println(F("BH1750 Test begin"));
  }
  else {
    Serial.println(F("BH1750 Initialization FAILED"));
  }

  delay(1000);
  
  setup_wifi();
  client.setServer(mqtt_server, 1883);

  ArduinoOTA.setHostname("ESP-Luxsensor");
  ArduinoOTA.setPassword("OTAupdate");
  ArduinoOTA.begin();  
}


void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
  if (BH1750Check) {
    float lux = lightMeter.readLightLevel();
    Serial.print("Licht: ");
    Serial.print(lux);
    Serial.println(" lx");
    client.publish(lux_topic, String(lux).c_str(), true);
  }
  delay(5000);  // alle 5 Sekunden
  ArduinoOTA.handle();
}


void setup_wifi() {
  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(wifi_ssid);

  WiFi.begin(wifi_ssid, wifi_password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId = "ESP8266-";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    if (client.connect(clientId.c_str(), mqtt_user, mqtt_password)) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      client.publish("outTopic", "ESP02 alive");
      // ... and resubscribe
      client.subscribe("inTopic");
    } else {
        Serial.print("failed, rc=");
        Serial.print(client.state());
        Serial.println(" try again in 5 seconds");
        // Wait 5 seconds before retrying
        delay(5000);
      }
   }
}

Damit wird (wenn die WLAN und MQTT-Daten korrekt eingetragen sind) alle 5 Sekunden der Helligkeitswert (in lux) an den MQTT-Broker gesendet.

Ich verwende den Wert dann in openHAB um linear das Licht (von 25-100%) anzupassen. Bei welchen Helligkeitswerten ihr das macht bleibt euch überlassen und ich würde das immer subjektiv machen. Da jetzt Werte vorzugeben macht vermutlich wenig Sinn da es auch davon abhängt wo der Sensor hängt. Unter der Lampe macht natürlich wenig Sinn 😉

Ich regle damit übrigens von 0-10 Lux. Alles was Heller ist hat keine Auswirkung mehr da die Helligkeit der Lampen dann schon 100% ist.

Schreibe einen Kommentar

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