combining scripts almost finished but with a fault I don't see.



  • I tried to combine some scripts. first I had a 4 in 1: dht22, motion sensor and lux. Now I wanted to add a ds1820 for temperatur of warm water.

    the idea is to send every 2 a 3 minutes all readings to domoticz. execpt motion that must be immediately.

    this is my script:

    #include <SPI.h>
    #include <MySensor.h>  
    #include <DHT.h>  
    #include <BH1750.h>
    #include <Wire.h> 
      #include <DallasTemperature.h>
      #include <OneWire.h>
    
      #define COMPARE_TEMP 0 // Send temperature only if changed? 1 = Yes 0 = No
      #define ONE_WIRE_BUS 5
      #define MAX_ATTACHED_DS18B20 1
    
    #define CHILD_ID_LIGHT 0
    #define CHILD_ID_TEMP2 5
    #define CHILD_ID_HUM 0
    #define CHILD_ID_TEMP 1
    #define CHILD_ID_MOT 2   // Id of the sensor child
    
    #define HUMIDITY_SENSOR_DIGITAL_PIN 4
    #define DIGITAL_INPUT_SENSOR 3   // The digital input you attached your motion sensor.  (Only 2 and 3 generates interrupt!)
    #define INTERRUPT DIGITAL_INPUT_SENSOR-2 // Usually the interrupt = pin -2 (on uno/nano anyway)
    
    
    unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds)
    
    BH1750 lightSensor;
      OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
      DallasTemperature sensors(&oneWire); // Pass the oneWire reference to Dallas Temperature. 
    MySensor gw;
    DHT dht;
    float lastTemperature[MAX_ATTACHED_DS18B20];
    int numSensors=0;
    boolean receivedConfig = false;
    boolean metric = true; 
    float lastTemp;
    float lastHum;
    MyMessage msgHum(CHILD_ID_HUM, V_HUM);
    MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
    MyMessage msgMot(CHILD_ID_MOT, V_TRIPPED);
    MyMessage msg(CHILD_ID_LIGHT, V_LIGHT_LEVEL);
    MyMessage msgTemperature(CHILD_ID_TEMP2,V_TEMP);
    uint16_t lastlux;
    
    void setup()  
    { 
    
      // Startup up the OneWire library
      sensors.begin();
      // requestTemperatures() will not block current thread
      sensors.setWaitForConversion(false);
      
      // Startup and initialize MySensors library. Set callback for incoming messages. 
      gw.begin();
      
      dht.setup(HUMIDITY_SENSOR_DIGITAL_PIN); 
    
      // Send the Sketch Version Information to the Gateway
      gw.sendSketchInfo("Temp/Temp/Humidity/Motion/Lux", "1.0");
    
      
     pinMode(DIGITAL_INPUT_SENSOR, INPUT);      // sets the motion sensor digital pin as input
     
      // Register all sensors to gw (they will be created as child devices)
      gw.present(CHILD_ID_TEMP2, S_TEMP);
      gw.present(CHILD_ID_HUM, S_HUM);
      gw.present(CHILD_ID_TEMP, S_TEMP);
      gw.present(CHILD_ID_MOT, S_MOTION);
      gw.present(CHILD_ID_LIGHT, S_LIGHT_LEVEL);
       
      metric = gw.getConfig().isMetric;
        lightSensor.begin();
    }
    
    void loop()      
    
    {  
      // Read digital motion value
      boolean tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH; 
      Serial.println(tripped);
      gw.send(msgMot.set(tripped?"1":"0"));  // Send tripped value to gw 
      
      delay(dht.getMinimumSamplingPeriod());
    
      float temperature = dht.getTemperature();
      if (isnan(temperature)) {
          Serial.println("Failed reading temperature from DHT");
      } else if (temperature != lastTemp) {
        lastTemp = temperature;
        if (!metric) {
          temperature = dht.toFahrenheit(temperature);
        }
        gw.send(msgTemp.set(temperature, 1));
        Serial.print("Temp: ");
        Serial.println(temperature);
      }
      
      float humidity = dht.getHumidity();
      if (isnan(humidity)) {
          Serial.println("Failed reading humidity from DHT");
      } else if (humidity != lastHum) {
          lastHum = humidity;
          gw.send(msgHum.set(humidity, 1));
          Serial.print("Hum: ");
          Serial.println(humidity);
      }
    
        uint16_t lux = lightSensor.readLightLevel();// Get Lux value
        if (lux != lastlux) {
          gw.send(msg.set(lux));
          lastlux = lux;
      Serial.print("lux: ");
        Serial.println(lux);
      }
      
      
      // Ds1820 
      // Process incoming messages (like config from server)
        gw.process(); 
      // Fetch temperatures from Dallas sensors
        sensors.requestTemperatures();
        // query conversion time and sleep until conversion completed
        int16_t conversionTime = sensors.millisToWaitForConversion(sensors.getResolution());
        // sleep() call can be replaced by wait() call if node need to process incoming messages (or if node is repeater)
        gw.sleep(conversionTime);
         
      // Read temperatures and send them to controller 
      for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
            // Fetch and round temperature to one decimal
            float temperature = static_cast<float>(static_cast<int>((gw.getConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
         
            // Only send data if temperature has changed and no error
            #if COMPARE_TEMP == 1
            if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) {
            #else
            if (temperature != -127.00 && temperature != 85.00) {
            #endif
              // Send in the new temperature
              gw.send(msg.setSensor(i).set(temperature,1));
              // Save new temperatures for next compare
              lastTemperature[i]=temperature;
            Serial.print("DS1820: ");
            Serial.println(temperature);
        }
            }
      // Sleep until interrupt comes in on motion sensor. Send update every two minute. 
      gw.sleep(INTERRUPT,CHANGE, SLEEP_TIME);
    }
    
    
    

    and this is the serial output:

    send: 1-1-0-0 s=255,c=0,t=17,pt=0,l=3,sg=0,st=ok:1.5
    send: 1-1-0-0 s=255,c=3,t=6,pt=1,l=1,sg=0,st=ok:0
    read: 0-0-1 s=255,c=3,t=6,pt=0,l=1,sg=0:M
    sensor started, id=1, parent=0, distance=1
    send: 1-1-0-0 s=255,c=3,t=11,pt=0,l=25,sg=0,st=ok:Temp/Temp/Humidity/Motion
    send: 1-1-0-0 s=255,c=3,t=12,pt=0,l=3,sg=0,st=ok:1.0
    send: 1-1-0-0 s=5,c=0,t=6,pt=0,l=0,sg=0,st=ok:
    send: 1-1-0-0 s=0,c=0,t=7,pt=0,l=0,sg=0,st=ok:
    send: 1-1-0-0 s=1,c=0,t=6,pt=0,l=0,sg=0,st=ok:
    send: 1-1-0-0 s=2,c=0,t=1,pt=0,l=0,sg=0,st=ok:
    send: 1-1-0-0 s=0,c=0,t=16,pt=0,l=0,sg=0,st=ok:
    0
    send: 1-1-0-0 s=2,c=1,t=16,pt=0,l=1,sg=0,st=ok:0
    send: 1-1-0-0 s=1,c=1,t=0,pt=7,l=5,sg=0,st=ok:22.9
    Temp: 22.90
    send: 1-1-0-0 s=0,c=1,t=1,pt=7,l=5,sg=0,st=ok:41.8
    Hum: 41.80
    send: 1-1-0-0 s=0,c=1,t=23,pt=3,l=2,sg=0,st=ok:984
    lux: 984
    1
    send: 1-1-0-0 s=2,c=1,t=16,pt=0,l=1,sg=0,st=ok:1
    send: 1-1-0-0 s=0,c=1,t=23,pt=3,l=2,sg=0,st=ok:977
    lux: 977
    0
    send: 1-1-0-0 s=2,c=1,t=16,pt=0,l=1,sg=0,st=ok:0
    send: 1-1-0-0 s=0,c=1,t=1,pt=7,l=5,sg=0,st=ok:41.9
    Hum: 41.90
    send: 1-1-0-0 s=0,c=1,t=23,pt=3,l=2,sg=0,st=ok:979
    lux: 979
    0
    send: 1-1-0-0 s=2,c=1,t=16,pt=0,l=1,sg=0,st=ok:0
    send: 1-1-0-0 s=0,c=1,t=1,pt=7,l=5,sg=0,st=ok:41.8
    Hum: 41.80
    send: 1-1-0-0 s=0,c=1,t=23,pt=3,l=2,sg=0,st=ok:978
    lux: 978
    0
    send: 1-1-0-0 s=2,c=1,t=16,pt=0,l=1,sg=0,st=ok:0
    send: 1-1-0-0 s=0,c=1,t=1,pt=7,l=5,sg=0,st=ok:41.9
    Hum: 41.90
    send: 1-1-0-0 s=0,c=1,t=23,pt=3,l=2,sg=0,st=ok:977
    lux: 977
    1
    send: 1-1-0-0 s=2,c=1,t=16,pt=0,l=1,sg=0,st=fail:1
    send: 1-1-0-0 s=0,c=1,t=23,pt=3,l=2,sg=0,st=ok:660
    lux: 660
    0
    send: 1-1-0-0 s=2,c=1,t=16,pt=0,l=1,sg=0,st=ok:0
    send: 1-1-0-0 s=0,c=1,t=23,pt=3,l=2,sg=0,st=fail:593
    lux: 593
    1
    

    what is wrong?


  • Mod

    The output looks fine to me. Is there anything wrong? Values for all sensors are presented and the values look good.


Log in to reply
 

Suggested Topics

71
Online

11.5k
Users

11.1k
Topics

112.7k
Posts