Allumez un ventilateur lorsque la température est trop élevée ! - Tutoriel Imp Électrique
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
- Trois fils femelle à femelle
- résistance 10k
- Capteur d'humidité et de température DHT11
-Un petit fan
-Une queue PowerSwitch
Câblage
Voici comment tous les composants doivent être connectés :
…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 :
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 :
- Choisissez le diablotin électrique comme source et la température (temp) comme variable.
- Mettez une condition lorsque la température est supérieure à 30ºC.
- Choisissez l'URL de demande » et tapez votre URL Imp plus « ?relay=1 »
- Ajoutez un autre événement avec ce conditionnel.
- Choisissez « Demande d'URL » et tapez votre URL Imp plus « ?relay=0 »
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 :
- Connectez un diablotin électrique (imp002) à Ubidots
- Création d'un widget de carte en temps réel à l'aide Ubidots
Si vous êtes nouveau sur Ubidots , jetez un œil à cette superbe pièce de démarrage et inscrivez-vous gratuitement dès aujourd'hui !