Slim Node Si7021 sensor example


  • Hardware Contributor

    @ar91 Did you change baud rate in MySensors config too?


  • Hardware Contributor

    @m26872 There is another version of the SI7021 board without voltage regulator. This evening I will look up the link on Aliexpress. The boards are smaller then the GY-21 variant.



  • Thanks @m26872, I changed the baud rate on MyConfig.h and it started working.



  • @m26872 My nodes are working correctly for the moment. Actually one is at 2.8v. Perhaps I will have problem when voltage will be lower !

    David.


  • Hardware Contributor

    @carlierd Probably. That's why I ask what you use. DHT22 connected straight to 2AA will not utilize battery capacity. Higher battery voltage with step down regulator would be better - or maybe without, but with like 3AAs or so.



  • @carlierd With Slim Node running at 1Mhz even with or without booster i am having hardtime making DHT22 work. I even tried different libraries but none of them works at 1Mhz. How did you get it work?


  • Hardware Contributor

    @ar91 I don't think there's a good reason to go below 8MHz if DHT22 doesn't work much below 3.3V ?



  • @m26872 Perhaps that with a caps I can go very low. I want to have at least one year on 2 AA. Wait and see !



  • @ar91 Hello. I am using the arduino playground lib. No issue with it ! I can post a sketch if necessary.

    David.



  • @carlierd If you could share your code that will be great.



  • @ar91 Please find the code I used in 3 different nodes. The good thing with the playground lib is that there is error message if dialog with DHT22 failed.

    /**
     * The MySensors Arduino library handles the wireless radio link and protocol
     * between your home built sensors/actuators and HA controller of choice.
     * The sensors forms a self healing radio network with optional repeaters. Each
     * repeater and gateway builds a routing tables in EEPROM which keeps track of the
     * network topology allowing messages to be routed to nodes.
     *
     * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
     * Copyright (C) 2013-2015 Sensnology AB
     * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
     *
     * Documentation: http://www.mysensors.org
     * Support Forum: http://forum.mysensors.org
     *
     * This program is free software; you can redistribute it and/or
     * modify it under the terms of the GNU General Public License
     * version 2 as published by the Free Software Foundation.
     *
     */
    
    /**************************************************************************************/
    /* Temperature, humidity and luminosity measurements.                                 */
    /*                                                                                    */
    /* Version     : 1.1.6                                                                */
    /* Date        : 10/01/2016                                                           */
    /* Modified by : David Carlier                                                        */
    /**************************************************************************************/
    /*                                ---------------                                     */
    /*                            RST |             |  A5                                 */
    /*                            RX  |             |  A4                                 */
    /*                            TX  |   ARDUINO   |  A3                                 */
    /*     RFM69 (DIO0) --------- D2  |     UNO     |  A2                                 */
    /*            DHT22 --------- D3  |             |  A1                                 */
    /*            Power --------- D4  | ATMEGA 328p |  A0 --------- Light dep. resistor   */
    /*              +3v --------- VCC |             | GND --------- GND                   */
    /*              GND --------- GND |  8MHz int.  | REF                                 */
    /*                            OSC |             | VCC --------- +3v                   */
    /*                            OSC |             | D13 --------- RFM69 (SCK)           */
    /*                            D5  |             | D12 --------- RFM69 (MISO)          */
    /*                            D6  |             | D11 --------- RFM69 (MOSI)          */
    /*                            D7  |             | D10 --------- RFM69 (NSS)           */
    /*                            D8  |             |  D9                                 */
    /*                                ---------------                                     */
    /*                                                                                    */
    /* Power = Vcc for LDR.                                                               */
    /* +3v = 2*AA                                                                         */
    /*                                                                                    */
    /**************************************************************************************/
    
    #include <SPI.h>
    #include <MySensor.h>
    #include <dht.h>
    #include <MyTransportRFM69.h>
    #include <MySigningAtsha204Soft.h>
    
    #define CHILD_ID_HUM 0
    #define CHILD_ID_TEMP 1
    #define CHILD_ID_LIGHT 2
    #define CHILD_ID_VOLTAGE 3
    #define LIGHT_SENSOR_ANALOG_PIN 0
    #define HUMIDITY_SENSOR_DIGITAL_PIN 3
    #define POWER_PIN 4
    //unsigned long SLEEP_TIME = 850000; // Sleep time between reads (in milliseconds) (close to 15')
    unsigned long SLEEP_TIME = 275000; // Sleep time between reads (in milliseconds) (close to 5')
    
    //Construct MySensors library
    MySigningAtsha204Soft signer;
    MyHwATMega328 hw;
    MyTransportRFM69 transport;
    MySensor gw(transport, hw, signer);
    dht DHT;
    MyMessage msgHum(CHILD_ID_HUM, V_HUM);
    MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
    MyMessage msgLum(CHILD_ID_LIGHT, V_LEVEL);
    MyMessage msgVolt(CHILD_ID_VOLTAGE, V_VOLTAGE);
    
    /**************************************************************************************/
    /* Initialization                                                                     */
    /**************************************************************************************/
    void setup()
      {
      //Get time (for setup duration)
      #ifdef DEBUG
        unsigned long startTime = millis();
      #endif
    
      //Start MySensors
      gw.begin();
    
      //Send the Sketch Version Information to the Gateway
      gw.sendSketchInfo("GHAS sensor", "1.1.5");
    
      //Register all sensors to gw (they will be created as child devices)
      gw.present(CHILD_ID_HUM, S_HUM);
      gw.present(CHILD_ID_TEMP, S_TEMP);
      gw.present(CHILD_ID_LIGHT, S_LIGHT_LEVEL);
      gw.present(CHILD_ID_VOLTAGE, S_MULTIMETER);
    
      //Delay for DHT22
      delay(1500);
    
      //Print setup debug
      #ifdef DEBUG
        int duration = millis() - startTime;
        Serial.print("[Setup duration: "); Serial.print(duration, DEC); Serial.println(" ms]");
      #endif
      }
    
    /**************************************************************************************/
    /* Main loop                                                                          */
    /**************************************************************************************/
    void loop()
      {
      //Get time (for a complete loop)
      #ifdef DEBUG
        unsigned long startTime = millis();
      #endif
    
      //Power on
      powerOnPeripherals();
    
      //Get DHT22 data
      int dht22Result = DHT.read22(HUMIDITY_SENSOR_DIGITAL_PIN);
      switch (dht22Result)
        {
        case DHTLIB_OK:  
                    //Serial.println("OK,\t");
                    break;
        case DHTLIB_ERROR_CHECKSUM:
                    #ifdef DEBUG
                      Serial.println("Checksum error,\t");
                    #endif
                    break;
        case DHTLIB_ERROR_TIMEOUT:
                    #ifdef DEBUG
                      Serial.println("Time out error,\t");
                    #endif
                    break;
        case DHTLIB_ERROR_CONNECT:
                    #ifdef DEBUG
                      Serial.println("Connect error,\t");
                    #endif
                    break;
        case DHTLIB_ERROR_ACK_L:
                    #ifdef DEBUG
                      Serial.println("Ack Low error,\t");
                    #endif
                    break;
        case DHTLIB_ERROR_ACK_H:
                    #ifdef DEBUG
                      Serial.println("Ack High error,\t");
                    #endif
                    break;
        default:
                    #ifdef DEBUG
                      Serial.println("Unknown error,\t");
                    #endif
                    break;
        }
    
      //Get temperature and humidity
      float temperature = 0;
      float humidity = 0;
      if (dht22Result == DHTLIB_OK)
        {
        temperature = DHT.temperature;
        humidity = DHT.humidity;
        }
    
      //Get power before luminosity to use real voltage
      float realVoltage = getVoltage() / 100.0;
      int batteryPcnt = realVoltage * 100 / 3.0;
      if (batteryPcnt > 100) {batteryPcnt = 100;}
      int lux = computeIlluminance(realVoltage);
    
      //Power off
      powerOffPeripherals();
    
      //Send data to gateway
      gw.send(msgHum.set(humidity, 1));
      gw.send(msgTemp.set(temperature, 1));
      gw.send(msgLum.set(lux));
      gw.send(msgVolt.set(realVoltage, 2));
      gw.sendBatteryLevel(batteryPcnt);
    
      //Print debug
      #ifdef DEBUG
        Serial.print(temperature, 1);
        Serial.print(" degC");
        Serial.print("   ");
        Serial.print(humidity, 1);
        Serial.print(" %");
        Serial.print("   ");
        Serial.print(lux);
        Serial.print(" lx");
        Serial.print("   ");
        Serial.print(realVoltage);
        Serial.print(" v");
        int duration = millis() - startTime;
        Serial.print("   ");
        Serial.print("["); Serial.print(duration, DEC); Serial.println(" ms]");
        Serial.flush();
      #endif
    
      //Sleep
      gw.sleep(SLEEP_TIME);
      }
    
    /**************************************************************************************/
    /* Allows to compute illuminance (in LUX) from LIGHT_SENSOR_ANALOG_PIN.               */
    /**************************************************************************************/
    int computeIlluminance(float realVoltage)
      {
      //Get luminosity
      int luminosity = analogRead(LIGHT_SENSOR_ANALOG_PIN);
      //Calculating the voltage in the input of the ADC
      double voltage = realVoltage * ((double)luminosity / 1024.0);
      //Calculating the resistance of the photoresistor in the voltage divider
      double resistance = (10.0 * realVoltage) / voltage - 10.0;
      //Calculating the intensity of light in lux and return it
      int illuminance = 255.84 * pow(resistance, -10/9);
      return illuminance;
      }
    
    /**************************************************************************************/
    /* Allows to get the real Vcc (return value * 100).                                   */
    /**************************************************************************************/
    int getVoltage()
      {
      const long InternalReferenceVoltage = 1056L;
      ADMUX = (0<<REFS1) | (1<<REFS0) | (0<<ADLAR) | (1<<MUX3) | (1<<MUX2) | (1<<MUX1) | (0<<MUX0);
      delay(50);  // Let mux settle a little to get a more stable A/D conversion
      //Start a conversion  
      ADCSRA |= _BV( ADSC );
      //Wait for it to complete
      while (((ADCSRA & (1<<ADSC)) != 0));
      //Scale the value
      int result = (((InternalReferenceVoltage * 1023L) / ADC) + 5L) / 10L;
      return result;
      }
    
    /**************************************************************************************/
    /* Allows to power ON peripherals.                                                    */
    /**************************************************************************************/
    void powerOnPeripherals()
      {
      //Power-up
      pinMode (POWER_PIN, OUTPUT);
      digitalWrite (POWER_PIN, HIGH);
      delay(1);
      }
    
    /**************************************************************************************/
    /* Allows to power OFF peripherals.                                                   */
    /**************************************************************************************/
    void powerOffPeripherals()
      {
      //Power off
      digitalWrite (HUMIDITY_SENSOR_DIGITAL_PIN, LOW);
      digitalWrite (POWER_PIN, LOW);
      pinMode (HUMIDITY_SENSOR_DIGITAL_PIN, INPUT);
      pinMode (POWER_PIN, INPUT);
      }
    

    Hope it helps !

    David.



  • @carlierd Thank you very much. I really like your comment on the top 👍



  • Progress!

    http://imgur.com/zRvXvrN
    http://imgur.com/KpB7daz

    A question though. To get to this point, I copied the pictures posted above, but where do I now add these resistors?

    http://imgur.com/6mKJcgE

    Also, if I want to add a 2AA battery cage, where do I connect the red and black wires to?

    Thanks! And sorry for the newb questions!


  • Hardware Contributor

    @rsachoc What you show are not resistors, they look like capacitors. 104 means 100nF (I think). Can you measure their value ?



  • @carlierd Are you running your Atmega at 1Mhz, Because I tried to use your sketch and i am getting "Checksum Error".



  • @GertSanders indeed they are capacitors (silly me) - apparently they are 0.1uf - the black one I have already soldered is 4.7uf



  • @ar91 said:

    @carlierd Are you running your Atmega at 1Mhz, Because I tried to use your sketch and i am getting "Checksum Error".

    No, I am working at 8 MHz (internal). Perhaps your DHT is out of order ? You try with another one ?

    David.



  • Bump, can anyone advise on how I got about finding out where I need to solder the resistors on? So far I've just soldered the 4.7uf capacitor, as can be seen from the pics. But I'm struggling to find out where I need to solder the other capacitor's I have (from the BOM).


  • Hardware Contributor

    @rsachoc C1,C2,C3 are clearly marked at top layer silkscreen. You'll see them in the middle of the uC socket if you look at your 2nd picture in you last post above. C5 is visible next to the 4.7u cap, in the 3rd picture of my first post in this thread.


  • Hardware Contributor

    @rsachoc said:

    Also, if I want to add a 2AA battery cage, where do I connect the red and black wires to?

    First picture in first post of this thread should be enough. Connect (+) to Vcc and (-) to Gnd.


Log in to reply
 

402
Online

7.4k
Users

8.2k
Topics

88.9k
Posts

Looks like your connection to MySensors Forum was lost, please wait while we try to reconnect.