Enregistrement de la température, de l'humidité et du point de rosée avec un Imp électrique
L' Electric Imp est un appareil étonnant pour IoT et son intégration avec Ubidots permet de créer très simplement des graphiques et des alertes SMS/E-mail en quelques minutes. Dans ce didacticiel Electric Imp, nous vous apprendrons à utiliser la carte de dérivation Electric Imp avec un capteur DHT11 pour mesurer la température et l'humidité relative, puis à calculer le point de rosée à l'aide du moteur mathématique Ubidots
Le point de rosée peut être utilisé comme indice de la perception humaine du confort par rapport à la météo ; un point de rosée compris entre 13 et 16 °C (55 et 59 °F) vous met à l'aise, mais un point de rosée supérieur à 21 °C (70 °F) vous fera sentir trop chaud car l'air aurait trop d'humidité et votre corps je n'ai pas pu me calmer :
Point de rosée | Perception humaine |
24-26°C / 75-80°F | Extrêmement inconfortable, oppressant |
21-24°C / 0-74°F | Très humide, assez inconfortable |
18-21°C / 65-69°F | Un peu inconfortable pour la plupart des personnes situées au bord supérieur |
16-18°C / 60-64°F | OK pour la plupart, mais tous perçoivent l'humidité au bord supérieur |
13-16°C / 55-59°F | Confortable |
10-12°C / 50-54°F | Très confortable |
Moins de 10°C / 50-54°F | Très confortable |
Moins de 10°C / Moins de 50°F | Un peu sec |
Moins de 10°C / Moins de 50°F | Heureusement, il existe une fonction linéaire pour calculer le point de rosée en fonction de la température et de l'humidité relative. |
Matériels
- Un diablotin
- Une carte de dérivation de diablotin électrique
- Trois fils femelle à femelle
- résistance 10k
- Capteur d'humidité et de température DHT11
Câblage
Voici comment le capteur DHT11 est câblé à votre carte Electric Imp :
Code
Il est temps de coder ! lorsque vous travaillez avec Electric Imp, vous aurez besoin de deux sections de code : une pour l'appareil et une autre pour l'agent. Voici le code de l'appareil (un peu long car il a la classe pour gérer le DHT11) :
const SPICLK = 937,5 ; // Classe pour lire le capteur de température/humidité DHT11 // Ces capteurs utilisent un protocole propriétaire à un fil. Le diablotin // émule ce protocole avec SPI. // À utiliser : // - reliez MOSI à MISO avec une résistance de 10k // - reliez MISO à la ligne de données sur la classe de capteur DHT11 { static STARTTIME_LOW = 0,001000 ; // Temps bas de 1 ms pour le démarrage statique STARTTIME_HIGH = 0,000020 ; // Temps maximum de 20 us min pour le démarrage statique STARTTIME_SENSOR = 0.000080 ; // 80 us bas / 80 us haut "ACK" du capteur sur START statique MARKTIME = 0,000050 ; // 50 us d'impulsion faible entre 0 ou 1 marque ZÉRO statique = 0,000026 ; // 26 us de haut pour "0" statique ONE = 0,000075 ; // 70 us de haut pour "1" spi = null; clkspeed = nul ; temps de bit = nul ; temps d'octet = nul ; start_low_bits = nul ; start_low_bytes = nul ; start_high_bits = nul ; start_high_bytes = nul ; start_ack_bits = nul ; start_ack_bytes = nul ; mark_bits = nul ; mark_bytes = nul ; zero_bits = nul ; zero_bytes = nul ; one_bits = nul ; one_bytes = nul ; // Constructeur de classe // Entrée : // _spi : un périphérique SPI préconfiguré (par exemple spi257) // _clkspeed : la vitesse à laquelle le SPI a été configuré pour s'exécuter // Retour : (Aucun) constructor(_spi, _clkspeed) { this.spi = _spi; this.clkspeed = _clkspeed; bittime = 1,0 / (clkspeed * 1000) ; temps d'octet = 8,0 * temps de bit ; start_low_bits = STARTTIME_LOW / bittime ; start_low_bytes = (start_low_bits / 8); start_high_bits = STARTTIME_HIGH / bittime ; start_high_bytes = (start_high_bits / 8); start_ack_bits = STARTTIME_SENSOR / bittime ; start_ack_bytes = (start_ack_bits / 8); mark_bits = MARKTIME / bittime ; mark_bytes = (mark_bits / 8); zero_bits = ZÉRO / bittime ; zero_bytes = (zero_bits / 8); one_bits = UN / bittime ; un_octets = (un_bits / 8); } // fonction d'assistance // étant donné un long blob, recherche les temps entre les transitions et analyse // les valeurs de température et d'humidité. Suppose une valeur de retour de 40 bits (16 humidité / 16 temp / 8 somme de contrôle) // Entrée : // hexblob (blob de longueur arbitraire) // Retour : // table contenant : // "rh" : humidité relative (float) / / "temp": température en Celsius (float) // si la lecture échoue, rh et temp renverront 0 function parse(hexblob) { local laststate = 0; local lastbitidx = 0 ; gotack local = faux ; rawidx local = 0 ; résultat local = blob(5); // Humidité sur 2 octets, température sur 2 octets, somme de contrôle sur 1 octet local humide = 0 ; température locale = 0 ; // parcourt chaque bit de chaque octet du signal renvoyé for (local byte = 0; byte < hexblob.len(); byte++) { for (local bit = 7; bit >= 0; bit--) { local thisbit = (hexblob[octet] & (0x01 << bit)) ? 1:0 ; if (thisbit != laststate) { if (thisbit) { // transition bas-haut ; regardez pour voir combien de temps il est haut laststate = 1; lastbitidx = (8 * octet) + (7 bits); } else { // transition haut-bas ; dernier état = 0 ; idx local = (8 * octet) + (7 bits) ; local hightime = (idx - lastbitidx) * bittime ; // nous avons maintenant une information valide. Déterminez de quel symbole il s’agit. octet de résultat local = (rawidx / 8); bit de résultat local = 7 - (rawidx % 8) ; //server.log(format("bit %d de l'octet %d",resultbit, resultbyte)); if (hightime < ZERO) { // c'est un zéro if (gotack) { // n'enregistre aucune donnée avant que l'ACK ne soit vu result[resultbyte] = result[resultbyte] & ~(0x01 << resultbit); rawidx++; } } else if (hightime < ONE) { // ceci en est un if (gotack) { result[resultbyte] = result[resultbyte] | (0x01 << bit de résultat); rawidx++; } } else { // ceci est un START ACK gotack = true; } } } } } //server.log(format("parsed : 0x %02x%02x %02x%02x %02x",result[0],result[1],result[2],result[3],result [4])); humide = (résultat[0] * 1,0) + (résultat[1] / 1000,0) ; if (result[2] & 0x80) { // température négative result[2] = ((~result[2]) + 1) & 0xff; } temp = (résultat[2] * 1,0) + (résultat[3] / 1000,0); if (((result[0] + result[1] + result[2] + result[3]) & 0xff) != result[4]) { return {"rh":0,"temp":0}; } else { return {"rh":humide,"temp":temp}; } } // lecture du capteur // Entrée : (aucun) // Retour : // tableau contenant : // "rh" : humidité relative (float) // "temp" : température en celsius (float) // si lu échoue, rh et temp renverront 0 function read() { local bloblen = start_low_bytes + start_high_bytes + (40 * (mark_bytes + one_bytes)); local startblob = blob(bloblen); pour (local i = 0; i < start_low_bytes; i++) { startblob.writen(0x00,'b'); } for (local j = start_low_bytes; j <bloblen; j++) { startblob.writen(0xff,'b'); } //server.log(format("Envoi de %d octets", startblob.len())); résultat local = spi.writeread(startblob); return analyser (résultat); } } rele <-hardware.pin9; spi <- hardware.spi257; while(1){ clkspeed <- spi.configure(MSB_FIRST, SPICLK); dht11 <- DHT11(spi, clkspeed); données <- dht11.read(); server.log(format("Humidité relative : %0.1f",data.rh)+" %"); server.log(format("Température : %0.1f C",data.temp)); agent.send("temp",data.temp); imp.sleep(1); }
Merci à Thomas Byrne d'avoir fourni la classe permettant de gérer le capteur DHT11 dans Github .
Comme vous pouvez le voir, le code de l'agent est très simple, n'oubliez pas de mettre votre propre jeton d'authentification et votre propre ID de variable dans l'appel HTTP :
device.on("temp", function(value) { server.log("Essayer de publier la valeur sur Ubi :"); server.log(value); local headers = { "Content-Type": "application/json ", "X-Auth-Token": "NBbF3PWPxWc2IaO40aXOKnhIu8tOv92rYN3ibiEc7Jh6GV3KZUUCHtXuNz7Y" }; // Remplacez le jeton par votre URL locale = "http: ubidots .com/api/v1.6/variables/53d2beb37625424630. 223dac/valeurs"; / / Remplacez l'ID de variable par le vôtre chaîne locale = {"value": value}; local request = http.post(url, headers, http.jsonencode(string));
Créez une variable synthétique sur Ubidots .
Tout comme vous ajouteriez une nouvelle variable, allez dans « Sources » -> « Electric Imp (votre nom de source de données) » -> « Ajouter une nouvelle variable » :
Entrez maintenant cette équation pour calculer la valeur du point de rosée :
Voici à quoi cela devrait ressembler :
Vous devriez maintenant commencer à voir les données de point de rosée mises à jour à chaque fois que votre Diablotin transmet les données de température et d'humidité à Ubidots !
Conclusion
Dans ce projet, nous avons pu connecter un Diablotin à Ubidots , mesurant et calculant des variables physiques pour mieux comprendre notre environnement. Vous pouvez explorer davantage de choses, comme créer des alertes lorsque le point de rosée est trop élevé, ou créer des graphiques partageables comme ceux du début de cet article.
N'oubliez pas de consulter certains de nos derniers articles :
- Le pouvoir de l’éducation par la création
- Création d'un moniteur système multiplateforme avec Ubidots
Si vous êtes nouveau sur Ubidots , cliquez ici pour commencer !