Projets IoT

Allumez un ventilateur lorsque la température est trop élevée ! - Tutoriel Imp Électrique

Luis Duarte
· 7 min de lecture
Envoyer par email

Dans notre dernier tutoriel Electric Imp , nous avons appris à mesurer la température, l'humidité et le confort thermique global avec Ubidots . Cette fois, nous allons réaliser un simple contrôle marche-arrêt du ventilateur. Nous enregistrerons la température sur Ubidots et déclencherons un événement lorsqu'elle dépasse 30 °C afin que l'Electric Imp allume un ventilateur, puis un déclencheur pour l'éteindre lorsque la température est inférieure à 27 °C.

Cela fonctionne vraiment à merveille, alors c'est parti :

Matériels

électricité

embarqué

  • Trois fils femelle à femelle

fils-femellesjpg

  • résistance 10k

10krésistance

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

dh11

-Un petit fan

ventilateur

-Une queue PowerSwitch

pouvoir

Câblage

Voici comment tous les composants doivent être connectés :

tempImprelay

…et il ne reste plus qu’une chose : branchez votre ventilateur !

Codage

  • Connectez-vous à l’IDE ​​Electric Imp et notez l’url de votre Imp :

Impurler

Copiez les deux codes suivants. Dans le code de l'Agent, nous utiliserons une fonction pour gérer les requêtes HTTP vers Ubidots, n'oubliez pas de mettre le token et l'identifiant de vos variables Ubidots.

  • Code de l'agent :
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/53d2beb3762542 4630223dac/ valeurs"; // Remplacez l'ID de variable par le vôtre chaîne locale = {"valeur": valeur}; requête locale = http.post(url, en-têtes, http.jsonencode(string)); réponse locale = request.sendsync(); }); device.on("hum", function(value) { //server.log("Essayer de publier sur Ubi la valeur:hola"); //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/53e541e57625 422c7d900a1d /values"; // Remplacez l'ID de variable par le vôtre chaîne locale = {"value": value}; requête locale = http.post(url, en-têtes, http.jsonencode(string)); réponse locale = request.sendsync() ; }); function requestHandler(request, réponse) { try { // vérifie si l'utilisateur a envoyé le led comme paramètre de requête if ("relay" dans request.query) { server.log("entre"); // s'ils l'ont fait, et led=1.. définissez notre variable sur 1 if (request.query.relay == "1" || request.query.relay == "0") { // convertit le paramètre de requête led à un entier local relayState = request.query.relay.tointeger(); // envoie le message "led" au périphérique et envoie ledState comme données device.send("relay", relayState); } } // renvoie une réponse indiquant que tout allait bien. réponse.send(200, "OK"); } catch (ex) {response.send(500, "Erreur interne du serveur : " + ex); } } // enregistre le gestionnaire HTTP http.onrequest(requestHandler);
  • Code de l'appareil :

Notez la dernière partie du code où il y a une fonction pour allumer/éteindre le ventilateur avec la queue Powerswitch.

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); } } relais <- hardware.pin8; spi <- hardware.spi257; rele.configure(DIGITAL_OUT); function setRelay(relayState){ server.log("relayState:" + relayState ); relais.write(relayState); } agent.on("relais", setRelay); function mainLoop(){imp.wakeup(1.0, mainLoop); 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); agent.send("hum",data.rh); }mainLoop();

Configurer des événements Ubidots

  • Dans votre compte Ubidots , créez une source de données avec deux variables : Température et Humidité

  • Cliquez sur la section « Événements » et ajoutez-en un :

Événement_étape1

  • Choisissez le diablotin électrique comme source et la température (temp) comme variable.

Événement_étape 2

  • Mettez une condition lorsque la température est supérieure à 30ºC.

Événement_étape3

  • Choisissez l'URL de demande » et tapez votre URL Imp plus « ?relay=1 »

Événement_étape4

  • Ajoutez un autre événement avec ce conditionnel.

Événement_étape5

  • Choisissez « Demande d'URL » et tapez votre URL Imp plus « ?relay=0 »

Événement_étape6

Conclusion

Dans ce projet, nous avons pu contrôler un ventilateur électrique depuis Internet avec Electric Imp. Tout comme nous contrôlions un ventilateur à l’aide de données de température, vous pouvez également enregistrer d’autres données et prendre des mesures en fonction de celles-ci. Par exemple, vous pourriez ouvrir la porte de votre garage chaque fois que votre chat s'approche d'un détecteur de mouvement (c'est-à-dire qu'il veut sortir !).

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

Si vous êtes nouveau sur Ubidots , jetez un œil à cette superbe pièce de démarrage et inscrivez-vous gratuitement dès aujourd'hui !