Heizungs-Logger II

Von | 6. Juni 2022

Mein hier beschriebener Heizungs_Logger, also eine beobachtende Temperaturmessung an der Wärmepumpe, lief von April 2019 bis Nobember 2021. Dann fiel es aus.

Ich vermutete einen Defekt an meiner Schaltung oder dem ESP8266, lag damit aber falsch. Tatsächlich war ein Temperatursensor DS18B20 defekt, genauer zwei. Genau die zwei, die den größten Belastungen am Kompressor der Wärmepumpe und dem 24V-Netzteil ausgesetzt waren.

Da ich aber mit dem Löten und Schaltungen entwerfen dicht an meine Grenzen kommen, wollte ich eh auf ein Standardmodul umstellen. Ich habe mich für einen Controllino-Maxi entschieden, der bringt auch gleich Ethernet mit.

Die Schaltung wird damit quasi unterkomplex. Ein Bus mit 5V+, GND und dem Datenkanal und ein 4,7kΩ Widerstand (Pull-Up) zwischen 5V+ und dem Datenkanal. 5V+ und GND verbinden wir mit den entsprechenden Pins des Controllino und den Datenkanal auf Pin 20 (SDA). Kurzes Googeln nach Arduino und dem Sensor liefert hunderte Beispiele.

Das ganze in Bildern:

Den Quellcode hatte ich (hoch)komplex konfigurierbar mit Webserver und Webclient gebaut. Die EXP8266-WiFi Bibliothek gibt das recht einfach her. Die Standard Ethernet Bibliothek des Arduino leider nicht mehr. Daher habe ich nach kurzer Trauer, komplett umgebaut und einen minimalen Code geschrieben. Im folgende die zentralen Stellen, der komplette Code findet sich hier.

#include <Ethernet.h>
#include <SPI.h>
#include <OneWire.h>

// HZSteuerung
OneWire  ds(20);  // on pin 20 (a 4.7K resistor is necessary)
... 
void setup() {
  Ethernet.begin(mac, ip);
}
char *ftoa(char *a, double f, int precision)
{
  ...
}
int HZLoggerLoop() {
  ...
  if ( !ds.search(addr)) {
    ds.reset_search();
    return 1;
  }
  for( i = 0; i < 8; i++) {
    sprintf(address+(i*2),"%2.2X",addr[i]);
  }
  ....
  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
  delay(750);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.

  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
  }
  ...

  int16_t raw = (data[1] << 8) | data[0];
  ...

  celsius = (float)raw / 16.0;
  ftoa(temperature,celsius,2);
  
  String queryString = "?s=" + String(address) + "&t=" + String(temperature);
  if(client.connect(HOSTNAME, HTTPPORT)) {
    ....
  } else {// if not connected:
  }  
 return 0;    
}

void loop(void) {
  if (HZLoggerLoop() == 1)
    delay(60000);
}

Dabei wird jede Minute die ID des Sensors (Bus-Adresse) und seine Temperatur via http an einen Server weitergereicht, der sich um den Rest kümmert. Also ab in die Datenbank und zur Auswertung.Beim Testen der neuen Hardware stellte sich dann heraus, dass die 10 Sensoren auf dem Bus keine Daten liefern, weil zwei Sensoren defekt sind (s.o.). Man merkt es, indem man die Sensoren nacheinander anschließt und danach einzeln testet. Nach einer Ersatzbeschaffung ging es dann wie früher.

Jetzt misst es wieder und wir können nette Auswertungen erzeugen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.