Allumez un ventilateur lorsque la température est trop élevée ! - Tutoriel sur les appareils électriques

Luis Duarte
· 7 min de lecture
Envoyer par courriel

Dans notre précédent tutoriel sur l'Electric Imp , nous avons appris à mesurer la température, l'humidité et le confort thermique global avec Ubidots . Cette fois-ci, nous allons créer une commande simple pour un ventilateur (marche/arrêt). Nous enregistrerons la température dans Ubidots et déclencherons un événement lorsque celle-ci dépassera 30 °C afin que l'Electric Imp active un ventilateur, puis un autre événement pour l'arrêter lorsque la température descendra en dessous de 27 °C.

Ça marche vraiment à merveille, alors c'est parti :

Matériels

électrique

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

-Un petit ventilateur

ventilateur

-Queue PowerSwitch

pouvoir

Câblage

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

tempImprelay

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

Codage

  • Connectez-vous à l'IDE Electric Imp et notez l'URL de votre Imp :

Impurl

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 d'y insérer votre jeton Ubidotset l'identifiant de votre variable.

  • Code de l'agent :
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(); }); device.on("hum", function(value) { //server.log("Tentative d'envoi de la valeur à Ubi:hola"); //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(); }); function requestHandler(request, response) { try { // Vérifier si l'utilisateur a envoyé led comme paramètre de requête if ("relay" in request.query) { server.log("entre"); // Si c'est le cas, et led=1, définir notre variable à 1 if (request.query.relay == "1" || request.query.relay == "0") { // Convertir le paramètre de requête led en un entier local relayState = request.query.relay.tointeger(); // Envoyer le message "led" à l'appareil, et envoyer ledState comme données device.send("relay", relayState); } } // Renvoyer une réponse indiquant que tout est OK. response.send(200, "OK"); } catch (ex) { response.send(500, "Erreur interne du serveur : " + ex); } } // Enregistrer le gestionnaire HTTP http.onrequest(requestHandler);
  • Code de l'appareil :

Notez la dernière partie du code où se trouve une fonction permettant d'allumer/d'éteindre le ventilateur à l'aide du connecteur Powerswitch.

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

Étape_événement1

  • Choisissez l'impédance électrique comme source et la température (temp) comme variable.

Événement_Étape2

  • Instaurer une condition lorsque la température dépasse 30ºC.

Étape_événement3

  • Choisissez « URL de requête » et saisissez votre URL Imp suivie de « ?relay=1 »

Étape_événement4

  • Ajoutez un autre événement avec cette condition.

Étape_événement5

  • Choisissez « URL de requête » et saisissez votre URL Imp suivie de « ?relay=0 »

Étape_événement6

Pour conclure

Dans ce projet, nous avons pu contrôler un ventilateur électrique à distance grâce à Electric Imp. De la même manière que nous avons contrôlé un ventilateur à partir de données de température, il est possible d'enregistrer d'autres données et d'agir en conséquence. Par exemple, vous pourriez ouvrir la porte de votre garage dès que votre chat s'approche d'un détecteur de mouvement (signifiant qu'il veut sortir !).

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

Si vous découvrez Ubidots , consultez cet excellent article d'introduction et inscrivez-vous gratuitement dès aujourd'hui !