Heizungssteuerung mithilfe Fhem und Arduino steuern

Begonnen von butaluk, 05 Dezember 2017, 15:54:23

Vorheriges Thema - Nächstes Thema

butaluk

Hi,
ich habe den Arduino Scetsh, den ich weiter oben gepostet habe, Testweise aufgespielt.
Der liefert richtige werte. So ist ausgeschlossen dass die Hardware nicht richtig läuft.
Laut Datenblatt vom DS18B20 sind die Messbare Temperaturbereiche von -55°C to +125°C.
Muss da nicht die XML Datei angepasst werden?

MfG
  Vitalij

Thorsten Pferdekaemper

Hi,
nein, da muss nichts angepasst werden. Das passt schon so. Im Prinzip ist 295.33 der richtige Wert, nur halt dass da das "+273.15" anscheinend noch dabei war. Ansonsten entspricht das 22.18. Deswegen hatte ich gedacht, dass irgendwie die "+273.15" noch aktiv waren.
Kannst Du nochmal übersetzen und aufspielen?
Gruß,
   Thorsten
FUIP

butaluk

Hi
habe die .cpp Datei entsprechend angepasst:
#include "HBWDS18B20.h"

// Class HBWDS18B20
HBWDS18B20::HBWDS18B20(uint8_t _pin, hbw_config_ds18b20* _config) {
pin = _pin;
config = _config;
owbus = new OneWire(pin);
state = 0;
lastUpdateTime = 0;
}


void HBWDS18B20::loop(HBWDevice* device, uint8_t channel) {
uint32_t now = millis();
if(state == 0 && (now - lastUpdateTime >= 9000)) {
// start measurement
owbus->reset();
owbus->write(0xCC);
owbus->write(0x44);
state = 1;
lastUpdateTime = now;
}
else if(state == 1 && (now -lastUpdateTime >= 1000)) {
// read temperature
owbus->reset();
owbus->write(0xCC);
owbus->write(0xBE);
// TODO: CRC check, different resolutions etc.
//////////////
//////////////
byte data[2];
/////////////
//////////////
data[0] = owbus->read();
data[1] = owbus->read();
int16_t raw = (data[1] << 8) | data[0];

//int16_t raw = owbus->read() + owbus->read() << 8;
int16_t value = raw / 16;// + 27315; 
// send data via wired bus    
device->sendInfoMessage(channel, 2, (uint8_t*)(&value));
state = 0;
lastUpdateTime = now;
};
}


Nun kommen einigermassen stabile Werte, aber etwas zu hoch.

2018-03-27 18:58:25 HM485 HBW_1W_T10_HBW4073471_01 temperature: 58.88
2018-03-27 18:58:25 HM485 HBW_1W_T10_HBW4073471_01 temperature_58.88
2018-03-27 18:58:35 HM485 HBW_1W_T10_HBW4073471_01 temperature: 71.68
2018-03-27 18:58:35 HM485 HBW_1W_T10_HBW4073471_01 temperature_71.68
2018-03-27 18:58:45 HM485 HBW_1W_T10_HBW4073471_01 temperature: 69.12
2018-03-27 18:58:45 HM485 HBW_1W_T10_HBW4073471_01 temperature_69.12
2018-03-27 18:58:55 HM485 HBW_1W_T10_HBW4073471_01 temperature: 66.56
2018-03-27 18:58:55 HM485 HBW_1W_T10_HBW4073471_01 temperature_66.56
2018-03-27 18:59:05 HM485 HBW_1W_T10_HBW4073471_01 temperature: 64.00
2018-03-27 18:59:05 HM485 HBW_1W_T10_HBW4073471_01 temperature_64.00
2018-03-27 18:59:15 HM485 HBW_1W_T10_HBW4073471_01 temperature: 64.00
2018-03-27 18:59:15 HM485 HBW_1W_T10_HBW4073471_01 temperature_64.00
2018-03-27 18:59:25 HM485 HBW_1W_T10_HBW4073471_01 temperature: 61.44
t
Der Temp. Anstieg kommt vom leichten erwärmen mit dem Finger.

MfG
  Vitalij

Thorsten Pferdekaemper

Hi,
irgendwie kann ich nicht erkennen, was da jetzt wirklich anders sein soll, bis darauf, dass Du die Nachkommastellen abschneidest und dann nicht mit 100 multiplizierst. D.h. Deine Ausgabe entspricht so in etwa der Temperatur auf der Oberfläche der Sonne. Aber in der Tat ist es "stabiler".
Ich glaube, dass wir basierend darauf weitermachen können. Es scheinen mir im Wesentlichen Low- und High-Byte vertauscht zu sein.
Versuch's mal so:

                data[0] = owbus->read();
data[1] = owbus->read();
int32_t value = (data[1] << 8) | data[0];
                value = value * 100 / 16;
                // high byte first
                data[0] = value >> 8;
                data[1] = value & 0xFF;
// send data via wired bus    
device->sendInfoMessage(channel, 2, data);

Gruß,
    Thorsten
FUIP

butaluk

Hallo Thorsten,

das sieht jetzt ganz GUT aus:
2018-03-28 09:56:20 HM485 HBW_1W_T10_HBW4073471_01 temperature: 23.12
2018-03-28 09:56:20 HM485 HBW_1W_T10_HBW4073471_01 temperature_23.12
2018-03-28 09:56:30 HM485 HBW_1W_T10_HBW4073471_01 temperature: 28.81
2018-03-28 09:56:30 HM485 HBW_1W_T10_HBW4073471_01 temperature_28.81
2018-03-28 09:56:40 HM485 HBW_1W_T10_HBW4073471_01 temperature: 30.68
2018-03-28 09:56:40 HM485 HBW_1W_T10_HBW4073471_01 temperature_30.68
2018-03-28 09:56:50 HM485 HBW_1W_T10_HBW4073471_01 temperature: 28.50
2018-03-28 09:56:50 HM485 HBW_1W_T10_HBW4073471_01 temperature_28.50
2018-03-28 09:57:00 HM485 HBW_1W_T10_HBW4073471_01 temperature: 26.06
2018-03-28 09:57:00 HM485 HBW_1W_T10_HBW4073471_01 temperature_26.06
2018-03-28 09:57:10 HM485 HBW_1W_T10_HBW4073471_01 temperature: 25.06
2018-03-28 09:57:10 HM485 HBW_1W_T10_HBW4073471_01 temperature_25.06
2018-03-28 09:57:20 HM485 HBW_1W_T10_HBW4073471_01 temperature: 24.62
2018-03-28 09:57:20 HM485 HBW_1W_T10_HBW4073471_01 temperature_24.62

Die Temperatur wird nun richtig und stabil übermittelt.

Danke!

Nun würde ich gerne weitere Temp. Sensoren an den 1-Wire Bus anschließen und die Temp. Werte mit weiteren Kanälen an den RaspPi übermitteln.
Und noch eine Frage, wie integriere ich die Einstellungen von den Sensor Einstellungen im Fhem?

MfG
  Vitalij

Thorsten Pferdekaemper

Hi,
ich fahr jetzt ein paar Tage weg...
Gruß,
   Thorsten
FUIP

Thorsten Pferdekaemper

Hi,
zu Deiner Mail: Ich will mir das jetzt nicht alles zusammensuchen müssen. Könntest Du mal den aktuellen Haupt-Sketch dranhängen sowie die aktuelle XML-Datei?
Gruß,
   Thorsten
FUIP

butaluk

Hi,
im Anhang sind die Aktuellen Daten...

MfG
   Vitalij

Thorsten Pferdekaemper

Hi,
ist es für Dich akzeptabel, wenn die einzelnen Sensoren an unterschiedlichen Pins hängen? Die Sache mit den Adressen der einzelnen Sensoren, wenn sie nacheinander am selben Bus hängen, ist etwas kompliziert und das ganze würde einiges an Änderungen brauchen. Die Zeit habe ich momentan nicht.
Gruß,
   Thorsten
FUIP

butaluk

Hi,
für meinen Heizungssteuerkreis Erdgeschoss, der aus 9 kreisen besteht, benötige ich 9 Ausgänge vom Arduino um jeden Kreis einzeln anzusteuern. Desweiteren bebötige ich 9 1-Wire Temperatursensoren um die Rücktemperatur zu messen. Das ganze vollte ich an einem Arduino Nano realisieren. Wenn die Temperatursensoren an unterschiedlichen Pins hängen werden, ist der Arduino kommplet belegt und ich habe keine reserven mehr.
Ich würde gerne die Heizungssteuerung  mit einem 1-Wire Bus Anschluss realisieren.


MfG
  Vitalij

Beta-User

Die DS80x20 si d sowieso Bus-Geräte. Da müsste ein Pin reichen, dann die einzenen Sensoren am besten über die HW-Adresse ansprechen.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Thorsten Pferdekaemper

Hi,
@Beta-User: Ja, das ist klar, aber das ganze dann zu integrieren ist gar nicht so einfach, wenn die Programmierkenntnisse eher begrenzt sind.

@butaluk: Schau Dir mal an, wie das in der angehängten Datei läuft. Im Prinzip ist in sensorAddressesGet zu sehen, wie man die Adressen der Devices am 1-Wire-Bus ermittelt. Die musst Du dann benutzen, um jeweils einen bestimmten Sensor zu addressieren. Wie das wiederum geht kann man sehen in oneWireStartConversion bzw. oneWireReadTemp.

Gruß,
   Thorsten
FUIP