@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.