Heizungssteuerung mithilfe Fhem und Arduino steuern

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

Vorheriges Thema - Nächstes Thema

butaluk

Hallo Thorsten.
Zitatob Dein Problem der 1-Wire-Teil, das XML oder der HBW-spezifische Teil im Arduino ist.
Setze mich gerade mit dem Arduino Teil auseinander.
Da habe ich eine Frage.
Wo finde ich die Dateien
// debug-Funktion
//#include "HMWDebug.h"

// HM Wired Protokoll
#include "HMWRS485.h"

// default module methods
#include "HMWModule.h"


Habe sonst Schwierigkeiten mit dem kompilieren.

Gruß
  Vitalij

Thorsten Pferdekaemper

Hi,
die brauchst Du nicht, die gehören zu den alten Libraries.
Gruß,
    Thorsten
FUIP

butaluk

Muß ich die einfach auskomentieren?

Gruß
  Vitalij

Thorsten Pferdekaemper

Einfach nicht in Dein Coding übernehmen.
Ich sagte doch, von dem Kram ist für Dich nur das interessant, was "onewire" oder ähnlich im Namen hat.
Gruß,
   Thorsten
FUIP

butaluk

Hallo Thorsten,
Zitatvon dem Kram ist für Dich nur das interessant, was "onewire" oder ähnlich im Namen hat
Habe es versucht, aber ohne Erfolg.
Kannst du bitte mir die Richtigen Stellen Posten?
Das wäre sehr nett.

MfG
  Vitalij

Thorsten Pferdekaemper

Hi,
sag' lieber mal genauer, was Du versucht hast und was daran nicht funktioniert hat.
Ich glaube ja kaum, dass Du es nicht geschafft hast, "onewire" im Coding zu finden.
Gruß,
   Thorsten
FUIP

butaluk

Hallo Thorsten,
im Anhang ist der Sketch für den Arduino mit dem ich versucht habe die 1-Wire Funktion zum Laufen zu bringen.
Die hbw_1w_t10.xml Datei habe ich unter /opt/fhem/FHEM/lib/HM485/Devices/xml, sowie unter /opt/fhem/FHEM/firmware/hs485types abgelegt.

MfG
  Vitalij

sash.sc

Hallo zusammen.

Habe das ganze bei mir mit einem wemos und einer relais Karte umgesetzt und steuere das ganze über pwm/pwmr inkl pid Regler.

Läuft erstaunlicher Weise ganz gut..

Gruß Sascha

Gesendet von meinem...... was auch immer

Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

Thorsten Pferdekaemper

Zitat von: butaluk am 04 März 2018, 13:58:41im Anhang ist der Sketch für den Arduino mit dem ich versucht habe die 1-Wire Funktion zum Laufen zu bringen.
Das ist ja im Prinzip mein Original-Sketch. Das wird so nicht gehen.
Fang doch erstmal klein an und baue einen Sketch, der einfach nur die Temperatur ermittelt und sie auf dem seriellen Monitor anzeigt, ohne den ganzen HMW-Kram.
Gruß,
   Thorsten
FUIP

butaluk

Hallo Thorsten,
das habe ich schon gemacht.
#include <OneWire.h>
OneWire ds(10);

byte data[2];
float celsius;

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

}

void loop() {


ds.reset();
ds.write(0xCC);
ds.write(0x44);
delay(750);
ds.reset();
ds.write(0xCC);
ds.write(0xBE);
data[0] = ds.read();
data[1] = ds.read();
//int Temp = (data[1]<< 8)+data[0];
//Temp = Temp>>4;
//Serial.println(Temp);
int16_t raw = (data[1] << 8) | data[0];
celsius = (float)raw / 16.0;
    Serial.print("t=");
    Serial.println(celsius);
}

Das funktioniert auch soweit.

MfG
Vitalij

Thorsten Pferdekaemper

Hi,
...und jetzt das ganze ohne delay. Das ist nämlich der eigentliche Witz bei der Sache.
Gruß,
   Thorsten
FUIP

butaluk

Hi,
Zitat...und jetzt das ganze ohne delay. Das ist nämlich der eigentliche Witz bei der Sache.

#include <OneWire.h>
OneWire ds(10);

byte data[2];
float celsius;
long lastUpdateTime = 0;
const int TEMP_UPDATE_TIME = 1000;
void setup() {
Serial.begin(9600);

}

void loop() {


  ds.reset();
  ds.write(0xCC);
  ds.write(0x44);
  if (millis() - lastUpdateTime > TEMP_UPDATE_TIME)
  {
    lastUpdateTime = millis();
    ds.reset();
    ds.write(0xCC);
    ds.write(0xBE);
    data[0] = ds.read();
    data[1] = ds.read();
    int16_t raw = (data[1] << 8) | data[0];
    celsius = (float)raw / 16.0;
    Serial.print("t=");
    Serial.println(celsius);
  }
}


Ok. wie geht es weiter?

MfG
  Vitalij

Thorsten Pferdekaemper

Hi,
funktioniert das wirklich? Du hämmerst im Millisekundentakt (oder so) das hier raus:

  ds.reset();
  ds.write(0xCC);
  ds.write(0x44);

Gruß,
   Thorsten
FUIP

Thorsten Pferdekaemper

...und außerdem: Deine Konversion von "raw" zu Celsius sieht mir zu einfach aus. Ich habe da das hier:

  for ( byte i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = myWire.read();
  }
  // CRC check  TODO: if this happens only once, maybe don't do it
  if(OneWire::crc8(data, 8) != data[8])
  return ERROR_TEMP;

  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (sensors[channel].address[0] == 0x10) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {   // DS18S20 or old DS1820
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    // default is 12 bit resolution, 750 ms conversion time
  }

D.h. es werden 9 Bytes gelesen und ein paar davon sogar benutzt. Ok, den Teil für "DS18S20 or old DS1820" muss man nicht unbedingt beachten, aber der Rest erscheint mir schon irgendwie wichtig.
...aber das kann man vielleicht später noch einbauen.

Ich denke mal, das geschickteste wird sein, eine eigene Klasse (also wie HBWKey) für die Dinger zu bauen. Ich lass mir das mal durch den Kopf gehen.

Gruß,
   Thorsten
FUIP

Thorsten Pferdekaemper

Hi,
ich habe jetzt mal ein bisschen gebastelt. Dabei ist die hier dranhängende Library rausgekommen. Das Ding implementiert einen DS18B20-Kanal. Die Klasse HBWDS18B20 wird im Prinzip genauso verwendet wie HBWKey. Momentan kann der zweite Parameter des Konstruktors einfach auf 0 gesetzt werden.
Als XML kannst Du die Datei vom HBW-1W-T10 verwenden.
Ich habe das überhaupt nicht getestet, aber theoretisch müsste das dann alle 10 Sekunden die Temperatur über den Bus schicken.
Gruß,
   Thorsten
FUIP