entre temps j'ai rajouter le sleep mode pour le DHT22.
voici le code.
Code : Tout sélectionner
// Enable debug prints to serial monitor
#define MY_DEBUG
// Enable and select radio type attached
#define MY_RADIO_NRF24
//#define MY_RADIO_NRF5_ESB
//#define MY_RADIO_RFM69
//#define MY_RADIO_RFM95
// Enable repeater functionality for this node
#define MY_REPEATER_FEATURE
#include <SPI.h>
#include <MySensors.h>
#include <DHT.h>
//zone declarative pour buzzer
#define CHILD_ID_RELAY 2
#define RELAY_PIN 4 // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
#define NUMBER_OF_RELAYS 1 // Total number of attached relays
#define RELAY_ON 1 // GPIO value to write to turn on attached relay
#define RELAY_OFF 0 // GPIO value to write to turn off attached relay
//zone declarative pour la sonde DHT22
#define CHILD_ID_TEMP 0
#define CHILD_ID_HUM 1
#define SLEEP_NODE true // Mettre à True pour activer la mise en sommeil (Sleep Mode) / True to activate Sleep Mode
unsigned long SLEEP_TIME = 30 * 1000; // Temps de mise en sommeil (en ms) / Sleep time between reads (in milliseconds)
#define DHTPIN 3 // Broche sur laquelle est branché le DHT / what pin we're connected to
#define DHTTYPE DHT22 // DHT 22 (AM2302), DHT11
float lastTemp;
float lastHum;
boolean metric = true;
MyMessage msgHum(CHILD_ID_HUM, V_HUM);
MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
void before()
{
for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
// Then set relay pins in output mode
pinMode(pin, OUTPUT);
// Set relay to last known state (using eeprom storage)
digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF);
}
}
void setup()
{
}
void presentation()
{
// Présenttion du sketch / Send the sketch version information to the gateway and Controller
sendSketchInfo("Sonde Temp/Hum DHT22 + RELAY", "1.0");
// Déclaration des capteurs attachés au noeud
present(CHILD_ID_TEMP, S_TEMP);
present(CHILD_ID_HUM, S_HUM);
present(CHILD_ID_RELAY, S_BINARY);
}
void loop()
{
DHT dht(DHTPIN, DHTTYPE,3); // Creation d'un objet dht dans la loop sinon les valeurs ne sont pas mesurées au réveil
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
if (isnan(temperature)) {
Serial.println("Impossible de lire la temperature sur le DHT");
} else {
if (temperature != lastTemp) {
lastTemp = temperature;
if (!metric) {
temperature = dht.readTemperature(true);
}
Serial.print("T: ");
Serial.print(temperature);
Serial.print(" | H: ");
Serial.println(humidity);
send(msgTemp.set(temperature, 1));
send(msgHum.set(humidity, 1));
} else {
Serial.println("Temperature identique => on force l'envoi");
Serial.print("T: ");
Serial.print(temperature);
Serial.print(" | H: ");
Serial.println(humidity);
send(msgTemp.set(temperature, 1));
send(msgHum.set(humidity, 1));
}
}
if (SLEEP_NODE) {
Serial.println("Sleep");
sleep(SLEEP_TIME);
} else {
delay (SLEEP_TIME);
}
}
void receive(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
state = message.getBool();
digitalWrite(RELAY_PIN, state ? RELAY_ON : RELAY_OFF);
// Store state in eeprom
saveState(CHILD_ID_RELAY, state);
// Write some debug info
Serial.print("Incoming change for sensor:");
Serial.print(message.sensor);
Serial.print(", New status: ");
Serial.println(message.getBool());
}
}