Ubidots

Enregistrement de la température, de l'humidité et du point de rosée par impulsion électrique

Luis Duarte
· 6 min de lecture
Envoyer par courriel

L' Electric Imp est un appareil exceptionnel pour IoT . Son intégration avec Ubidots simplifie grandement la création de graphiques et d'alertes SMS/e-mail en quelques minutes. Ce tutoriel vous apprendra à utiliser la carte d'extension Electric Imp avec un capteur DHT11 pour mesurer la température et l'humidité relative, puis à calculer le point de rosée grâce au Ubidots .

point de rosée

Le point de rosée peut servir d'indice de la perception humaine du confort en fonction des conditions météorologiques ; un point de rosée entre 13 et 16 °C (55 et 59 °F) procure une sensation de confort, mais un point de rosée supérieur à 21 °C (70 °F) provoque une sensation de chaleur excessive car l'air est trop humide et le corps ne peut pas se refroidir

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 gens au edge supérieur
16-18°C / 60-64°F Ça convient à la plupart, mais tous perçoivent l'humidité à edge supérieure
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

électrique

  • Carte de dérivation Electric Imp

panneau d'affichage

  • Trois fils femelles à femelles

fils femellesjpg

  • résistance de 10 kΩ

résistance de 10 kΩ

  • Capteur d'humidité et de température DHT11

dh11

Câblage

Voici comment le capteur DHT11 est câblé à votre carte Electric Imp :dht11_bb

Code

À vos claviers ! Pour utiliser Electric imp, vous aurez besoin de deux sections de code : une pour le périphérique et une autre pour l’agent. Voici le code du périphérique (un peu long car il inclut la classe de gestion du DHT11) :

const SPICLK = 937.5; // Classe pour lire le capteur de température/humidité DHT11 // Ces capteurs utilisent un protocole propriétaire à un fil. L'implémentation // émule ce protocole avec SPI. // Utilisation : // - relier MOSI à MISO avec une résistance de 10 kΩ // - relier MISO à la ligne de données du capteur class DHT11 { static STARTTIME_LOW = 0.001000; // Durée de l'état bas de 1 ms au démarrage static STARTTIME_HIGH = 0.000020; // Durée minimale de l'état haut de 20 µs au démarrage static STARTTIME_SENSOR = 0.000080; // 80 µs à l'état bas / 80 µs à l'état haut « ACK » du capteur au démarrage static MARKTIME = 0.000050; // Impulsion basse de 50 µs entre les marques 0 et 1 static ZERO = 0.000026; // 26 µs niveau haut pour « 0 » statique ONE = 0.000075 ; // 70 µs niveau haut pour « 1 » spi = null ; clkspeed = null ; bittime = null ; bytetime = null ; start_low_bits = null ; start_low_bytes = null ; start_high_bits = null ; start_high_bytes = null ; start_ack_bits = null ; start_ack_bytes = null ; mark_bits = null ; mark_bytes = null ; zero_bits = null ; zero_bytes = null ; one_bits = null ; one_bytes = null ; // 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 fonctionner // Retour : (Aucun) constructor(_spi, _clkspeed) { this.spi = _spi ; this.clkspeed = _clkspeed ; bittime = 1.0 / (clkspeed * 1000); bytetime = 8.0 * bittime; 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 = ZERO / bittime; zero_bytes = (zero_bits / 8); one_bits = ONE / bittime; one_bytes = (one_bits / 8); } // fonction auxiliaire // étant donné un long blob, trouver les temps entre les transitions et les analyser pour // obtenir les valeurs de température et d'humidité. Suppose une valeur de retour de 40 bits (16 octets pour l'humidité / 16 octets pour la température / 8 octets pour la somme de contrôle) // Entrée : // hexblob (blob de longueur arbitraire) // Retour : // tableau contenant : // "rh" : humidité relative (float) // "temp" : température en degrés Celsius (float) // Si la lecture échoue, rh et temp renverront 0 function parse(hexblob) { local laststate = 0; local lastbitidx = 0; local gotack = false; local rawidx = 0; local result = blob(5); // humidité sur 2 octets, température sur 2 octets, somme de contrôle sur 1 octet local humid = 0; local temp = 0; // Parcourir 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[byte] & (0x01 << bit)) ? 1:0; if (thisbit != laststate) { if (thisbit) { // Transition de bas en haut ; observer la durée de l'état haut laststate = 1; lastbitidx = (8 * byte) + (7 - bit); } else { // Transition de haut en bas ; laststate = 0; local idx = (8 * byte) + (7 - bit); local hightime = (idx - lastbitidx) * bittime; // Nous avons maintenant un bit d'information valide. Déterminer son symbole. local resultbyte = (rawidx / 8); local resultbit = 7 - (rawidx % 8); //server.log(format("bit %d de l'octet %d",resultbit, resultbyte)); if (hightime < ZERO) { // ceci est un zéro if (gotack) { // ne pas enregistrer de données avant la réception de l'ACK result[resultbyte] = result[resultbyte] & ~(0x01 << resultbit); rawidx++; } } else if (hightime < ONE) { // ceci est un un if (gotack) { result[resultbyte] = result[resultbyte] | (0x01 << resultbit); 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])); humid = (result[0] * 1.0) + (result[1] / 1000.0); if (result[2] & 0x80) { // température négative result[2] = ((~result[2]) + 1) & 0xff; } temp = (result[2] * 1.0) + (result[3] / 1000.0); if (((result[0] + result[1] + result[2] + result[3]) & 0xff) != result[4]) { return {"rh":0,"temp":0}; } else { return {"rh":humid,"temp":temp}; } } } // lire le capteur // Entrée : (aucune) // Retour : // tableau contenant : // "rh" : humidité relative (float) // "temp" : température en degrés Celsius (float) // si la lecture é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); for (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())); local result = spi.writeread(startblob); return parse(result); } } rele <- hardware.pin9; spi <- hardware.spi257; while(1){ clkspeed <- spi.configure(MSB_FIRST, SPICLK); dht11 <- DHT11(spi, clkspeed); data <- 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 sur Github .

Comme vous pouvez le constater, le code de l'agent est très simple ; n'oubliez pas d'inclure votre propre jeton d'authentification et l'ID de variable dans l'appel HTTP :

device.on("temp", function(value) { server.log("Tentative d'envoi de la valeur à Ubi :"); server.log(value); local headers = { "Content-Type": "application/json", "X-Auth-Token": "NBbF3PWPxWc2IaO40aXOKnhIu8tOv92rYN3ibiEc7Jh6GV3KZUUCHtXuNz7Y" }; // Remplacez le jeton par le vôtre local url = "ubidots"; // Remplacez l'ID de la variable par le vôtre local string = {"value": value}; local request = http.post(url, headers, http.jsonencode(string)); local response = request.sendsync(); });

Créer une variable synthétique sur Ubidots.

Comme pour ajouter une nouvelle variable, allez dans « Sources » → « Electric Imp (nom de votre source de données) » → « Ajouter une nouvelle variable » :

Étape 1 variable_dérivée

Saisissez maintenant cette équation pour calculer la valeur du point de rosée :

Dewpointeq

Voici à quoi cela devrait ressembler :

Variable dérivée de l&#39;étape 2

Vous devriez maintenant commencer à voir les données de point de rosée mises à jour chaque fois que votre Imp envoie des données de température et d'humidité à Ubidots!

Pour conclure

Dans ce projet, nous avons pu connecter un capteur Imp à Ubidots, mesurant et calculant des variables physiques pour mieux comprendre notre environnement. Vous pouvez explorer d'autres possibilités, comme la création d'alertes lorsque le point de rosée est trop élevé, ou la création de graphiques partageables tels que ceux présentés au début de cet article.

N'oubliez pas de consulter certains de nos derniers articles :

Si vous êtes novice sur Ubidots , cliquez ici pour commencer !