Feuchtigkeit

Der Z-uno kann definitiv mehrere Physikalische Sensoren abfragen!
Und nur weil PIN 13-16 als PWM gekennzeichnet sind, heißt das nicht das sie sonst brach liegen. Eine doppelte oder auch dreifache Belegung ist bei den kleinen Platinen Gang und gebe. Also kannst du auch an Pin 13 einen DHT anschließen, man sollte es nur dann lassen wenn man die vier PWM PIN`s für etwas anderes benötigt.

PINOUT Z-Uno

Gerhard, pin 9 & 10 sind standardmässig für I2C vorgesehen. Man kann sie zwar Code mäßig ändern, aber es einfacher I2C auf dem Standart zu lassen.

Auf dem Board sind also keine PWM Controller fest mit Pin 13-16 verbunden, sondern quasi nur default, ebenso wie über 9 und 10 I2C läuft?
Also dann werde ich zuno mal quälen, Sensor und Display anschließen. Komm zwar vor nächster Woche nicht dazu aber ich berichte dann.

Habe mal div. Sensoren verglichen:
Alle Sensoren sind für mehrere Stunden nebeneinander gestanden bevor ich die Messwerte genommen habe.

hyt221 (an ZUNO) 21,49°(+/-0.2°) 63,21% (+/-1.8%)
DHT22 (an EMON TH) 20,70°(+/-0.5°) 65,10% (+/-2RH max 5RH
Aeotec Multi Sensor 6 24.00° 52,00%
Aeon Labs 4in1 18,60° 67,00%
Netatmo Basis 22,30° 69,00%
Netatmo Innensensor 20,90° 70,00%
Netatmo Außensensor 21,10° 74,00%

Manche Sensoren dürften eher unter den Begriff Spielzeug fallen :slight_smile:
Kann nicht mit Sicherheit sagen, aber bezüglich der Spezifikation sollte der HYT Sensor am genausten sein.
Er ist auch von Werk aus kalibriert.
DHT liegt angenehm nahe,
AOTEC MS6 hat Fantasiewerte.
Aeon 4/1 ist von der Temperatur weit daneben, scheint aber relativ genau bei Luftfeuchtigkeit zu sein.
Netatmo ist ein eigenes Kapitel, Sensoren habe untereinander eine ziemliche Streuung und der Sensor ist äußerst träge.
Hat 2 h gebraucht um halbwegs stabil zu werden. (langsamer Fall von 95 auf 74%)

Man sollte sich gut überlegen worauf man sich bei Feuchtigkeitssteuerungen verlässt.

Super Vergleich Danke Markus.
Der HYT221 war so um die 30€? Der DHT22 hat mich 5€ im Doppelpack gekostet.
Ich bin mal gespannt wie sich die beiden DHT22 verhalten, wenn die auf einem Board sind.

Ps ich hab seit 2 wochen 2 Motion Eye nebeneinander liegen. Die Abweichungen liegen bei 1% die Reaktionszeit ist jedoch sehr unterschiedlich. Die ein oder andere Fehlmessung/übertragung ist auch dabei- 10% Abweichung.

Persönlich bin ich mit dem DHT22 immer sehr gut gefahren, ich denke Preis/Leistung ist der unschlagbar.

Fehlmessungen wird man leider mit fast jedem Sensor mal haben, was an und für sich auch kein Problem sein sollte.

Problematisch ist es nur beim Z-Uno, da ich (noch) keine Möglichkeit gefunden habe die Werte zu glätten. Der misst etwas und das wird auch gleich so ausgespuckt, ich bin es eher gewöhnt 10 Messungen zu mitteln und das dann auszugeben.

@ Robert
Du hats mir doch das 2 Sensoren Beispiel programmiert. Nochmals Danke.

Kannst du mir das begin.serial erklären. Ich hab das Problem, dass wenn ich den seriellen Monitor öffne ich erstmal nichts sehe. Wenn ich Glück habe nach 5 Min wenn Pech muss ich das Prog neu starten.

Probiere mal folgenden Sketch.
Ich habe den Serial Part um die Messwerte vom zweiten Sensor ergänzt, tausche das einfach mal aus. Beachte bitte auch das dort ein 30 Sekunden delay (Wartezeit) eingestellt ist. Das kannst du testweise ja mal von 30000 auf 5000 runter setzen. Wenn man nichts sieht hilft es manchmal den seriellen Monitor kurz zu schließen und dann wieder zu öffnen. In dem Moment wird dann ein reset an den Controller geschickt.

// demo sketch for connecting DHT11 humidity and temperature sensor to Z-Uno

// add library
#include "ZUNO_DHT.h"
// pin connection
#define DHTPIN1 9 
#define DHTPIN2 10

DHT dht1(DHTPIN1, DHT22);
DHT dht2(DHTPIN2, DHT22);

int humidity1;      // here we will store the humidity
int temperature1;   // here we will store the temperature
int humidity2;      // here we will store the humidity
int temperature2;   // here we will store the temperature

// set up channels
ZUNO_SETUP_CHANNELS(
      ZUNO_SENSOR_MULTILEVEL_TEMPERATURE(getterTemperature),
      ZUNO_SENSOR_MULTILEVEL_HUMIDITY(getterHumidity),
      ZUNO_SENSOR_MULTILEVEL_TEMPERATURE(getterTemperature1),
      ZUNO_SENSOR_MULTILEVEL_HUMIDITY(getterHumidity1)
);

void setup() {
  dht1.begin();
  dht2.begin();
  Serial.begin(); 
  Serial.println("start");
}

void loop() {
  // obtaining readings from the sensor DHT
  humidity1 = dht1.readHumidity();
  temperature1 = dht1.readTemperature();
  humidity2 = dht1.readHumidity();
  temperature2 = dht1.readTemperature();
  Serial.print("Humidity = "); 
  Serial.print(humidity1);
  Serial.print(" %  ");
  Serial.print("Temperature = "); 
  Serial.print(temperature1);
  Serial.println(" *C");
  Serial.print("Humidity = "); 
  Serial.print(humidity2);
  Serial.print(" %  ");
  Serial.print("Temperature = "); 
  Serial.print(temperature2);
  Serial.println(" *C");
  // send data to channels
  zunoSendReport(1);
  zunoSendReport(2); 
  zunoSendReport(3); 
  zunoSendReport(4); 
  // send every 30 second
  delay(30000);
}

byte getterTemperature() {
  return temperature2;
}

byte getterHumidity() {
  return humidity2;
}
byte getterTemperature1() {
  return temperature1;
}

byte getterHumidity1() {
  return humidity1;
}

Funktioniert der Sketch denn prinzipiell?

@ Robert
ich komm erst am Dienstag dazu das zu testen.
Zum mitteln müsste man ein Array zb. mit 10 Werten definieren, den höchsten und niedrigsten wegwerfen, die restlichen 8 Mitteln (das würde ich wahrscheinlich noch hinbekommen) und den Wert dann mit zunosendReport??? übertragen.
Nur so ins unreine gesprochen.

hm… ich habe mal wieder was neues probiert.
Wir haben jetzt zwei DHT22 Sensoren

humidity1 und temperature1 = DHT22 Sensor 1
humidity2 und temperature2 = DHT22 Sensor 2

Die Variablen humidity2 und temperature2 werden nach wie vor direkt vom Sensor befüllt und an das Z-Wave System weitergegeben.

Die Variablen humidity1 und temperature1 werden berechnet und von folgender Formel gefüllt.

humidity1=(humidity11+humidity12+humidity13+humidity14)/4; temperature1=(temperature11+temperature12+temperature13+temperature14)/4;

Dein Vorschlag den niedrigsten und den höchsten Wert zu kappen kann ich gedanklich so jetzt noch nicht abbilden, wobei ich die Idee sehr gut und nachvollziehbar finde. Meine Erfahrungen mit den DHT22 sind aber das sie sehr gleichmäßige Werte liefern. Wenn ich jetzt zwei nebeneinander lege und die Werte sind konstant um 2rH auseinander, dann bauen wir einfach ein Offset ein.

// demo sketch for connecting DHT11 humidity and temperature sensor to Z-Uno

// add library
#include "ZUNO_DHT.h"
// pin connection
#define DHTPIN1 9 
#define DHTPIN2 10

DHT dht1(DHTPIN1, DHT22);
DHT dht2(DHTPIN2, DHT22);

int humidity1;      // here we will store the humidity
int temperature1;   // here we will store the temperature
int humidity11;      // here we will store the humidity
int temperature11;   // here we will store the temperature
int humidity12;      // here we will store the humidity
int temperature12;   // here we will store the temperature
int humidity13;      // here we will store the humidity
int temperature13;   // here we will store the temperature
int humidity14;      // here we will store the humidity
int temperature14;   // here we will store the temperature
int humidity2;      // here we will store the humidity
int temperature2;   // here we will store the temperature

// set up channels
ZUNO_SETUP_CHANNELS(
      ZUNO_SENSOR_MULTILEVEL_TEMPERATURE(getterTemperature),
      ZUNO_SENSOR_MULTILEVEL_HUMIDITY(getterHumidity),
      ZUNO_SENSOR_MULTILEVEL_TEMPERATURE(getterTemperature1),
      ZUNO_SENSOR_MULTILEVEL_HUMIDITY(getterHumidity1)
);

void setup() {
  dht1.begin();
  dht2.begin();
  Serial.begin(); 
  Serial.println("start");
}

void loop() {
  // obtaining readings from the sensor DHT
  humidity11 = dht1.readHumidity();
  temperature11 = dht1.readTemperature();
  humidity12 = dht1.readHumidity();
  temperature12 = dht1.readTemperature();
  humidity13 = dht1.readHumidity();
  temperature13 = dht1.readTemperature();
  humidity14 = dht1.readHumidity();
  temperature14 = dht1.readTemperature();
  humidity2 = dht1.readHumidity();
  temperature2 = dht1.readTemperature();
  humidity1=(humidity11+humidity12+humidity13+humidity14)/4;
  temperature1=(temperature11+temperature12+temperature13+temperature14)/4;
  Serial.print("Humidity = "); 
  Serial.print(humidity1);
  Serial.print(" %  ");
  Serial.print("Temperature = "); 
  Serial.print(temperature1);
  Serial.println(" *C");
  Serial.print("Humidity = "); 
  Serial.print(humidity2);
  Serial.print(" %  ");
  Serial.print("Temperature = "); 
  Serial.print(temperature2);
  Serial.println(" *C");
  // send data to channels
  zunoSendReport(1);
  zunoSendReport(2); 
  zunoSendReport(3); 
  zunoSendReport(4); 
  // send every 30 second
  delay(30000);
}

byte getterTemperature() {
  return temperature2;
}

byte getterHumidity() {
  return humidity2;
}
byte getterTemperature1() {
  return temperature1;
}

byte getterHumidity1() {
  return humidity1;
}

Edit:
Mir ist auch noch etwas anderes in den Sinn gekommen. Wir können auch noch einen „virtuellen“ dritten DHT22 Sensor einbinden. Wofür das ganze?
Um damit die DIfferenz der beiden physischen DHT22 im Z-Wave System agezeigt zu bekommen.
Wenn ich Beispielsweise einen Badezimmerlüfter in Verbindung mit einem Luft/Luft Wärmetauscher betreiben will, dann könnte der Differenzwert dazu dienen den Lüfter zu schalten.

Tja das war ein kurzer Spass. Nach etwas mehr als 2 Tagen war ein 1200 mAh Akku leer. Er war sicherlich nicht mehr der fitteste, aber ich muss unbedingt einen Spleepmode einbauen.

Es müsste doch in den eingebunden Libs einen Sort geben? Ich werde auch nochmal im z-uno Forum danach fragen.

Hallo Robert,
nachdem die Sensoren in verschieden Räumen sein sollen kommt das virtuelle Device für mich nicht in Frage.
Ich habe die Werte in ein Array geschrieben hum1[10] und temp1[10]. Man hätte auch ein 2-dimensionales nehmen können. Jetzt such ich noch eine Lib in der ein Sort für ein (Mehrdimensinales)Array ist.

Den DataPin habe ich auf Pin 11 und 12 des z-uno gelegt, somit sind die I²C Ports noch frei.
Ich will auch nur alle 15 Minuten einen Wert an die HC2 senden (Batterie schonen). Wenn ich fertig bin poste ich das hier.

Ansonsten hat alles funktioniert.

Das freut mich zu hören das alles geklappt hat. Ich habe meinen Z-Uno auch wieder zum fliegen bekommen, mal schauen was mir noch so dazu einfällt :slight_smile:

Habe nun den HYT221 erfolgreich getestet.

Gerhard, Robert,

Euer DHT Beispiel dürfte nur ganze Grad auflösen!
Ihr müsstet den Sensor mit zwei Byte und einer Dezimalstelle definieren. getter als Word die Temperatur mal 10 nehmen und neu anlernen. (Siehe HYT Code)
Möchte den HYT Code nicht vorenthalten.

Z-UNO PIN 10 an PIN1
Z-UNO PIN GND an PIN2
Z-UNO PIN 3.3V an PIN3
Z-UNO PIN 9 an PIN4

// demo sketch for connecting HYT221 humidity and temperature sensor to Z-Uno

// add library
#include <Wire.h>   

// set up channels
ZUNO_SETUP_CHANNELS(
        ZUNO_SENSOR_MULTILEVEL(ZUNO_SENSOR_MULTILEVEL_TYPE_TEMPERATURE, 
                          SENSOR_MULTILEVEL_SCALE_CELSIUS, 
                          SENSOR_MULTILEVEL_SIZE_TWO_BYTES, 
                          SENSOR_MULTILEVEL_PRECISION_ONE_DECIMAL,
                          getterTemperature),
     ZUNO_SENSOR_MULTILEVEL_HUMIDITY(getterHumidity)
);

void setup() {
  #define HYT_ADDR 0x28     // I2C address of the HYT 221, 271, 939 and most likely the rest of the family
  Wire.begin();             // Join I2c Bus as master
  Serial.begin(9600);       // Start serial communication for serial console output
  pinMode(13, OUTPUT);
}

int humidity; // here we will store the humidity
word temperature; // here we will store the temperature

void loop() {
  int iData[4];

  Wire.beginTransmission(HYT_ADDR);
  Wire.write(0);    // initiate measurement
  Wire.endTransmission(); 
  
  delay(500);
  
  Wire.beginTransmission(HYT_ADDR);   // Begin transmission with given device on I2C bus
  Wire.requestFrom(HYT_ADDR, 4);      // Request 4 bytes 
  // Read the bytes if they are available
  // The first two bytes are humidity the last two are temperature
  if(Wire.available() == 4) {                   
           iData[1] = Wire.read();
           iData[2] = Wire.read();
           iData[3] = Wire.read();
           iData[4] = Wire.read();
           Wire.endTransmission();           // End transmission and release I2C bus
              
           // combine humidity bytes and calculate humidity
           int rawHumidity = iData[1] << 8 | iData[2];
           rawHumidity =  (rawHumidity &= 0x3FFF);
           humidity = 100.0 / pow(2,14) * rawHumidity;
             
        Serial.print("Humidity: ");
        Serial.print(humidity);
             
          // combine temperature bytes and calculate temperature
          iData[4] = (iData[4] >> 2); // Mask away 2 least significant bits see HYT 221 doc
          int rawTemperature = iData[3] << 6 | iData[4];
          temperature = (165.0 / pow(2,14) * rawTemperature - 40)*10; 
        
        Serial.print("% - Temperature: ");
        Serial.print(temperature/10);
        Serial.println("C");

  }
  else {
        Serial.println("Not enough bytes available on wire.");
  }
  zunoSendReport(1);
  zunoSendReport(2);  
  blinkWait();
 delay(28000);// send every 30 second
  }

  void blinkWait() {
  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
  delay(1000);
}

word getterTemperature() {
  return temperature;
}

byte getterHumidity() {
  return humidity;
}


Die Sache mit Batteriesparen gestaltet sich schwierig. Zur Zeit habe ich eher einen Coma-Mode als einen Sleepmode.

// add library
#include "ZUNO_DHT.h"
// pin connection
#define DHTPIN1 11  // first sensor
#define DHTPIN2 12  // second sensor

DHT dht1(DHTPIN1, DHT22);  //
DHT dht2(DHTPIN2, DHT22);

int humidity1;      // here we will store the humidity of first sensor
float temperature1;   // here we will store the temperature of first sensor  (float for decimals)
int humidity2;      // here we will store the humidity of second sensor
float temperature2;   // here we will store the temperature of second sensor  (float for decimals)

// set up channels
ZUNO_SETUP_CHANNELS(
  ZUNO_SENSOR_MULTILEVEL_TEMPERATURE(getterTemperature1),
  ZUNO_SENSOR_MULTILEVEL_HUMIDITY(getterHumidity1),
  ZUNO_SENSOR_MULTILEVEL_TEMPERATURE(getterTemperature2),
  ZUNO_SENSOR_MULTILEVEL_HUMIDITY(getterHumidity2)
);
ZUNO_SETUP_SLEEPING_MODE(ZUNO_SLEEPING_MODE_SLEEPING); // setzt den sleeping mode

void setup() {
  dht1.begin();
  dht2.begin();
  Serial.begin();
  Serial.println("start");
}

void loop() {
  // obtaining readings from the sensor DHT
  humidity1 = dht1.readHumidity();
  temperature1 = dht1.readTemperature();
  humidity2 = dht2.readHumidity();
  temperature2 = dht2.readTemperature();
  Serial.print("Humidity1 = ");
  Serial.print(humidity1);
  Serial.println(" %  ");
  Serial.print("Humidity2 = ");
  Serial.print(humidity2);
  Serial.println(" %  ");
  Serial.print("Temperature1 = ");
  Serial.print(temperature1);
  Serial.println(" *C");
  Serial.print("Temperature2 = ");
  Serial.print(temperature2);
  Serial.println(" *C");
  // send data to channels
  zunoSendReport(1);
  zunoSendReport(2);
  zunoSendReport(3);
  zunoSendReport(4);
  // send every 30 second
  delay(30000);
 zunoSendDeviceToSleep();

}

byte getterTemperature1() {
  return temperature1;
}

byte getterHumidity1() {
  return humidity1;
}
byte getterTemperature2() {
  return temperature2;
}

byte getterHumidity2() {
  return humidity2;
 }
  

Konf.png

Danke für den Hinweis mdietinger, ich werde das wenn ich Zeit habe mal umsetzen. Bisher habe ich ja nur alles in der Theorie verfasst, mein Z-Uno hat den Sketch noch nicht gesehen :wink: