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

  • 3
  • 2
  • 2
  • 3
  • 24
  • 1

33
Online

11.2k
Users

11.1k
Topics

112.5k
Posts