#include #include #include #include #include #include #include "Akeru.h" #include "DHT11.h" #define DELAY_BETWEEN_EACH_SEND 20000 DHT11 dht11(8); //lecture les donnees retournées par le capteur sur la broche 8 SoftwareSerial akeru(5, 4); // RX, TX du module Akeru struct capteur { float temp; float humi; }; // Compteur de sommeil volatile int sleep_count = 0; // Temps de sommeil en minutes. const int interval = 15; // Temps d'attente dans le sleep en multiple de 8 secondes. const int sleep_total = (interval*60)/8; // Flag pour le Watchdog. volatile boolean f_wdt=1; // pour la mise en veille. volatile static int i = 0; // Gestion du mode veille de la carte void goToSleep() { // Réglage du mode veille. set_sleep_mode(SLEEP_MODE_PWR_DOWN); // On active le mode veille. sleep_enable(); // On entre en mode veille. sleep_mode(); // Désactivation du mode veille sleep_disable(); } void watchdogOn() { // On initialise le watchdog. MCUSR = MCUSR & B11110111; WDTCSR = WDTCSR | B00011000; WDTCSR = B00100001; WDTCSR = WDTCSR | B01000000; MCUSR = MCUSR & B11110111; } // Interruption pour le mode sleep. ISR(WDT_vect) { sleep_count ++; } // Récuppération valeurs du capteur. void mesure_capteur() { int err; float temp, humi; if((err=dht11.read(humi, temp))==0) //lecture des donnees d'humidité et de temperature, si l'err=0, la trame lut ne contient pas d'erreur { Serial.print("temperature:"); Serial.print(temp); Serial.print(" humidity:"); Serial.print(humi); } else // si la trame recu contient des erreurs on l'affiche dans le terminal { Serial.println(); Serial.print("Error No :"); Serial.print(err); } capteur data = {temp, humi}; Akeru.send(&data, sizeof(capteur));// envoie des données sur actobord via le protocole sigfox delay(DELAY_BETWEEN_EACH_SEND); } // Initialisation de la carte void setup(void) { watchdogOn(); // On desactive l'ADC. ADCSRA = ADCSRA & B01111111; // On désactive les comparateurs analogiques. ACSR = B10000000; // On desactive les entrée analogique et numérique sauf A0. DIDR0 = DIDR0 | B00111110; //initialisation du module Akeru akeru.begin(9600); akeru.write((uint8_t)'\0'); akeru.write((uint8_t)';'); while(akeru.available() < 3); akeru.read(); //'K' akeru.read(); //'O' akeru.read(); //';' Akeru.begin(); } // Fonction main. void loop(void) { //on envoie les donnees de temperature et d'humidité mesure_capteur(); //on passe en mode veille goToSleep(); // On remet le compteur du mode sleep à 0. sleep_count = 0; }