md
Trois petits projets basés sur le ESP8266
2018-12-16

J'ai tellement de projets que j'en oublie. Alors, je fais des listes de projets, j'essaie d'établir des priorités tenant compte du matériel et du temps nécessaire à obtenir les pièces qui me manque. Et puis j'égare ces listes. La vie serait tellement plus simple, si la deuxième loi de la thermodynamique n'était pas si inexorable.

Voici trois projets en élaboration. Les deux premiers sont reliés à des dispositifs virtuels du logiciel de domotique Domoticz. Éventuellement, le dernier quémandera de l'information auprès du serveur de domotique. Aucun projet n'est nouveau; on en trouve plusieurs sensiblement équivalents sur le Web présentés sous forme de vidéos sur YouTube, d'articles sur Instructables ou de simples billets semblables à ce que je fais ci-dessous. Je compte fournir des instructions plus détaillées lorsque les projets seront terminés.

Table des matières

  1. Lampe avec contrôle tactile
  2. Sonde de température Wi-Fi
  3. Afficheur de données météorologique

Lampe avec contrôle tactile toc

Parmi les premiers billets publiés sur ce site, je disais vouloir m'affranchir de la vieille technologie X-10. Plus de trois ans plus tard, il restait encore deux lampes au sous-sol branchés sur des modules X-10 contrôlés avec une combinaison d'un transmetteur (KR19A) et récepteur (TM751) RF. Dernièrement, j'ai modifié l'une des lampes pour utiliser un Sonoff.

Sur la photographie ci-dessus, on peut voir que l'ouverture à la base de la lampe est assez grande pour glisser un Sonoff à l'intérieur.

Lampe Wi-Fi (Sonoff) et capteur tactile

Dissimuler le Sonoff dans la base de était bien plus esthétique que de laisser le Sonoff en vue. Cependant, il faut un moyen de contrôler la lampe localement. J'ai décidé d'utiliser un capteur tactile capacitif qu'on n'obtient pour presque rien des fournisseurs habituels en Chine (moins de 0,35 $CDN livraison comprise chez Banggood en quantité de 50). Le module est basé sur la puce TTP223 qui fonctionne avec une tension de 2 à 5,5V. Le module est petit, l'image dans le coin gauche en haut de la photographie est à peu près le double de sa taille réelle.

Il y a deux cavaliers, dénotés A et B, sur le circuit imprimé. J'ai complété la connexion A avec un peu de soudure pour que le signal provenant du module passe à 0V lorsque la main est près du module. Il se peut qu'on puisse éviter cette étape, car TASMOTA doit probablement prendre en charge un commutateur qui indique qu'il est activé en passant à 3,3V. Cela reste à vérifier. Voici la connexion entre le Sonoff et le capteur.

connexions

Pour être en mesure de remplacer le Sonoff facilement, il y a un connecteur au milieu du câble reliant le Sonoff et le capteur. Voici la configuration du module dans TASMOTA.

tasmota settings

Seule la valeur de GPIO14 a été changée, de 00 None vers 90 Button1n.

Comme on peut (à peine) voir sur la photographie, j'ai collé le capteur à la paroi intérieure de la lampe à proximité de la douille pour l'ampoule. La base de la lampe, en céramique émaillée, est assez mince pour ne pas nuire au fonctionnement du capteur. En fait, il n'est même pas nécessaire de toucher à la lampe pour activer le capteur.

La douille de l'ampoule avec un bouton poussoir du type montré en bas à droite sur la photographie a été remplacée par une autre sans commutateur. J'aimerais en faire autant avec les lampes de la salle de séjour, car les invités ne comprennent rien au Sonoff et tente d'allumer en vain les lampes avec l'interrupteur mécanique d'origine. Immanquablement, ils l'activent à plusieurs reprises et abandonnent frustrés, en pensant que l'ampoule est grillée. Il y a une chance sur deux qu'ils laissent l'interrupteur en position d'arrêt et qu'il sera désormais impossible d'allumer la lampe avec le logiciel de domotique. J'espère qu'en plaçant le capteur près de la douille, les invités comprendront que le commutateur est un capteur capacitif, car ce genre de lampe n'est pas rare.

Cette lampe modifiée était en place lors de la dernière panne de courant avec comme micrologiciel la plus récente version de TASMOTA. Le Sonoff est maintenant « fragile » tel que décrit dans mon billet précédent. J'ai dû tout réinitialisé les paramètres quand le courant a été rétabli. Tout dernièrement, après avoir débranché la lampe pour prendre la photographie ci-dessus, le même scénario se répétait. Le Sonoff n'arrivait pas à se connecter au réseau Wi-Fi. Heureusement, il a été possible de rétablir la connexion avec WPS. Mais alors j'ai pu constater qu'en plus du nom du réseau et du mot de passe, toutes les autres informations avaient été perdues: configuration de la broche GPIO14, nom d'hôte, index de dispositif Domoticz etc.

La deuxième partie du projet, ce qui reste à faire, est d'ajouter un récepteur d'infrarouge à une carte de développement ESP8266 comme le Wemos (maintenant Lolin) D1 mini ou le nodeMCU pour contrôler la lampe avec une télécommande IR. Une bibliothèque est disponible. Il ne sera pas nécessaire d'ajouter une télécommande IR aux quatre déjà disposé autour de la pièce, car la télécommande fournie avec le décodeur TV (STB) peut contrôler cinq appareils alors que j'en utilise que trois.

Ce n'est que lorsque cette deuxième étape sera complétée que je pourrai enlever le dernier module X-10 qui contrôle deux lampes placées d'un côté et l'autre du téléviseur. Elles sont trop loin pour que je prenne la peine de me lever pour les allumés, alors que la télécommande IR est toujours à portée de main.

Sonde de température Wi-Fi toc

Le deuxième projet dont je parlerai ici est l'installation d'une sonde de température à l'extérieur. Celle-ci, basée sur la puce DS18B20, peut mesurer la température de -55° à 100°C avec une précision de 0,5°C dans l'intervalle de -10°C à 85°C (données techniques). Une borne inférieure plus basse serait préférable ici, car hier le minimum était -11,9°C et, depuis 1991, le thermomètre est déjà descendu à -21,2°C un 11 décembre. Sans doute, il y aura des nuits plus froides en janvier ou février. La FAQ de Maxim contient la seule information que j'ai trouvée au sujet de la précision en deçà de 10°C.

 Is there a way to extend the temperature range of the DS18B20?
   No, there is not a way to increase the range it reads. The 
   DS18B20 reads with an accuracy of ±0.5°C from -10°C to +85°C 
   and ±2°C accuracy from -55°C to +125°C.

Je doute que je puisse faire la différence entre -20°C et -22°C. De toute façon, à partir de -10° il fait trop froid. Le coût de ces sondes étanches et très simples d'utilisation est tellement faible que je m'en contenterai.

La sonde est raccordée à une carte de développement nodeMCU basé sur le ESP8266. Il n'y a que trois broches à connecter : l'alimentation, la masse et la connexion 1-Wire. L'image suivante où rien n'est à la même échelle montre comment j'ai raccordé la sonde à la carte ESP8266.

connexion NodeMCU - DS18B20

Pendant deux jours, une seconde sonde (AM2302/DHT22) était branchée au même nodeMCU. Ainsi, les températures lues avec les deux sondes placées côte à côte étaient transmises au logiciel de domotique Domoticz. Ce dernier conserve un historique des données reçues, qu'on peut voir sur des graphiques et qu'on peut télécharger sous forme de fichiers CSV. J'ai pu constater que les sondes donnaient des résultats sensiblement pareils, rarement différents de plus de 0,5°C. Plus tard, j'utiliserai le DHT22 à l'intérieur du garage où il sera à l'abri des intempéries.

graphe des températures

Depuis la mi-septembre, la sonde fonctionne sans aucun problème avec le croquis le plus élémentaire possible. Il a résisté aux deux grosses pannes d'électricité que j'ai mentionnées à plusieurs reprises ainsi qu'à de petites coupures de courant momentanées. Le ESP8266 s'est toujours rebranché au réseau Wi-Fi pour immanquablement reprendre la transmission des températures ambiantes à l'extérieur aux cinq minutes. Il aurait été possible d'utiliser TASMOTA qui prend en charge le type de capteur de température utilisé, mais j'ai opté pour le micrologiciel le plus simple que je pouvais créer.

//--- Needed librairies #include <ESP8266WiFi.h> #include <OneWire.h> #include <DallasTemperature.h> //--- Configuration, adjust as needed -- #define WIFI_SSID "wifi-network-name" #define WIFI_PSK "wifi-password" #define DOMO_SERVER "192.168.1.22" // IP address of Domoticz Web server #define DOMO_PORT 8080 // TPC port used by Domoticz Web server #define TEMP_IDX 38 // Domoticz device index of virtual temperature device #define DS18B20_PIN D1 // NodeMCU pin connected to the data line of the DS18B20 temperature sensor //--- These time delays should be ok but they can be modified #define TEMP_REPORT_DELAY 300000 // read & report temperature once every 5 minutes 5*60*1000 #define HEARTBEAT_ON_TIME 50 // time LED is on in ms, 0 to turn off heartbeat #define HEARTBEAT_OFF_TIME 1950 // time LED is off in ms, 0 to turn off heartbeat //--- Firmware version -- can help when changing things #define VERSION 0 #define SUB_VERSION 2 // Initialize the ESP8266WiFi library WiFiClient wifiClient; // Setup a oneWire instance to communicate with any OneWire devices OneWire oneWire(DS18B20_PIN); // Create a Dallas Temperature Sensor instance passing it the oneWire reference. DallasTemperature DS18B20(&oneWire); void sendHttpTemperature(int device_idx, char *tempvalue) { if (!wifiClient.connect(DOMO_SERVER, DOMO_PORT)) { Serial.printf("Connection with %s failed.\n", DOMO_SERVER); return; } String url = "/json.htm"; url += "?type=command&param=udevice&idx="; url += device_idx; url += "&nvalue=0&svalue="; url += tempvalue; Serial.printf("Requesting URL: %s\n", url.c_str()); // This will send the request to the server wifiClient.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + DOMO_SERVER + "\r\n" + "Connection: close\r\n\r\n"); unsigned long timeout = millis(); while (wifiClient.available() == 0) { if (millis() - timeout > 5000) { Serial.println("WiFi client timed out!"); wifiClient.stop(); return; } } // Read and print the reply from the server, line by line. while (wifiClient.available()) { String line = wifiClient.readStringUntil('\r'); Serial.print(line); } Serial.println("\nClosing connection"); } void Read_DS18B20(void) { float temp; char svalue[7]; DS18B20.requestTemperatures(); temp = DS18B20.getTempCByIndex(0); if ((temp > -127.0) && (temp < 85.0)) { snprintf(svalue, sizeof(svalue), "%0.1f", temp); Serial.printf("Sending DS18B20 temperature (%s°C) to Domoticz\n", svalue); sendHttpTemperature(TEMP_IDX, svalue); } else { Serial.println("Error: could not read the temperature."); } } volatile unsigned long tempTime; void temperature_loop() { if (millis() - tempTime > TEMP_REPORT_DELAY) { Read_DS18B20(); tempTime = millis(); } } volatile unsigned long ledTime; bool ledOn; void heartbeat_loop(void) { if (!HEARTBEAT_ON_TIME or !HEARTBEAT_OFF_TIME) return; if (ledOn) { if (millis() - ledTime > HEARTBEAT_ON_TIME) { digitalWrite(LED_BUILTIN, HIGH); // turn LED off ledTime = millis(); ledOn = false; } } else { if (millis() - ledTime > HEARTBEAT_OFF_TIME) { digitalWrite(LED_BUILTIN, LOW); // turn LED on ledTime = millis(); ledOn = true; } } } void setup() { pinMode(LED_BUILTIN, OUTPUT); // Initialize the LED_BUILTIN pin as an output Serial.begin(115200); delay(50); Serial.printf("\n\nStarting setup (firmware version %d.%d)\n", VERSION, SUB_VERSION); WiFi.mode(WIFI_STA); WiFi.begin(WIFI_SSID, WIFI_PSK); // Freewheel until WiFi is connected, toggling the builtin LED on/off at each time the status is checked int i = 1; while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); if (i % 80 == 0) Serial.println(); digitalWrite(LED_BUILTIN, 1-digitalRead(LED_BUILTIN)); i += 1; } Serial.printf("\nConnected to %s\nIP address: %s\n", WIFI_SSID, WiFi.localIP().toString().c_str()); digitalWrite(LED_BUILTIN, HIGH); // make sure led off to start; ledOn = false; tempTime = millis(); ledTime = millis(); Serial.println("\n\nSetup completed."); } void loop() { temperature_loop(); heartbeat_loop(); }

Télécharger la version 0.3 de ds18b20_domoticz.ino qui est sensiblement la même que ci-dessus.

La boucle principale, loop(), ne contient que l'invocation de deux fonctions:

À la mise sous tension du nodeMCU, sa DEL clignote (une demi-seconde allumée, une demi-seconde éteinte) tant que la connexion au réseau Wi-Fi n'est pas établie. Cela se fait dans la fonction setup() du croquis.

Le croquis contient de nombreux messages envoyés à la console. Ceux-ci ne sont là que pour faciliter la création du croquis et la première installation sur une carte de développement ESP8266. En pratique, le nodeMCU fonctionne de façon autonome sans connexion USB à un ordinateur et les messages ne servent à rien alors.

Pour transmettre la requête HTTP format JSON contenant la température j'ai choisi d'utiliser le client Wi-Fi de base de la bibliothèque ESP8266WiFi. On trouve plus d'exemples de requêtes faites avec le client HTTP de la bibliothèque ESP8266HTTPClient. En fait, j'utilise plutôt des messages mqtt envoyé au serveur MQTT qui lui retransmet les messages à Domoticz. Je rendrai disponible le croquis pas tellement plus complexe plus tard lorsque le prochain projet sera complété.

Pour les curieux voici comment j'ai abrité le nodeMCU dans un « boîtier » qui est en fait une prise téléphonique murale de taille normale en Amérique du Nord (décidément, c'est une habitude chez moi).

NodeMCU auquel est branché la sonde

J'ai enlevé le connecteur RJ11 et ses supports, en plus, j'ai limé les saillies en plastique autour des bornes de la base du boîtier. Pour diminuer la hauteur du nodeMCU j'ai enlevé ses deux connecteurs de 15 broches. En premier, j'ai mécaniquement retiré la base de plastique qui retient les broches en utilisant avec précaution un petit tournevis et une paire de pinces. Après, il a été très facile d'enlever chaque broche avec un fer à souder.

Les trois fils nécessaires pour la connexion 1-wire ont été soudés directement. On peut voir que les fils ont été acheminés vers un connecteur femelle en passant sous la nodeMCU. La résistance entre le signal et Vcc est aussi sous le nodeMCU. Il y a assez de jeu pour pouvoir tirer le connecteur complètement à l'extérieur du boîtier, car le couvercle obture en partie l'ouverture de telle sorte que le connecteur est trop gros pour passer par celle-ci.

Avec un Wemos D1 mini, il aurait été possible de se servir du connecteur RJ11 pour le raccord à la sonde. Toutefois, il aurait été nécessaire de trouver une façon d'établir une connexion avec l'alimentation.

Un petit chargeur USB complète l'installation. J'ai été surpris de constater que le tout fonctionnait dans mon bureau, mais pas dans le garage. Le nodeMCU n'arrivait pas à rejoindre le réseau Wi-Fi. En changeant la chargeur le problème a été éliminé.

La plus grande fiabilité de ce projet comparée à celle de certains des Sonoff est-elle à cause d'une alimentation plus solide ou la conséquence d'un micrologiciel beaucoup plus simple avec les identifiants Wi-Fi codés en dur ? Le hic c'est que certains Sonoff fonctionnent parfaitement. D'ailleurs il y a deux Sonoff à 1 cm l'un de l'autre dans le garage. Celui qui contrôle l'illumination extérieure fonctionne sans aucun problème depuis deux ans. Celui qui contrôle l'éclairage intérieur a eu de nombreuses pannes et a été remplacé. Conséquemment, il ne semblerait pas que TASMOTA soit la source du problème.

Je termine avec deux références au sujet de la calibration du capteur DS18B20 que j'ai trouvé en essayant d'obtenir plus d'information au sujet de la fiabilité du capteur lorsque la température est inférieure à -10°C : Absolute Calibration of DS18B20 Thermometers et Calibrating DS18B20 1-Wire Sensors with Ice & Steam point measurement. On est bien loin de ma simple comparaison avec un DHT22.

Afficheur de données météorologique toc

Très souvent, je me demande comment il faut se vêtir avant de quitter la maison, quelle est la température à l'extérieur ? Je pourrais chercher la météo courante sur le Web ou je pourrais consulter l'onglet Température sur la page Web de Domoticz. C'est trop de temps perdu, surtout s'il faut attendre que l'ordinateur ou la tablette démarre. Je pourrais me rendre dans la cuisine et voir, à travers la fenêtre, la température affichée par le bon vieux thermomètre mécanique qui est à l'extérieur. Mais l'effort physique est trop considérable. J'espère qu'un petit afficheur consacré aux données météorologiques sera la bonne solution. Voici le prototype de l'afficheur.

Station météorologique en dévelopment sur une platine d'expérimentation

Il y a un écran TFT LCD de 2" (5 cm) de couleur avec une résolution de 176×220 pixels. On le contrôle relativement facilement avec le bus de donnée synchrone en série SPI (pour Serial Peripheral Interface). Ce bus de données est implémenté avec la puce ILI9225. Heureusement, la bibliothèque TFT_22_ILI9225 de Johan Cronje (Nkawu) fonctionne avec le ESP8266.

On peut voir un DHT11 pour lire la température à l'intérieur. Il me semble que j'ai un capteur de pression atmosphérique. Si jamais je le retrouve, j'aimerais l'ajouter. Il y a aussi un capteur tactile capacitif basé sur la puce TTP223. C'est le même qu'utilisé avec le Sonoff dans le premier projet présenté ci-dessus. Il sera utilisé comme bouton pour sélectionner à tour de rôle la température extérieure, la température intérieure (et éventuellement la pression atmosphérique) les prévisions météorologiques locales et, peut-être, l'heure.

Pour l'instant tout est à l'état embryonnaire et le plus pressant est de mettre au point le micrologiciel.

Pourquoi cette préoccupation avec la météo ? C'est, parait-il, un syndrome qui afflige les Canadiens. Les résidents des Maritimes seraient parmi les plus touchés. On dit par ici qu'il suffit d'attendre une demi-heure pour que les conditions météorologiques changent du tout au tout.