Z-Uno

So dann schauen wir mal, ob es nun mit den Fotos funktioniert. Will wohl nicht, anbei der Onedrive-Link: Link

Sehr sauber aufgebaut.
Wenn du den Regensensor auch am Dach installierst achte auf einfachen Zugang um den Behälter zu reinigen. Wenn du Temperatursensor ohne Lüftung gebaut hast, dann am besten im Schatten montieren.

Danke. Aktuell habe ich im Wettergehäuse einen Lüfter eingeklebt, dieser sollte das Temperaturproblem lösen. Genaue Gedanken habe ich mir aber noch nicht gemacht, da ich mir über die Wintermonate eigentlich ein optimales Gehäuse drucken wollte. Vielleicht wird es sowas wie hier zum Beispiel
Was gibt es denn am oder im Regensensor zu reinigen? Meinst du Tiere, welche sich einnisten? Habe schon darüber nachgedacht, es vielleicht mit Fliegengitter rum herum einzupacken.

Regensensor, wird durch Blätter und Insekten verschmutzt.

Abend, da dachte ich die Wetterstation läuft zuverlässig und wollte schon mit dem Gehäuse designen und dem 3D Druck beginnen und schon steigen wieder Sensoren aus. Platine und Schaltung habe ich getestet und gemessen, dort sollte alles in Ordnung sein, erst Recht, da die Sensoren auch per Jumper Wire unregelmäßig aussteigen. Ich habe auch gerade beim Temperatursensor schon einige durch (SHT21, BME280, HYT99). Also habe ich @mdietinger deinen Urpsrungscode auf den Z-Uno geladen und gleiches Problem in unregelmäßigen Abständen. Der einzige Unterschied, welcher besteht ist, dass ich den I2C nicht wie du mit Pullup Widerständen auf 3,3V hochgezogen habe. Daher die Frage, wieso hast du dies gemacht? Kannst du mir eine Quelle oder kurze Erklärung geben?

Hallo,

I2C benötigt für eine stabile Funktion Pull Up Widerstände.
Dieser Artikel erklärt recht gut was messtechnisch auf dem Bus passiert:
I2C

Wenn du sagst die Sensoren steigen aus, was meinst du damit?
Gehen nur die I2C Sensoren nicht oder hängt der ganze Z-UNO?
Falls nur I2C betroffen ist kannst du mal probieren andere PINS als I2C zu definieren.(Siehe Z-UNO Dokumentation)
Vlt. haben die Pins Schaden genommen.

Unter aussteigen meine ich, dass der Sensor eine gewisse Zeit lang keine Daten anzeigt. Komischerweise aber nicht alle Sensoren, welche per i2c angeschlossen sind. Das mit den Pins schaue ich mir morgen an. Danke

Danke für den Artikel. Wenn ich es richtig verstanden habe, versuche ich es mit 4,7k jeweils von SCL und SDL nach VCC und messe, ob ich dauerhaft 3,3V habe?

Messen könntest nur mit Osziloskop.
Am SCL müsstest einen sauberen Clock haben und an SDA Daten. Ohne Widerstände wird der Bus instabil und es kann zu Fehlern und einer verringerten Übertragunsstrecke kommen.
Sollten die Widerstände nicht helfen kannst noch andere PINs verwenden. Habe bei meinem Aufbau über Monate kein Problem feststellen können.

Danke für die schnelle Info. Die Pins sind es schonmal nicht, habe umgesteckt und diese im Script geändert, gleiches Problem. Ich werd am Wochenende mal löten und berichten.

Wäre interessant wenn du den PC an der Schaltung anhängst und Debug mitlaufen lässt.
Damit solltest sehen ob der z.b. Temperatursensor keine Messungen liefert, oder ob nur über Zwave nichts ankommt.
Kann auch sein dass dein Zwave Netz schon so viele Sensoren hat dass nicht alle Übertragungen akzeptiert werden.

Kann ich gerne am Wochenende testen, dann kann ich die Wetterstation auch gleich in das Prototypgehäuse umbauen.
Die Widerstände sollte ich aber vorher einlöten oder würdest du ohne testen?

In meinem Z-Wave Netzwerk laufen 8 Dimmer, 12 Relais, Garagenöffnung, 8 Rauchmelder und 11 Bewegungsmelder, plus die paar Sensoren der Wetterstation. Also eigentlich noch nicht wirklich viel.

Widerstände gehören sowieso rein und ob es ein Problem mit I2C bus war oder Zwave ist dann unerheblich.

Alles klar.

Also es lag offensichtlich an den fehlenden Widerständen. Habe nach dem einlöten keine Probleme mehr gehabt. Also Dir nochmal vielen Dank.

Jetzt kann ich mich an den Z-UNO für die Garage machen.

@mdietinger:
Wollten Sie den BH1750 nicht auch austauschen? Welcher Sensor ist es bei Ihnen geworden? Oder vielleicht sogar ein Solarmodul für die w/m2 genommen?

Bei mir ist es ein MAX44009 geworden. https://www.maximintegrated.com/en/products/sensors/MAX44009.html
Weiters habe ich einen SDS011 Feinstaubsensor verbaut.
Bei interesse kann ich den Code teilen.

Welche Libary haste denn beim Max4409 genommen? Ich habe irgendwas am Code geändert und mir gerne keine Notizen gemacht und nun zeigt der Sensor maximal 2937 Lux an, daher die Frage. Code wäre fantastisch.

Ich habe keine Library verwendet.
Spreche den Sensor direkt an.
Hier ist mein ganzer Code.
Du solltest den Code für MAX44009 leicht finden.

//PIN17-wind (3V3-2K2-PIN17-100nF-GND)
//PIN18-rain (3V3-2K2-PIN18-100nF-GND)
//PIN4 ADC1
//PIN9-SCL         (2K2 pullup to 3V3)
//PIN10-SDA     (2K2 pullup to 3V3)
//GND-Ground
//3V3-3Volts

//WIND:
//*
//2-3V3(Yellow)
//3-PIN4-Winddirection(Green)
//4-GND(Red)
//5-PIN17-Windspeed(Black)
//*

//RAIN:
//*
//*
//3-PIN18-Rainsensor
//4-GND
//*
//*

//I2C Temperature & Light:
//*
//2-3V3
//3-PIN9-SCL
//4-GND
//5-PIN10-SDA
//*
#include <Wire.h>
#include <math.h>
#include "EEPROM.h" 
#define EEPROM_ADDR             0x800              // EEPROM address
#define EEPROM_UPDATE_INTERVAL  120000            // Delayed EEPROM writing to minimize writting attempts
#define HYT_ADDR 0x28                            //0x50 I2C address of the HYT 939 0x28 Default
#define Addr 0x4A                               //max44009 i2c address is 0x4a 
#define slaveAddress 0x5A                                     
#define wind2_factor 0.50292                  //m/s per pulse in 2 seconds
#define rain_factor 0.2                                                 //mm per pulse
ZUNO_SETUP_ISR_INT0(int0_handler);          // Davis Windsensor
ZUNO_SETUP_ISR_INT1(int1_handler);         // Davis Regensensor
ZUNO_SETUP_ISR_GPTIMER(gpt_handler);        // 2" Timer (2" & 1 Minute measurements)

struct meter_data {
    dword rain_total;
    byte          crc8;
};
meter_data my_meter_data;

struct sensor_data {
int temperature = 0;   
unsigned int humidity = 0;   
unsigned int wind_speed = 0;
unsigned int wind_gust = 0;
unsigned int wind_direction = 0;          
unsigned int rain_rate = 0;
dword light = 0;            
};
sensor_data my_sensor;

long last_write_EEPROM_millis = 0;
unsigned int wind_pulses = 0;
unsigned int wind_pulses60 = 0;
unsigned int wind_boe60 = 0;
unsigned int rain_pulses = 0;
unsigned int rain_pulses300 = 0;
unsigned int Pm25 = 0;//used for result pm2.5
unsigned int Pm10 = 0;//used for result pm10
unsigned char Pm25IsNew = 0;//show if pm25 is refreshed

byte data_updated  = FALSE;
byte GPT_2sec = 0;
byte count_2sec = 0;
byte minute_Count = 0;
byte hour_Count = 0;
byte RR[12];

ZUNO_SETUP_CHANNELS(// set up channels
     ZUNO_SENSOR_MULTILEVEL(ZUNO_SENSOR_MULTILEVEL_TYPE_TEMPERATURE,
                               SENSOR_MULTILEVEL_SCALE_CELSIUS,
                               SENSOR_MULTILEVEL_SIZE_TWO_BYTES,
                               SENSOR_MULTILEVEL_PRECISION_TWO_DECIMALS,
                               getterTemperature),
     ZUNO_SENSOR_MULTILEVEL(ZUNO_SENSOR_MULTILEVEL_TYPE_RELATIVE_HUMIDITY,
                               SENSOR_MULTILEVEL_SCALE_PERCENTAGE_VALUE,
                                SENSOR_MULTILEVEL_SIZE_TWO_BYTES,
                                SENSOR_MULTILEVEL_PRECISION_TWO_DECIMALS,
                                getterHumidity) ,    
     ZUNO_SENSOR_MULTILEVEL(ZUNO_SENSOR_MULTILEVEL_TYPE_VELOCITY,
                               SENSOR_MULTILEVEL_SCALE_METERS_PER_SECOND,
                               SENSOR_MULTILEVEL_SIZE_TWO_BYTES,
                               SENSOR_MULTILEVEL_PRECISION_TWO_DECIMALS,
                               getterVelocity),
     ZUNO_SENSOR_MULTILEVEL(ZUNO_SENSOR_MULTILEVEL_TYPE_VELOCITY,
                               SENSOR_MULTILEVEL_SCALE_METERS_PER_SECOND,
                               SENSOR_MULTILEVEL_SIZE_TWO_BYTES,
                               SENSOR_MULTILEVEL_PRECISION_TWO_DECIMALS,
                               getterVelocityBoe),
     ZUNO_SENSOR_MULTILEVEL_ANGLE_POSITION (getterDirection),
                ZUNO_SENSOR_MULTILEVEL(ZUNO_SENSOR_MULTILEVEL_TYPE_RAIN_RATE,
                SENSOR_MULTILEVEL_SCALE_MILLIMETERS_PER_HOUR,
                SENSOR_MULTILEVEL_SIZE_TWO_BYTES,
                SENSOR_MULTILEVEL_PRECISION_ONE_DECIMAL,
                getterRainRate),
     ZUNO_METER(ZUNO_METER_TYPE_WATER,
                               METER_RESET_ENABLE,
                               ZUNO_METER_WATER_SCALE_PULSECOUNT,
                               METER_SIZE_FOUR_BYTES,
                               METER_PRECISION_ONE_DECIMAL,
                               getterRain,
                               resetterRain),
     ZUNO_SENSOR_MULTILEVEL(ZUNO_SENSOR_MULTILEVEL_TYPE_LUMINANCE,
                         SENSOR_MULTILEVEL_SCALE_LUX,
                         SENSOR_MULTILEVEL_SIZE_FOUR_BYTES,
                         SENSOR_MULTILEVEL_PRECISION_ZERO_DECIMALS,
                         GetterLightLux),
     ZUNO_SENSOR_MULTILEVEL_ANGLE_POSITION (getterCount),
        ZUNO_SENSOR_MULTILEVEL(ZUNO_SENSOR_MULTILEVEL_TYPE_CO2_LEVEL,
             0, 
             SENSOR_MULTILEVEL_SIZE_TWO_BYTES, 
             SENSOR_MULTILEVEL_PRECISION_ZERO_DECIMALS, 
             getter25),
   
     ZUNO_SENSOR_MULTILEVEL(ZUNO_SENSOR_MULTILEVEL_TYPE_CO2_LEVEL, 
             0, 
             SENSOR_MULTILEVEL_SIZE_TWO_BYTES, 
             SENSOR_MULTILEVEL_PRECISION_ZERO_DECIMALS, 
             getter10)
);
   

void setup() {
                zunoExtIntMode(ZUNO_EXT_INT0, RISING);
                zunoExtIntMode(ZUNO_EXT_INT1, RISING);
                zunoGPTInit(ZUNO_GPT_SCALE1024|ZUNO_GPT_CYCLIC);
                zunoGPTSet(62500); // 2 Sekunden Timer
                zunoGPTEnable(1);
                
                Serial1.begin(9600);     // the Serial port of SDS011 sensor

                EEPROM.get(EEPROM_ADDR,  &my_meter_data, sizeof(meter_data));                          
                if (my_crc8((byte*)&my_meter_data, sizeof(meter_data) - 1) != my_meter_data.crc8) {    
                               my_meter_data.rain_total = 0;                                              
                               update_meter_data();
                }
                                                      
}

void int0_handler() // PIN17-wind sensor interupt
{
  wind_pulses++;
}

void int1_handler() // PIN18-rain sensor interupt
{
  rain_pulses++;
}

void gpt_handler()  // 2" Timer
{
  GPT_2sec++;
}

void loop() {
 uint8_t mData = 0;
  uint8_t i = 0;
  uint8_t mPkt[10] = {0};
  uint8_t mCheck = 0;
   while (Serial1.available() > 0) 
  {  
    mData = Serial1.read();     delay(2);
    if(mData == 0xAA)//head1 ok
     {
        delay(400);//wait until packet is received
        mPkt[0] =  mData;
        mData = Serial1.read();
        if(mData == 0xc0)//head2 ok
        {
          mPkt[1] =  mData;
          mCheck = 0;
          for(i=0;i < 6;i++)//data recv and crc calc
          {
             mPkt[i+2] = Serial1.read();
             delay(2);
             mCheck += mPkt[i+2];
          }
          mPkt[8] = Serial1.read();
          delay(1);
          mPkt[9] = Serial1.read();
          if(mCheck == mPkt[8])//crc ok
          {
            Serial1.flush();
            Pm25 = ((uint16_t)mPkt[2] | (uint16_t)(mPkt[3]<<8))/10;
            Pm10 = ((uint16_t)mPkt[4] | (uint16_t)(mPkt[5]<<8))/10;
            if(Pm25 > 9999)
             Pm25 = 9999;
            if(Pm10 > 9999)
             Pm10 = 9999;            
            //get one good packet
          }
        }      
     }
   } 
  
  if (count_2sec != GPT_2sec) {
    count_2sec = GPT_2sec;
    if (wind_pulses > wind_boe60) {
      my_sensor.wind_direction = map(analogRead(A1), 0, 1024, 0, 100); //PIN4- wind direction 0-100 in 3.6° steps 100=N
      wind_boe60 = wind_pulses ;
    }
    wind_pulses60 = (wind_pulses60 + wind_pulses);
   wind_pulses = 0;
    if (rain_pulses > 0) {
      my_meter_data.rain_total = my_meter_data.rain_total + 1; //Debounce 2 would be 180-360mm/h
      rain_pulses300 = rain_pulses300 +1;
      rain_pulses = 0;
    data_updated = true;
    }   
    if (count_2sec > 29) {
    minute_Count++;
    if (minute_Count > 4) {             
      minute_Count = 0;
      hour_Count++;
      if (hour_Count > 11) { hour_Count = 0; }
      RR[hour_Count] = rain_pulses300;
      rain_pulses300 = 0;
      for (byte i = 0; i < 12; i++) {
        rain_pulses300 = rain_pulses300 +RR[i] ;
      }     
      my_sensor.rain_rate = rain_pulses300 ;      
      rain_pulses300 = 0;
    } 
    my_sensor.wind_speed = wind_pulses60 * wind2_factor / 30 * 100; //Measurement in m/s
    my_sensor.wind_gust = wind_boe60 * wind2_factor * 100; //Measurement in m/s        
    wind_boe60 = 0;
    wind_pulses60 = 0;      
    GPT_2sec = 0;
    readSensor();
    }
  }
  if (data_updated && (millis() - last_write_EEPROM_millis) > EEPROM_UPDATE_INTERVAL) { // To save EEPROM from a lot of r/w operation write it once in EEPROM_UPDATE_INTERVAL if data was updated
    update_meter_data();
    data_updated = false;
    last_write_EEPROM_millis =  millis();
  }
  delay(100);
}

void readSensor () {
  unsigned int dataL[2];
  Wire.begin();
    // Start I2C Transmission
  Wire.beginTransmission(Addr);
  // Select data register
  Wire.write(0x03);
  // Stop I2C transmission
  Wire.endTransmission();
  // Request 2 bytes of data
  Wire.requestFrom(Addr, 2);
  // Read 2 bytes of data
  // luminance msb, luminance lsb
  if (Wire.available() == 2)
  {
    dataL[0] = Wire.read();
    dataL[1] = Wire.read();
  }
  
  // Convert the data to lux
  int exponent = (dataL[0] & 0xF0) >> 4;
  int mantissa = ((dataL[0] & 0x0F) << 4) | (dataL[1] & 0x0F);
 float lux = pow(2, exponent) * mantissa * 0.045 ;
  my_sensor.light = lux/4;
delay(300);
  int iData[4];
  Wire.beginTransmission(HYT_ADDR);
  Wire.write(0x80);                                                           
  Wire.endTransmission();
  delay(700);
  Wire.requestFrom(HYT_ADDR, 4);                                            
  if(Wire.available() == 4) {            
       iData[1] = Wire.read();
       iData[2] = Wire.read();
       iData[3] = Wire.read();
       iData[4] = Wire.read();
       int rawHumidity = iData[1] << 8 | iData[2];
       rawHumidity =  (rawHumidity &= 0x3FFF);
      my_sensor.humidity = 100.0 / pow(2,14) * rawHumidity*100;
       iData[4] = (iData[4] >> 2);
       int rawTemperature = iData[3] << 6 | iData[4];
      my_sensor.temperature = (165.0 / pow(2,14) * rawTemperature - 40)*100;
    }
       zunoSendReport(1);
       zunoSendReport(2);
       zunoSendReport(3);
       zunoSendReport(4);
       zunoSendReport(5);
       zunoSendReport(6);
       zunoSendReport(7);
       zunoSendReport(8);
       zunoSendReport(9); 
            zunoSendReport(10);
       zunoSendReport(11); 
 }

byte my_crc8(byte * data, byte count) {
    byte result = 0xDF;
    while(count--) {
        result ^= *data;
        data++;
    }
    return result;
}

void update_meter_data() {
my_meter_data.crc8 = my_crc8((byte*)&my_meter_data, sizeof(meter_data) - 1);
EEPROM.put(EEPROM_ADDR, &my_meter_data, sizeof(meter_data));
}

word getterTemperature() {
return my_sensor.temperature;
  }

word getterHumidity() {
return my_sensor.humidity;
}

word getterVelocity() {
return my_sensor.wind_speed;
}

word getterVelocityBoe() {
return my_sensor.wind_gust;
  }

word getterDirection() {
return my_sensor.wind_direction;
}

word getterRainRate() {
return my_sensor.rain_rate * rain_factor * 10;
}

word getterCount() {
return minute_Count;
}

void resetterRain(byte v) {
my_meter_data.rain_total = 0;
update_meter_data();
}

dword getterRain(void) {
return my_meter_data.rain_total * rain_factor * 10;
}

dword GetterLightLux() {
  return my_sensor.light;
}
int getter25(void) {
  return Pm25;
}
int getter10(void) {
  return Pm10;
}

Lieb von dir, schaue ich mir morgen an.