/* DHT22-5E-2.ino : Lecture des donnees a partir du capteur DHT22, Affichage des donnees lues Transcodage pour la transmission Sketchs de base issus de https://github.com/panStamp/panstamp/wiki et de panstamp - Daniel Berenger : BasicRadio, BasicBeacon, DHT22... Essai de transcodage a partir de http://www.varesano.net/blog/fabio/sending-float-variables-over-serial-without-loss-precision-arduino-and-processing Modifications - adaptations pour les tests : Philippe Redoutey, janvier 2015 Raccordement du DHT22 : Connectez la pin 1 du capteur (gauche vu de face) au +5V. NOTE: si vous utilisez une carte qui fonctionne en 3,3v panstamp, arduino Due... pour les niveaux logiques, connectez la pin 1 au 3,3v au lieu du 5v. Connectez pin 2 du capteur a la DHTPIN definie. Connectez la pin 4 (droite vu de face) a la masse (GND). Connectez une resistance de 10 a 27Kohms entre la pin 2 (data) et la pin l (alimentation du capteur). */ // permet d'envoyer les informations vers le moniteur serie #include "HardwareSerial.h" // Bibliotheque pour le DHT #include "DHT.h" // Definition des Numeros de pin utilisees // NB : il s'agit du raccordement existant sur la carte Battery Board int Sensor_ENA = 15; // alimentation du capteur #define DHTPIN 16 // connexion pour les datas #define LED 4 // pour les test, pour verifier le passage // dans les boucles // Lignes a activer ou desactiver en fonction du capteur utilise //#define DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) // Initialisation du capteur; attention, valable pour un Arduino "normal" a 16MHz DHT dht(DHTPIN, DHTTYPE); // NOTE: For working with a faster chip, like an Arduino Due or Teensy, you // might need to increase the threshold for cycle counts considered a 1 or 0. // You can do this by passing a 3rd parameter for this threshold. It's a bit // of fiddling to find the right value, but in general the faster the CPU the // higher the value. The default for a 16mhz AVR is a value of 6. For an // Arduino Due that runs at 84mhz a value of 30 works. // Example to initialize DHT sensor for Arduino Due: //DHT dht(DHTPIN, DHTTYPE, 30); #define RFCHANNEL 0 // Let's use channel 0 #define SYNCWORD1 0xB5 // Synchronization word, high byte #define SYNCWORD0 0x47 // Synchronization word, low byte #define SOURCE_ADDR 11 // Device address; il s'agit de l'adresse // de ce module lorsqu'il emet. CCPACKET packet; // on initialise le buffer pour l'emission void setup() { Serial.begin(9600); Serial.println("DHTxx + emission radio test!"); // on initialise les sorties utilisees pinMode(Sensor_ENA, OUTPUT); digitalWrite(Sensor_ENA, HIGH); pinMode(LED, OUTPUT); dht.begin(); digitalWrite(LED, LOW); // on initialise la partie radio du panStamp panstamp.radio.setChannel(RFCHANNEL); panstamp.radio.setSyncWord(SYNCWORD1, SYNCWORD0); panstamp.radio.setDevAddress(SOURCE_ADDR); panstamp.radio.setCCregs(); panstamp.setHighTxPower(); // on met en HighPower pour ameliorer la portee // pour l'application prevu mais c'est au // detriment de la consommation packet.length = 5; // le packet fera 5 octets : l'adresse d'emission // et les 2 x 2 octets pour les valeurs } void loop() { // Attention, il faut attendre quelques secondes entre 2 mesures. // car il s'agit d'un capteur tres lent ! // La lecture des donnees prend environ 250 millisecondes digitalWrite(Sensor_ENA, HIGH); // on commande l'alimentation pour être // sur que le DHT22 est bien alimente apres // être sortie du mode sommeil delay(2000); digitalWrite(LED, HIGH); // pour les tests // Lecture hygrometrie en % float hum1 = dht.readHumidity(); // Lecture temperature en degres Celsius float temp1 = dht.readTemperature(); digitalWrite(LED, LOW); // pour les tests // Verification de la bonne lecture des donnees // sinon, sortie directe pour relecture immediate if (isnan(hum1) || isnan(temp1)) { Serial.println("Failed to read from DHT sensor!"); return; } // Affichagege sur le moniteur serie pour les tests Serial.println("Mesures directes et envoyees"); Serial.print("Humidite: "); Serial.print(hum1,1); // ,1 pour n'afficher qu'une decimale Serial.print(" %\t"); // \t = tabulation Serial.print("Temperature: "); Serial.print(temp1,1); Serial.print(" °C\t"); Serial.println(); // Faute de savoir transcoder le float, je me limite à 1 decimale // et je transforme en Int pour la transmission int IntHum1 = (hum1 * 10); int IntTemp1 = (temp1 * 10); // Serial.print(IntHum1); // pour les tests // Serial.print(" "); // Serial.println(IntTemp1); // On convertit la valeur de l'int en un tableau de 2 octets byte * BufOutHum = (byte *) &IntHum1; byte * BufOutTemp = (byte *) &IntTemp1; // on prépare la transmission de l'hygrometrie byte OctetOut1 = BufOutHum[0]; byte OctetOut2 = BufOutHum[1]; // On prépare la transmission de la temperature byte OctetOut3 = BufOutTemp[0]; byte OctetOut4 = BufOutTemp[1]; // on prepare le buffer d'emission packet.data[0] = SOURCE_ADDR; packet.data[1] = OctetOut1; packet.data[2] = OctetOut2; packet.data[3] = OctetOut3; packet.data[4] = OctetOut4; // et on emet panstamp.radio.sendData(packet); delay(100); // ce délai est necessaire pour garantir que // l'emission est terminee avenat de passer // de panStamp en sommeil // digitalWrite(LED, LOW); // pour les tests // on met le panstamp en sommeil pour xx secondes panstamp.sleepSec(5); } // fin du void loop