@gohan
you can check i add module rain
// Example sketch för a "light switch" where you can control light or something
// else from both vera and a local physical button (connected between digital
// pin 3 and GND).
// This node also works as a repeader for other nodes
// Enable debug prints to serial monitor
#define MY_DEBUG
// Enable and select radio type attached
#define MY_RADIO_NRF24
//#define MY_RADIO_RFM69
#define MY_NODE_ID 2
#define MY_PARENT_NODE_ID 0
#define MY_PARENT_NODE_IS_STATIC
#include <MySensors.h>
#include <SPI.h>
#include <DHT.h>
unsigned long SLEEP_TIME = 120000; // Sleep time between reports (in milliseconds)
//pin sensori
#define PIR_PIN 6 // The digital input you attached your motion sensor. (Only 2 and 3 generates interrupt!)
#define HUMIDITY_TEMPERATURE_PIN 3 // sensore temperatura umidita
#define RELAY_PIN 4 // relay pin
#define DIGITAL_INPUT_RAIN_SENSOR 5
int BATTERY_SENSE_PIN = A1; // Pin carica batteria o pannello solare
int FOTORESIST_SENSE_PIN = A2; // Pin fotoresistenza
//interupt per sleep arduino
#define INTERRUPT PIR_PIN-6 // Usually the interrupt = pin -2 (on uno/nano anyway)
#define INTERRUPT DIGITAL_INPUT_RAIN_SENSOR-2
//id per vera
#define CHILD_ID_RELE 1 // Id relay
#define CHILD_ID_HUM 2 // id temperatura
#define CHILD_ID_TEMP 3 // id umidita
#define CHILD_ID_PIR 4 // Id pir
#define CHILD_ID_LIGHT 5 // Id luminosita (fotoresistenza)
#define CHILD_ID_RAIN 6
//definizione per nodo vera
#define NODE_ID 10
#define SN "meteo station"
#define SV "1.4"
//variabili
bool state_relay; //stato relay
float batt_valore; //dichiaro la variabile valore che memorizzerà il valore della batteria dal pin analogico
float batt_volt; //volt batteria
float batt_charged_percent; //percentuale carica batteria
float last_batt_charged_percent; //percentuale carica batteria precedente
float batt_min_voltage = 0.5; //tensione minima batteria
float batt_max_voltage = 5; //tensione massima batteria
float fotoresistenza_valore; //dichiaro la variabile valore che memorizzerà il valore della fotoresistenza dal pin analogico
float last_fotoresistenza_valore; //dichiaro la variabile valore precedente
int lastRainValue = -1;
int nRainVal;
boolean bIsRaining = false;
String strRaining = "NO";
int lux_vera; //valore luminosita da inviare a vera
// sensore temperatura umidita
DHT dht_int;
float lastTemp_int = -1;
float lastHum_int = -1;
boolean metric = true;
MyMessage msgRelay(CHILD_ID_RELE,V_LIGHT);
MyMessage msgHum(CHILD_ID_HUM, V_HUM);
MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
MyMessage msgPir(CHILD_ID_PIR, V_TRIPPED);
MyMessage msgLux(CHILD_ID_LIGHT, V_LIGHT_LEVEL);
MyMessage msgRain(CHILD_ID_RAIN, V_TRIPPED);
void setup()
{
metric = getControllerConfig().isMetric;
// Then set relay pins in output mode
pinMode(RELAY_PIN, OUTPUT);
pinMode(DIGITAL_INPUT_RAIN_SENSOR, INPUT);
//PIR
pinMode(PIR_PIN, INPUT);
state_relay = 0;
//GestisciRelay();
digitalWrite(RELAY_PIN, LOW);
send(msgRelay.set(state_relay));
}
void presentation()
{
sendSketchInfo(SN, SV);
//Sensore umidita temperatura
dht_int.setup(HUMIDITY_TEMPERATURE_PIN);
present(CHILD_ID_RELE, S_LIGHT); //light vera
present(CHILD_ID_HUM, S_HUM); //umidity vera
present(CHILD_ID_TEMP, S_TEMP); // temp vera
present(CHILD_ID_PIR, S_MOTION); // motion vera
present(CHILD_ID_LIGHT, S_LIGHT_LEVEL); //light level (fotoresistenza)
present(CHILD_ID_RAIN, S_MOTION, "WS Rain");
}
void loop()
{
//sensore temperatura umidita
delay(dht_int.getMinimumSamplingPeriod());
float temperature_int = dht_int.getTemperature();
if (isnan(temperature_int))
{
lastTemp_int = -1;
Serial.println("Failed reading temperature from DHT");
}
else if (temperature_int != lastTemp_int)
{
lastTemp_int = temperature_int;
if (!metric)
{
temperature_int = dht_int.toFahrenheit(temperature_int);
}
send(msgTemp.set(temperature_int, 1));
Serial.print("T int: ");
Serial.println(temperature_int);
}
float humidity_int = dht_int.getHumidity();
if (isnan(humidity_int))
{
lastHum_int = -1;
Serial.println("Failed reading humidity from DHT");
}
else if (humidity_int != lastHum_int)
{
lastHum_int = humidity_int;
send(msgHum.set(humidity_int, 1));
Serial.print("H int: ");
Serial.println(humidity_int);
}
//sensore temperatura umidita
//fotoresistenza
for(int i=0;i<150;i++)
{
fotoresistenza_valore += analogRead(FOTORESIST_SENSE_PIN); //read the input voltage from battery or solar panel
delay(2);
}
fotoresistenza_valore = fotoresistenza_valore / 150;
Serial.print ("fotoresistenza: ");
Serial.println(fotoresistenza_valore);
if (fotoresistenza_valore != last_fotoresistenza_valore)
{
lux_vera = (int) fotoresistenza_valore;
send(msgLux.set(lux_vera));
last_fotoresistenza_valore = fotoresistenza_valore;
}
//fotoresistenza
//pir relay
// Read digital motion value
boolean tripped = digitalRead(PIR_PIN) == HIGH;
Serial.println("pir:");
Serial.println(tripped);
send(msgPir.set(tripped?"1":"0")); // Send tripped value to gw
//accende la luce con il buio
if (fotoresistenza_valore < 200) //poca luce
{
if (tripped == 1)
{
state_relay = 1;
}
else
{
state_relay = 0;
}
}
//accende la luce con il buio
GestisciRelay();
//pir relay
//battery
for(int i=0;i<150;i++)
{
batt_valore += analogRead(BATTERY_SENSE_PIN); //read the input voltage from battery or solar panel
delay(2);
}
batt_valore = batt_valore / 150;
Serial.print ("batt_valore: ");
Serial.println(batt_valore);
batt_volt = (batt_valore / 1024) * batt_max_voltage;
Serial.print ("batt_volt: ");
Serial.println(batt_volt);
////////////////////////////////////////////////
//The map() function uses integer math so will not generate fractions
// so I multiply battery voltage with 10 to convert float into a intiger value
// when battery voltage is 6.0volt it is totally discharged ( 6*10 =60)
// when battery voltage is 7.2volt it is fully charged (7.2*10=72)
// 6.0v =0% and 7.2v =100%
//batt_charged_percent = batt_volt*10;
//batt_charged_percent = map(batt_volt*10, 60 , 72, 0, 100);
batt_charged_percent = batt_volt * 10;
batt_charged_percent = map(batt_volt * 10, batt_min_voltage * 10 , batt_max_voltage * 10, 0, 100);
//batt_charged_percent = (batt_volt / batt_max_voltage) * 100;
Serial.print ("batt_charged_percent: ");
Serial.println(batt_charged_percent);
if (last_batt_charged_percent != batt_charged_percent)
{
sendBatteryLevel(batt_charged_percent);
last_batt_charged_percent = batt_charged_percent;
}
bIsRaining = !(digitalRead(DIGITAL_INPUT_RAIN_SENSOR));
if(bIsRaining){
strRaining = "YES";
}
else{
strRaining = "NO";
}
//Serial.print("Raining?: ");
//Serial.print(strRaining);
//Serial.print("\t Moisture Level: ");
//Serial.println(nRainVal);
//http://henrysbench.capnfatz.com/henrys-bench/arduino-sensors-and-input/arduino-rain-sensor-module-guide-and-tutorial/
send(msgRain.set(bIsRaining, 1));
//battery
delay(50);
// Sleep until interrupt comes in on motion sensor. Send update every two minute.
sleep(INTERRUPT, CHANGE, SLEEP_TIME);
}
void incomingMessage(const MyMessage &message) {
// We only expect one type of message from controller. But we better check anyway.
if (message.isAck()) {
Serial.println("This is an ack from gateway");
}
if (message.type == V_LIGHT) {
// Change relay state_relay
state_relay = message.getBool();
GestisciRelay();
// Write some debug info
Serial.print("Incoming change for sensor:");
Serial.print(message.sensor);
Serial.print(", New status: ");
Serial.println(message.getBool());
}
}
void GestisciRelay()
{
//Serial.print(" GestisciRelay state_relay:");
//Serial.println(state_relay);
if (state_relay == 0)
{
digitalWrite(RELAY_PIN, LOW);
send(msgRelay.set(state_relay));
//Serial.println("SPENTO RELAY");
}
else
{
digitalWrite(RELAY_PIN, HIGH);
send(msgRelay.set(state_relay));
//Serial.println("ACCESO RELAY");
}
}