Batterie Funk Windmesser, Barometer über Arduino

User stellen ihre Haussteuerung vor

Moderator: Co-Administratoren

spot
Beiträge: 170
Registriert: 22.11.2013, 10:26
Wohnort: Schweiz

Re: Batterie Funk Windmesser, Barometer über Arduino

Beitrag von spot » 07.05.2015, 20:24

Kurz ein paar Antworten... (Schema hatte ich angefangen, dann hat sich das Programm aufgehängt und ich entnervt aufgegeben).

Die Daten werden von einem 2. Arduino empfangen, welcher bei uns im Keller steht und dort die Heizungs- / Boiler- und Raumdaten abgreift und dann über das Web (LAN Anschluss) an die CCU meldet (siehe -> Homeduino).
Sketch für den Empfänger wäre auch zu haben ist aber sehr spezifisch für meine "Installation" zugeschnitten (also 3x DS1820 an Heizung & Boiler und ein DHT22 als Raumthermostat mit einem Ethernetshield zur Datenübermittlung an die CCU).

Schema folgt hoffentlich bald... :twisted:
CCU-2, Historian und ioBroker auf Odroid HC
11x HM-CC-RT-DN, 5x HM-TC-IT-WM-W-EU, 1x HM-WDS10-TH-O, 1x HM-WDS40-TH-I, 3x HM-Sec-SC-2, 2x HM-LC-Bl1-FM, 3x HM-LC-Sw2-FM, 2x HM-LC-SW1-FM, 1x HM-Sec-RHS

spot
Beiträge: 170
Registriert: 22.11.2013, 10:26
Wohnort: Schweiz

Re: Batterie Funk Windmesser, Barometer über Arduino

Beitrag von spot » 07.05.2015, 21:07

Schema eingefügt...
CCU-2, Historian und ioBroker auf Odroid HC
11x HM-CC-RT-DN, 5x HM-TC-IT-WM-W-EU, 1x HM-WDS10-TH-O, 1x HM-WDS40-TH-I, 3x HM-Sec-SC-2, 2x HM-LC-Bl1-FM, 3x HM-LC-Sw2-FM, 2x HM-LC-SW1-FM, 1x HM-Sec-RHS

Benutzeravatar
Helikiller
Beiträge: 143
Registriert: 10.09.2014, 06:53
Wohnort: 21438 Brackel

Re: Batterie Funk Windmesser, Barometer über Arduino

Beitrag von Helikiller » 08.05.2015, 17:35

spot hat geschrieben:Kurz ein paar Antworten... (Schema hatte ich angefangen, dann hat sich das Programm aufgehängt und ich entnervt aufgegeben).

Die Daten werden von einem 2. Arduino empfangen, welcher bei uns im Keller steht und dort die Heizungs- / Boiler- und Raumdaten abgreift und dann über das Web (LAN Anschluss) an die CCU meldet (siehe -> Homeduino).
Sketch für den Empfänger wäre auch zu haben ist aber sehr spezifisch für meine "Installation" zugeschnitten (also 3x DS1820 an Heizung & Boiler und ein DHT22 als Raumthermostat mit einem Ethernetshield zur Datenübermittlung an die CCU).

Schema folgt hoffentlich bald... :twisted:
Hi spot!
Super, das mit dem zweiten Arduino interessiert mich auch. Ist es ein 2560?
LG Helikiller

spot
Beiträge: 170
Registriert: 22.11.2013, 10:26
Wohnort: Schweiz

Re: Batterie Funk Windmesser, Barometer über Arduino

Beitrag von spot » 08.05.2015, 22:06

Es ist ein Arduino Uno R3 mit Ethernetshield. Daran hängen noch 3 Dallas 1820 für Heizung (Vor- und Rücklauf) sowie Boilertemperatur. Zusätzlich noch ein DHT22 für die Temperatur und Feuchtigkeit im Technikraum. Daran hängt nun neu auch ein NRF24 Funkmodul welches die Daten der Wetterstation empfängt.

Das Codeskelett kommt vom Homedino welchen ich für meine Zwecke abgeändert habe (original von Eugen Stall -> siehe Homeduino Thread). Ich hatte etliche Probleme mit der Connection zur CCU. Deshalb sieht der Code zum Aufbau der Verbindung etwas sonderbar aus. Mag daran liegen, dass ich kein Original Ethernetshield hab.

Code: Alles auswählen

//Versionsbezeichner "homeduino_21.ino / Stand: 2014.09.13";
// fuer Arduino Mega 2560 mit Arduino 1.5.6r2
//Verfasser: Eugen Stall
// diese Software erlaubt die Steuerung der Pinfunktionen mit einfachen Browserbefehlen
//verwendete Quellen fuer libraires und Programme siehe Beschreibung und Erläuterungen im Quelltext
//die aktuellste Version ist immer hier:
//http://www.stall.biz/?project=homeduino-der-universelle-lanwlan-arduino-fur-die-hausautomation

#include <Ethernet.h>
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"
#include <OneWire.h>
#include <DallasTemperature.h>
#include <dht.h>
#include <Time.h>
#include <TimeAlarms.h>

////////////////////////////////////////////////////////////////////////
//Netzwerk-Konfiguration muss individuell hier eingegeben werden
byte ip[] = {192, 168, 85, 10}; //das ist die IP des Arduino //<<user-eingabe<<
byte mac[] = { 0xDE, 0xAF, 0xEE, 0xEF, 0xEE, 0xFE }; //nur 1x im Netz //<<user-eingabe<<
byte ccu[] = {192, 168, 85, 3 }; //das ist die IP der CCU //<<user-eingabe<<
byte gateway[] = { 192, 168, 85, 1 }; // Gateway
byte dnsserver[] = { 8, 8, 8, 8 }; // DNS Server
byte subnet[] = { 255, 255, 255, 0 }; // Subnet

String hm_systemvariable = "arduino_1_";

int RETRY = 5; // Anzahl versuche etwas an die CCU zu senden.
EthernetClient client;
dht DHT;

RF24 radio(7, 6);
uint8_t PIPE_NAME[7] = {"KELLER"};

unsigned long delta_time = 3600000; // jede Stunde werden alle Inputs aktualisiert
unsigned long delta_tx = 500;  //in ms, minimaler Abstand der Telegramme an die CCU
unsigned long next_tx = 0;
boolean maxTimeExpired = false;

float deltaT = 0.2;
float deltaH = 1;

int data[10];
int datum;

int onewire_pin;
float temp_tur;
String I;
char status;
double T, P, p0, a;

int DHT_PINS[] = {9};
int OneWire_Pin = 8;
float tempC_DHT[1];
float hum_DHT[1];
DeviceAddress TempSensor[] = //Adress-Array definieren
{
  {
    0x28, 0xFF, 0xC0, 0x96, 0x3E, 0x04, 0x00, 0x93
  }
  , //<<Heizung / Boiler<<
  {
    0x28, 0xFF, 0x34, 0x5E, 0x3D, 0x04, 0x00, 0xEB
  }
  , //<<Heizung / Boiler<<
  {
    0x28, 0xFF, 0xE3, 0x99, 0x3C, 0x04, 0x00, 0xF0
  }
};
float tempC_DS18[3];

float airPressure;
float deltaAirPress = 1;
float windSpeed;
float deltaWindSpeed = 2.5;
float batteryState;
float deltaBatteryState = 0.1;
int luminosity;
int deltaLuminosityPercent = 5;

void setup()
{
  Serial.begin(57600); //Pins 10,11,12 & 13 fuer ethernet shield verwendet
  printf_begin();
  setTime(1, 1, 1, 1, 1, 1); // set any dummy Time... (01:01:01 1.1.2001)
  Serial.println("Starting Setup");
  Ethernet.begin(mac, ip, dnsserver, gateway, subnet);
  delay(1000);
  Serial.println("Ethernet Setup done");
  int result = client.connect(ccu, 8181);
  Serial.print("Connected to CCU with Statuscode:");
  Serial.println(result);
  IPAddress myIp = Ethernet.localIP();
  Serial.print("LocalIP:");
  Serial.println(Ethernet.localIP());
  char myIpString[24];  //IP auslesen
  sprintf(myIpString, "%d.%d.%d.%d", myIp[0], myIp[1], myIp[2], myIp[3]);
  I = myIpString;
  // Update der IP in Homematic, dann sieht man am Timestamp die Startzeit des Arduino
  client.println("GET /xy.exe?antwort=dom.GetObject('" + hm_systemvariable + "IP" + "').State('" + I + "')");
  client.println();
  delay(1000);
  Serial.println("Starting Radio Setup");
  radio.begin();
  radio.openReadingPipe(1, PIPE_NAME);
  radio.startListening();
  radio.enableDynamicPayloads();
  radio.setDataRate(RF24_250KBPS);
  radio.printDetails();
  Alarm.timerRepeat(60 * 60, UpdateAll); // Ein volles Update alle 60 min.
  // client.println();
}

void loop()
{
  // Hier sind keine Digitalen Trigger vorhanden, also koennen die Eingaenge einfach alle 10 Secs abgefragt werden.
  checkDS18();
  checkRadio();
  checkDHT22();
  maxTimeExpired = false;
  for (int i = 0; i < 60; i++) {
    Alarm.delay(1000);
    checkRadio();
  }
}

void UpdateAll() {
  maxTimeExpired = true;
}

boolean set_sysvar(String befehl) {
  for (int j = 0; j < RETRY; j++) {
    Ethernet.begin(mac, ip);
    while (millis() < next_tx) {
      delay(100);
    } //warten bis time > next_tx oder timeout
    int result = 1;
    next_tx = millis() + delta_tx;
    if (!client.connected()) {
      Serial.print("Stopping closed Connection.");
      Serial.print("LocalIP:");
      Serial.print(Ethernet.localIP());
      client.flush();
      client.stop();
      Serial.println(". Initiating Connection.");
      result = client.connect(ccu, 8181);
    }
    if (result == 1 || client.connected())
    {
      Serial.print("Connected. Command = ");
      Serial.print(befehl);
      client.println(befehl);
      client.println();
      Serial.println(". Disconnecting...");
      client.stop();
      return true;
    } else {
      Serial.print("Problem Connecting. Got Error Code:");
      Serial.println(result);
    }
  }
  return false;
}

String constructCommand(String name, String value) {
  return "GET /xy.exe?antwort=dom.GetObject('" + hm_systemvariable + name + "').State(" + value + ")";
}

void checkRadio() {
  if (!radio.available())
    return;
  uint16_t data[5];
  radio.read(&data, 10);
  float maxWind = float(data[0]) / 10;
  float avgWind = float(data[1]) / 10;
  float pressure = float(data[2]) / 10;
  float battery = float(data[3]) / 10;
  uint16_t light = data[4];
  Serial.print("Maximaler Wind : ");
  Serial.print(maxWind);
  Serial.print(" km/h / ");
  Serial.print("Durchschnittlicher Wind : ");
  Serial.print(avgWind);
  Serial.print(" km/h / ");
  Serial.print("Barometer : ");
  Serial.print(pressure);
  Serial.print(" hPa / ");
  Serial.print("Batteriespannung : ");
  Serial.print(battery);
  Serial.println(" V");
  set_sysvar(constructCommand("wind_max", String(maxWind, 1)));
  if (battery > 0.0) {
    set_sysvar(constructCommand("wind_avg", String(avgWind, 1)));
    set_sysvar(constructCommand("barometer", String(pressure, 1)));
    set_sysvar(constructCommand("battery", String(battery, 1)));
  }
}

void checkDS18() {
  //Setup onewire//
  OneWire oneWire(OneWire_Pin);
  DallasTemperature sensors(&oneWire);
  // Start up the library
  sensors.begin();
  // aufloesung 10 bit fuer alle Sensoren
  for (int i = 0; i < (sizeof(tempC_DS18) / sizeof(float)); i++) {
    sensors.setResolution(TempSensor[i], 10);
  }
  for (int i = 0; i < (sizeof(tempC_DS18) / sizeof(float)); i++) {
    Serial.print("Checking 1-Wire Sensor ");
    Serial.println(i);
    sensors.requestTemperatures();
    float oldTemp = tempC_DS18[i];
    float newTemp = sensors.getTempC(TempSensor[i]);
    Serial.print("Got Temp Reading of :");
    Serial.print(newTemp);
    Serial.println(" deg C");
    if (abs(oldTemp - newTemp) > deltaT || maxTimeExpired) {
      if (set_sysvar(constructCommand("1Wire" + String(i), String(newTemp)))) {
        tempC_DS18[i] = newTemp;
      }
    }
  }
}

void checkDHT22() {
  for (int i = 0; i < (sizeof(DHT_PINS) / sizeof(int)); i++) {
    int pin = DHT_PINS[i];
    Serial.print("Checking DHT 22 Sensor connected to Pin:");
    Serial.println(pin);
    int chk = DHT.read22(pin);
    float oldTemp = tempC_DHT[i];
    float newTemp = DHT.temperature;
    float oldHum = hum_DHT[i];
    float newHum = DHT.humidity;
    switch (chk)
    {
      case DHTLIB_OK:
        Serial.print("Data from Sensor ok. Temp=");
        Serial.print(newTemp);
        Serial.print("C / Humidity=");
        Serial.print(newHum);
        Serial.println("%");
        if (abs(oldTemp - newTemp) > deltaT || maxTimeExpired) {
          if (set_sysvar(constructCommand("DHTTemp_" + String(i), String(newTemp)))) {
            tempC_DHT[i] = newTemp;
          }
        }
        if (abs(oldHum - newHum) > deltaH || maxTimeExpired) {
          if (set_sysvar(constructCommand("DHTHum_" + String(i), String(newHum)))) {
            hum_DHT[i] = newHum;
          }
        }
        break;
      case DHTLIB_ERROR_CHECKSUM:
        Serial.println("Checksum Error");
        break;
      case DHTLIB_ERROR_TIMEOUT:
        Serial.println("Communication Timeout");
        break;
      default:
        Serial.println("Undefined Error");
        break;
    }
  }
}


CCU-2, Historian und ioBroker auf Odroid HC
11x HM-CC-RT-DN, 5x HM-TC-IT-WM-W-EU, 1x HM-WDS10-TH-O, 1x HM-WDS40-TH-I, 3x HM-Sec-SC-2, 2x HM-LC-Bl1-FM, 3x HM-LC-Sw2-FM, 2x HM-LC-SW1-FM, 1x HM-Sec-RHS

spot
Beiträge: 170
Registriert: 22.11.2013, 10:26
Wohnort: Schweiz

Re: Batterie Funk Windmesser, Barometer über Arduino

Beitrag von spot » 08.05.2015, 22:34

Die Installation läuft nun ca seit 2 Wochen mehr oder weniger Unterbruchsfrei (zum Teil auch ohne Stromsparmassnahmen und durchgehend eingeschaltetem Funkmodul). Die von mir verwendeten Batterien waren vorher in einer Fernsteuerung für ein Drohne drin, und irgendwie fand ich die Reichweite nicht mehr ausreichend. Zu Beginn zeigte die Messung 2.8V an (ohne dass ich das nun nachgemessen hätte). In der Zwischenzeit ist die Spannung bei 2.5V angekommen (zum Teil mit ziemlichen Ausschlägen gegen unten bis 2.1V welche ich mir noch nicht erklären kann).
Sobald neue Batterien rein kommen mache ich dann mal eine Messung und kann dann auch eine Aussage über die Lebensdauer machen. Da der Funkteil nach der Übertragung Schlafen gelegt wird sollte nur noch der ATMEL sowie der BMP180 Strom ziehen. Der BMP180 sollte eigentlich im Standby sehr genügsam sein, und beim Arduino habe ich die LEDs und den Spannungsregler entfernt, auch hier sollte nur ein sehr kleiner Strom fliessen.
Zur Zeit kann ich aber noch keine Aussage über die echte Lebensdauer der Batterien machen.
Von den Daten her kann ich nur sagen, dass die Station nun seit fast 7 Tagen ohne Unterbruch läuft und bisher sehr zuverlässig Daten liefert.
CCU-2, Historian und ioBroker auf Odroid HC
11x HM-CC-RT-DN, 5x HM-TC-IT-WM-W-EU, 1x HM-WDS10-TH-O, 1x HM-WDS40-TH-I, 3x HM-Sec-SC-2, 2x HM-LC-Bl1-FM, 3x HM-LC-Sw2-FM, 2x HM-LC-SW1-FM, 1x HM-Sec-RHS

dondaik
Beiträge: 12929
Registriert: 16.01.2009, 18:48
Wohnort: Steingaden
Hat sich bedankt: 1604 Mal
Danksagung erhalten: 222 Mal

Re: Batterie Funk Windmesser, Barometer über Arduino

Beitrag von dondaik » 08.05.2015, 22:41

ich glaube nicht das es das ethershield ist ;-) da liegt wohl das problem etwas "tiefer"... ich habe auch so meinen kampf mit dem teilchen...
im moment kneift es sich mit der ausgabe auf dem ser. monitor und ggf auch mit den antwortzeiten bis die ccu die verbindung erkennt ... :-(
-------
!!! der download der handbüchern auf den seiten von eq3 und das lesen der tips und tricks kann das hm-leben sehr erleichtern - das nutzen der suche nach schlagworten ebenso :mrgreen: !!!
wer schreibfehler findet darf sie behalten.

spot
Beiträge: 170
Registriert: 22.11.2013, 10:26
Wohnort: Schweiz

Re: Batterie Funk Windmesser, Barometer über Arduino

Beitrag von spot » 10.05.2015, 12:22

Ich habe heute festgestellt, dass der Arduino im "Leerlauf" 8mA verbraucht. Da das nicht alleine vom Arduino sein kann habe ich das Schema nochmals angeschaut und gesehen, dass auf dem BMP180 noch ein Spannungsregler ist. Scheinbar "verbrät" dieser ziemlich Energie. Ich hänge nun den "Barometer" Vcc Versorgungspin auf den freien Digital Pin 4 und "Strome" das Barometer Modul nur dann wenn auch wirklich eine Messung stattfindet. Sketch im 1. Beitrag wird dann heute noch updated.
CCU-2, Historian und ioBroker auf Odroid HC
11x HM-CC-RT-DN, 5x HM-TC-IT-WM-W-EU, 1x HM-WDS10-TH-O, 1x HM-WDS40-TH-I, 3x HM-Sec-SC-2, 2x HM-LC-Bl1-FM, 3x HM-LC-Sw2-FM, 2x HM-LC-SW1-FM, 1x HM-Sec-RHS

dondaik
Beiträge: 12929
Registriert: 16.01.2009, 18:48
Wohnort: Steingaden
Hat sich bedankt: 1604 Mal
Danksagung erhalten: 222 Mal

Re: Batterie Funk Windmesser, Barometer über Arduino

Beitrag von dondaik » 10.05.2015, 12:41

achtung: ich glaube der braucht eine gewisse zeit bis er, nach power on, stabil ist...
-------
!!! der download der handbüchern auf den seiten von eq3 und das lesen der tips und tricks kann das hm-leben sehr erleichtern - das nutzen der suche nach schlagworten ebenso :mrgreen: !!!
wer schreibfehler findet darf sie behalten.

spot
Beiträge: 170
Registriert: 22.11.2013, 10:26
Wohnort: Schweiz

Re: Batterie Funk Windmesser, Barometer über Arduino

Beitrag von spot » 10.05.2015, 14:24

Ja sofort nach Power on liefert er 0. Denke ich werde den Spannungsregler entfernen. Der BMP selbdt brauch nach Datenblatt im Standby < 100uA. Mit Spannungsregler ist er bei ca 8mA!
CCU-2, Historian und ioBroker auf Odroid HC
11x HM-CC-RT-DN, 5x HM-TC-IT-WM-W-EU, 1x HM-WDS10-TH-O, 1x HM-WDS40-TH-I, 3x HM-Sec-SC-2, 2x HM-LC-Bl1-FM, 3x HM-LC-Sw2-FM, 2x HM-LC-SW1-FM, 1x HM-Sec-RHS

spot
Beiträge: 170
Registriert: 22.11.2013, 10:26
Wohnort: Schweiz

Re: Batterie Funk Windmesser, Barometer über Arduino

Beitrag von spot » 10.05.2015, 22:16

Habe nun vorläufig einfach einen Delay von 250ms ins PowerUp vor dem Auslesen des Drucks eingefügt, und nun läuft es.

Der Ursprung meines Problems war übrigens z.T. ein defekt beim Step-Up Converter. Ich habe diesen ausgetauscht und nun fliest im Standby vom Arduino 80uA in den Step Up Konverter. Ich habe nun mal mit den folgenden Zahlen gerechnet:

- Arduino Schläft = 80uA / 99.25% der Zeit
- Arduino zählt Windmesser Impulse = 8mA / 0.375% der Zeit (gerechnet mit 5km/h langjähriger Durchschnitt und 20ms Wachphase Delay wg. Prellen inkl uP Aufwachen und Einschlafen).
- Arduino überträgt Messwerte = 23mA / 0.4% der Zeit (habe hier mit 1.2Sec im Schnitt gerechnet wenn die Übertragung mehrfach erfolgen muss z.B. wegen Übertragungsfehler ca 14mA NRF24 beim Senden 8-9mA Arduino).

Somit wären das gemittelt 200uA was bei einer Alkalien Kapazität von ca 2000mAH (gute Batterien haben 1900 - 2500mAH) eine Lebensdauer von etwas über einem Jahr ergeben sollte.
CCU-2, Historian und ioBroker auf Odroid HC
11x HM-CC-RT-DN, 5x HM-TC-IT-WM-W-EU, 1x HM-WDS10-TH-O, 1x HM-WDS40-TH-I, 3x HM-Sec-SC-2, 2x HM-LC-Bl1-FM, 3x HM-LC-Sw2-FM, 2x HM-LC-SW1-FM, 1x HM-Sec-RHS

Antworten

Zurück zu „Projektvorstellungen“