[Bastelei] Arduino mit DS18B20 Temperatursensor (für Homebridge)

Bisher hatte ich einen Raspberry Pi 3 im Einsatz, der zum einen mein Garagentor steuerte, zum anderen die Temperatur meiner Heizung ausliest und über Homebridge an mein iPhone lieferte. Da ich den RasbPi aber für einen anderen Zweck benötigt habe, musste ich beide Anwendungen anderweitig abbilden. Hier meine Lösung auf NodeMCU ESP8266 – Basis mit mehreren DS18B20 Sensoren, die die Werte als JSON über einen Webserver ausliefert.

Die Hardware war schnell eingerichtet. Im Prinzip entspricht der Aufbau 1:1 dem Aufbau mit meinem Raspberry Pi. Die Sensoren sind seriell und können daher auf den gleichen Bus angeschlossen werden. Grundlage meines Aufbaus war die Anleitung von Random Nerd Tutorials. Dort wird die Schaltung sehr gut beschrieben. Ich habe im Einsatz:

Da ich das Ganze im Heizungsraum verbaue, hab ich mich dazu entschlossen, den Aufbau tatsächlich mit WAGO-Klemmen durchzuführen. Die wandern mit dem Arduino in eine Aufputz-Verteilerdose und sind so recht variabel erweiterbar.

Weiter geht’s mit der Software. Da ich keinerlei Erfahrung mit C++ habe, musste ich etwas schwitzen und mir einige Tutorials durchlesen, um die richtige Lösung zu finden.

Mein Script sieht so aus:

#include <ESP8266WebServer.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <ArduinoJson.h>

#define ONE_WIRE_BUS D2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int numberOfDevices;
DeviceAddress tempDeviceAddress;

const char* ssid = "_SSID_";  // Enter SSID here
const char* password = "_PASSWORD_";  //Enter Password here

ESP8266WebServer server(80);

void setup() {
  Serial.begin(115200);
  delay(100);
  sensors.begin();
  numberOfDevices = sensors.getDeviceCount();
  Serial.println("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected..!");
  Serial.print("Got IP: ");  Serial.println(WiFi.localIP());
  server.on("/", handle_OnConnect);
  server.onNotFound(handle_NotFound);
  server.begin();
  Serial.println("HTTP server started");
  for (int i = 0; i < numberOfDevices; i++) {
    // Search the wire for address
    if (sensors.getAddress(tempDeviceAddress, i)) {
      sensors.setResolution(tempDeviceAddress, 9);
      Serial.print("Found device ");
      Serial.print(i, DEC);
      Serial.print(" with address: ");
      Serial.print(printAddress(tempDeviceAddress));
      Serial.println();
    } else {
      Serial.print("Found ghost device at ");
      Serial.print(i, DEC);
      Serial.print(" but could not detect address. Check power and cabling");
    }
  }
}
void loop() {
  server.handleClient();
}

void handle_OnConnect() {
  sensors.requestTemperatures();
  StaticJsonDocument<256> doc;
  JsonObject root = doc.to<JsonObject>();
  for (int i = 0; i < numberOfDevices; i++) {
    if (sensors.getAddress(tempDeviceAddress, i)) {
      float tempC = sensors.getTempC(tempDeviceAddress);
      String deviceid = printAddress(tempDeviceAddress);
      root[deviceid] = tempC;
    }
  }
  String Output = "";
  serializeJsonPretty(root, Output);
  server.send(200, "text/json", Output);
}

void handle_NotFound() {
  server.send(404, "text/plain", "Not found");
}

String printAddress(DeviceAddress deviceAddress) {
  String deviceid = "";
  for (uint8_t i = 0; i < 8; i++) {
    deviceid += String(deviceAddress[i], HEX);
  }
  return deviceid;
}

Benötigt wird der Webserver, OneWire und DallasTemperature für die Sensoren und Json für die Ausgabe.

Mein Script verbindet sich mit dem WLAN, sucht nach angeschlossenen Temperatursensoren und startet den Server. Beim Zugriff auf den Server werden die Werte der Sensoren abgerufen und als JSON ausgegeben.

{
  "2851216050097": 25.5,
  "28bb2af5400ca": 34
}

Die Ausgabe enthält einfach nur die serielle ID des Sensors und den Temperaturwert in Celcius. Ich arbeite hier absichtlich im 9bit Modus der DS18B Sensoren, da mir die Auflösung reicht und die Abfrage so am schnellsten ist.

Für die Ausgabe in HomeKit nutze ich homebridge-http-temperature. In der config.json von homebridge sieht das so aus:

"accessories": [{
		"accessory": "HttpTemperature",
		"name": "Sensor 1",
		"url": "http://arduino_ip/",
		"http_method": "GET",
		"field_name": "2851216050097"
	}, {
		"accessory": "HttpTemperature",
		"name": "Sensor 1",
		"url": "http://arduino_ip/",
		"http_method": "GET",
		"field_name": "28bb2af5400ca"
	}]

Posted

in

by

Tags:

Comments

Hinterlasse einen Kommentar

Bloggen auf WordPress.com.