 
					
						
					
				
				
					@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");
   } 
  
}