Surveiller l’hygrométrie à distance de son atelier pour moins de 50 euros!

Salut,

Je vous avais parlé il y a quelques temps du Raspberry pi qui pouvait être utile en guise d’ordinateur dans son atelier (et ce d’autant plus depuis la sortie des Raspberry pi 2 et 3 qui sont suffisamment puissants pour naviguer confortablement en utilisant un navigateur moderne. Le logiciel Kodi, un mediacenter libre, permet en outre d’accéder à un nombre incalculable de radios à travers le monde, qu’elles soient hertziennes ou sur le Web : de quoi vous accompagner pendant vos longues heures à travailler sur votre guitare).

Bref, l’intérêt est qu’on peut y ajouter par exemple une sonde DHT22 qui permet de contrôler l’hygrométrie de la pièce. Le raspberry consomme peu d’énergie et se passe de ventilation (donc pas de problème de poussière).

Récemment, j’ai découvert une alternative plus légère – et moins chère – pour le contrôle de l’hygrométrie mais qui ne peut pas servir d’ordinateur par contre.

Il existe une petite puce qui peut entre autres se connecter à votre réseau Wifi et envoyer les données de votre sonde que vous pourrez suivre sous forme de courbe dans un graph. En ce qui me concerne, j’ai branché une petite borne wifi dans l’atelier qui est alimentée en réseau par un boîtier CPL (réseau au travers des prises de courant 220 classiques). Avec cette petite puce, vous pourrez pourquoi pas envoyer une alerte lorsque l’humidité ambiante dépasse un certain seuil ou que la température et trop basse…

Graph de suivi de la température et de l'humidité de l'atelier sur Thingspeak

Graph de suivi de la température et de l’humidité de l’atelier sur Thingspeak

Présentation

Cette puce se nomme ESP8266 et elle a été intégrée sur une interface permettant de l’utiliser et de la programmer plus facilement grâce notamment à un firmware opensource : cette interface se nomme nodeMCUnodemcu

Schéma

Voici le schéma très simple que je vous propose de réaliser :

schema pour le controle de l'hygrométrie avec node MCU et une sonde AM2302Matériel nécessaire

Vous aurez donc besoin de :

  • Une sonde AM2302 (il s’agit d’une sonde DHT22 avec une résistance intégrée ce qui permet de la relier directement)
  • Une module node MCU que l’on peut trouver pour 5$ chez aliexpress
  • Une « Half-size breadboard » pour faire les branchements sera suffisante, disponible chez Adafruit.
  • Un peu de fil
  • Facultatif deux LEDs classiques qui permettront de contrôler que la sonde est bien fonctionnelle d’un coup d’oeil.

Tout le matériel nécessaire peut être commandé chez Adafruit et Aliexpress (pour le nodeMCU).

Nous pouvons commencer à programmer tout ça.

Installation du pilote

La première chose à faire est d’avoir un pilote qui reconnait le nodeMCU lorsqu’on le branche en USB. Le driver qui va bien peut être trouvé ici : https://www.silabs.com/. Il se peut que le module soit reconnu automatiquement, auquel cas il n’y a rien à faire. Sinon :

sous windows

Pour windows, la procédure d’installation est assez simple puisque le pilote est fourni avec un « installer » (lire installeur).

Sous LINUX

Pour ceux d’entre-vous qui utilisent linux, il faudra compiler le pilote, avec debian, par exemple (4.2.0-1-amd64 correspond à la version de mon noyau, à adapter donc) :

make -f Makefile
make install
cp cp210x.ko /lib/modules/4.2.0-1-amd64/kernel/drivers/usb/serial/
insmod /lib/modules/4.2.0-1-amd64/kernel/drivers/usb/serial/usbserial.ko 
insmod cp210x.ko
rmmod cp210x
modprobe cp210x

Faites dmesg |tail afin de vérifier que le nodeMCU est bien reconnu lorsque vous le connectez à l’ordinateur.

Téléchargement d’un firmware adapté

Il faut ensuite flasher le nodeMCU avec un firmware embarquant le module DHT.

Le site de nodeMCU permet de demander un firmware avec les modules que l’on veut : http://nodemcu-build.com/index.php (n’oubliez pas de cocher le module DHT)

Un peu plus tard, vous devriez recevoir le firmware par mail.

Flashage du module

Vérifiez que vous avez accès à votre module avec un programme comme putty ou screen sous linux (dans ce cas, sous debian : apt-get install screen).

Votre module doit fonctionner avec les paramètres par défaut du programme en 9600 bauds. Choisissez par contre le bon port série. COMX sous Windows, /dev/ttyUSB0 sous linux.

Branchez votre module, lancez putty sous windows ou screen sous linux (screen /dev/ttyUSB0 9600), appuyez sur le petit bouton reset du module. Screen ou putty devraient au moins pouvoir se connecter en 9600 sans retourner d’erreur (fenêtre noire). En appuyant sur reset, vous devriez voir du texte apparaître, dans mon cas, ça affichait un peu n’importe quoi, ce n’est qu’une fois après avoir flashé le module que j’ai pu afficher les caractères qu’il me renvoyait correctement.

Sous linux (debian) :

Un programme python est utilisé pour flasher votre module avec le firmware que vous avez reçu.

apt-get install python python-serial git
mkdir -p ~/Documents/nodeMCU
cd ~/Documents/nodeMCU
git clone https://github.com/themadinventor/esptool.git
cd esptool
python esptool.py --port /dev/ttyUSB0 write_flash 0x00000 firmware

Sous Windows :

NodeMCU propose sur son site un outil facile à installer et à utiliser pour flasher le module :

https://github.com/nodemcu/nodemcu-flasher/

Choisissez 32 ou x64 en fonction de la version de votre système d’exploitation.

Inscription sur thingspeak

Inscrivez vous sur thingspeak et créez votre chaîne (channel) :

thingspeak-channel-settingsdans la partie API Keys, notez la clé perettant d’écrire dans votre chaîne.

le programme – init.LUA

Le programme que je vous propose (voir ci-dessous) permet d’une part de créer un petit serveur WEB sur le nodeMCU qui permet à travers une simple page Web d’interroger la sonde de température et d’humidité ; et d’autre part, d’envoyer à intervalle régulier les données sur le site thingspeak.com. Avant d’utiliser le programme, créez votre channel sur le site pour pouvoir y envoyer les données.

Il est écrit en langage lua, un langage très simple et de très haut niveau. Voici quelques ressources intéressantes :

https://learn.adafruit.com/adafruit-huzzah-esp8266-breakout/using-nodemcu-lua

http://nodemcu.readthedocs.org/en/dev/

Le programme que je vous propose est un peu redondant, mais c’est pour montrer quelques unes des possibilités que ce module offre.

Voici le programme, enregistrez le sous le nom init.lua avant de l’envoyer au module. N’oubliez pas de modifier la clé thingspeak (key =) et les paramètres de votre WIFI, et éventuellement, l’adresse IP du serveur fournissant l’API de thingspeak.com (ici 184.106.153.149) que vous pouvez obtenir ici : lien vers l’IP statique de l’API

Les leds sont branchées sur les GPIO 6 et 7, la sonde sur le GPIO 4. Changez ces valeurs si vos branchements ne correspondent pas.

wifi.setmode(wifi.STATION)
wifi.sta.config{ssid="NOM DE VORE WIFI",pwd="MA_CLE_WIFI"}
led1 = 6
led2 = 7
DHT22 = 4
key = "VOTRE CLE THINGSPEAK"
gpio.mode(led1, gpio.OUTPUT)
gpio.mode(led2, gpio.OUTPUT)
gpio.write(led1, gpio.LOW);
gpio.write(led2, gpio.LOW);
srv=net.createServer(net.TCP,30)
if srv then
  srv:listen(80,function(conn)
    conn:on("receive", function(conn,request)
        gpio.write(led1, gpio.LOW);
        gpio.write(led2, gpio.LOW);
        local buf = "";
        local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");
        if(method == nil)then
            _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP");
        end
        local _GET = {}
        if (vars ~= nil)then
            for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do
                _GET[k] = v
            end
        end
        buf = buf.."<h1> ESP8266 Sonde de temperature connectee</h1>";
        buf = buf.."<p>Afficher les valeurs de temperature et d'humidite : <a href=\"\"><button>Actualiser</button></a></p>"
        local i=0
        status = 2
        while status ~= dht.OK and i < 30 do
                tmr.delay(100000)
                status,temp,humi,temp_decimial,humi_decimial = dht.read(DHT22)
                if( status == dht.OK ) then
                        buf = buf.."<p>DHT Temperature:"..temp..";".."<br />Humidite : "..humi.."</p>"
                        print("DHT Temperature : "..temp..";".."Humidite : "..humi)
                        gpio.write(led2, gpio.HIGH)
                end
                i=i+1
        end
        if(i==30)then
                gpio.write(led1, gpio.HIGH);
        end
        conn:send(buf);
        conn:on("sent",function(conn) conn:close() end)
        
    end)
  end)
end

function sendData()
        gpio.write(led1, gpio.LOW);
        gpio.write(led2, gpio.LOW);
        print("Envoi des donnees vers thingspeak.com")
        conn=net.createConnection(net.TCP, 0)
        conn:on("receive", function(conn, payload) print(payload) end)
        local i=0
        status = 2
        tmr.delay(1000000)
        while status ~= dht.OK and i < 30 do
                status,temp,humi,temp_decimial,humi_decimial = dht.read(DHT22)
                if( status == dht.OK ) then
                        gpio.write(led2, gpio.HIGH)
                end
                i=i+1
        end
        if(i==30)then
                gpio.write(led1, gpio.HIGH);
        else
                update_request = "GET /update?key="..key.."&field1="..temp.."&field2="..humi.."HTTP/1.1\r\n".."Host: api.thingspeak.com\r\n".."Accept: */*\r\n\r\n"
                conn:on("connection", function(c)
                        conn:send(update_request)
                end)
                conn:connect(80,"184.106.153.149")
        end
        conn:on("sent",function(conn)
                  print("Closing connection")
                  conn:close()
        end)

        conn:on("disconnection", function(conn)
                      print("Deconnecte...")
        end)
end
sendData()
-- affiche l'adresse IP du module sur le reseau local
print(wifi.sta.getip())
-- send data every X ms to thing speak
tmr.alarm(2, 60000, 1, function()
                             sendData()
                       end )

Copie du programme sur le module

Sous linux :

cd ~/Documents/nodeMCU
git clone https://github.com/4refr0nt/luatool.git

Sous windows :

Installez python 2.7.

installez git et cloner le dépôt suivant :

https://github.com/4refr0nt/luatool.git

Ou alors, rendez vous à la page suivante : https://github.com/4refr0nt/luatool et cliquez sur download zip pour obtenir le programme.

Luatool : pour quoi faire ?

Luatool permet d’envoyer votre programme sur le module nodeMCU, et notamment le fichier init.lua qui est exécuté automatiquement au démarrage de ce dernier.

Envoi du programme :

Branchez votre module avec la prise USB.

Voici la commande linux permettant d’envoyer votre programme sur le module (il faut parfois la lancer deux fois avant que ça fonctionne) :

python luatool.py --port /dev/ttyUSB0 --src init.lua --dest init.lua --restart

Connectez vous avec screen par exemple :

screen /dev/ttyUSB0 9600

Appuyez sur le bouton reset, et vérifiez à l’écran que tout à l’air de bien fonctionner et recueillir son adresse IP qui est affichée par le programme avec la ligneprint(wifi.sta.getip()). Si vous ne voyez que des caractères étranges, essayez d’autres valeurs de vitesse de connexion que 9600 avec putty ou screen (115200, 74880)

A partir de là, le module peut fonctionner de manière autonome et être branché simplement avec un chargeur de téléphone portable.

Une fois l’adresse ip récupérée, il suffit de se rendre à son adresse dans un navigateur Internet depuis un téléhphone, une tablette, un ordinateur connecté sur le réseau WIFI pour pouvoir interroger la sonde :

http://192.168.0.10 par exemple.

Vous devriez aussi voir les données arriver sur votre chaîne thingspeak en temps réel à intervale régulier (toutes les 60 secondes).

Une redirection du port 80 sur votre routeur vers l’adresse IP locale de votre puce doit vous permettre facilement d’interroger votre sonde depuis n’importe où.

Libre à vous de modifier le programme pour envoyer un mail en cas d’humidité trop haute ou que sais-je encore !


Vous pouvez consulter la liste complète des articles en cliquant ici

Pour des explications plus complètes sur la fabrication de la guitare, consultez le wiki !

4 commentaires

Laisser un commentaire

Votre courriel ne sera jamais rendu public.Les champs marqués d'un astérisque (*) sont obligatoires

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.