vendredi 16 octobre 2015

NodeMcu un capteur de température/humidité Web en wifi à 8$

Voici comment faire un capteur wifi pour poignets de dollars.

Objectif : 

Nous allons fabriquer un capteur de température et d’humidité connecté à un réseau Wifi qui présentera ces résultats sur une page web.











Les explications ci-dessous sont un complément aux vidéos suivantes :




Matériel : 

Un NodeMCU
Un DHT22 (ou 11)
Une résistance de 1K (facultative)
Une platine d’essais et des fils

Le composant central ESP8266 : 

La NodeMcu est une platine de développement autour du composant ESP8266. L’ESP8266 au-delà d’un composant de communication wifi est un microcontrôleur à part entière.
Il possède 14 E/S digitales et une entrée analogique, la NodeMcu permet de s’en servir simplement en apport un liaison série via USB pour le programmé, une régulation de tension à 3,3V sur la liaison USB, un bouton pour flasher le circuit et un bouton reset. Ce composant peut se programmer de plusieurs manières :

  • un Firmware de commande AT
  • du code C natif via le tools chain du fabricant
  • du pseudo code Arduino (l'objet d'un futur tuto)
  • du code lua via le frimware NodeMcu (ce que présente le tuto)


 







Bien commençons :

A) Installation : 


Pour faire fonctionner le node, nous allons avoir besoins des éléments suivants :
Un driver pour que la liaison USB/Série fonctionne
Un outil de flash pour mettre la node à jour
Un outil de gestion pour charger le code et passer des commandes à la NodeMcu
Le GITHUB de la NodeMcu
Installer le divers
Téléchager le dernier Firmware (pour le tuto pernez le en mode float):
Télécharger et dezipper ESPlorer 
Télécharger l’outil de flash 

B) Flasher le composant 

Nous voilà prêt à travailler, nous allons flasher la NodeMcu
Lancer ESP8266Flasher.exe



Dans l’onglet config, mettez le chemin vers le firmware que vous avez télécharger, cocher la case.
Appuyer sur le bouton flash de la NodeMcu (et rester appuyé), Dans l’onglet Opération appuyez sur flash et attendez la fin de l’opération (la barre bleue se remplit).
Voilà notre composant est à jour, nous allons pouvoir le programmer

C) La connectique :

Rien de difficile suivez le schéma




D) Le code : 

Le code du tuto se trouve ici : https://github.com/pihito/nodeMcuTutorial/blob/master/DHT.lua
Si vous n’avez jamais fait de lua, je vous conseille la lecture de ce site.
Et la sheet de synthèse

a. Connexion au wifi : 

Le code ci-dessous permet de se connecter au wifi, remarquez le 1 dans les paramètres de la fonction wifi.sta.config qui permet de connecter la node quand le wifi est à porté

--fonction de connexion au WIFI en mode station
function connect()
    wifi.setmode(wifi.STATION)
    wifi.sta.config(SSID, PASSWORD, 1)
    wait_for_wifi_conn ( )
end

b. Attendre que le wifi soit connecté avant de continuer

Comme on ne connait la le temps de connection au wifi on réaliser un wathdog avec un timer pour suveiller que nous nous sommes connecté. Le timer utilise un callabck qui est ici réaliser à l’aide d’une fonction anonyme :
function wait_for_wifi_conn ( )
   tmr.alarm (1, 1000, 1, function ( )
      if wifi.sta.getip ( ) == nil then
         print ("Waiting for Wifi connection")
      else
         tmr.stop (1)
         print ("ESP8266 mode is: " .. wifi.getmode ( ))
         print ("The module MAC address is: " .. wifi.ap.getmac ( ))
         print ("Config done, IP is " .. wifi.sta.getip ( ))
…….
      end
   end)
end
Bien nous allons trarvailler cette fonction annonyme pour remplacer les « …. » par le lancement du serveur web.

c. Lancer le serveur et intercepter les demandes de connexion 

Rien de plus simple, on a une fonction qui crée un serveur TCP puis on écoute le port 80 avec celui-ci (et le port 80 est le port standard du http hein). Dans la fonction d’écoute on passe le nom d’une fonction qui sera appelée en cas de connexion.
--lancement du serveur web
         svr = net.createServer (net.TCP, 30)
         svr:listen (80, http_conn)

d. Lire le capteur : 

La lecture se fait via l’objet dht inclus dans le firmware de base. La seule particularité ici est dû au langage LUA qui permet à la fonction dht.read de retourner plusieurs paramètres en une seule fois.

--lecture du capteur de température 
--pin : numéro de la patte ou est branche le capteur
--temp,humi temperature et humidite
function readDht(pin)    
    status,temp,humi,temp_decimial,humi_decimial = dht.read(pin)
    if( status == dht.OK ) then
        print("DHT Temperature:"..temp..";".."Humidite"..humi)
    elseif( status == dht.ERROR_CHECKSUM ) then
        print( "DHT Checksum error." );
    elseif( status == dht.ERROR_TIMEOUT ) then
        print( "DHT Time out." );
    end
    return temp,humi
end

e. Traiter les clients :

C’est la fonction http_comm que j’ai créé qui se charge du traitement, elle prend une connexion, affiche l’entête http dans la console, envoie une réponse, une fois envoyé ferme la connexion. Tous cela utilise des callbacks avec des fonctions anonymes d’où l’intérêt de bien indenter le code.
 -- fonction de prise en charge des clients web, renvoie la pages HTML
function http_conn(sock)
    sock:on("receive",function(sock,payload) 
        print(payload) -- for debugging only
       --generates HTML web site
        temp,humi =readDht(PIN)
sock:send(……)
    sock:on("sent",function(sock) sock:close() end)
    end)
end

f. Envoyer la purée HTML : 

Il ne reste plus qu’à envoyer le HTML dans la fonction send, c’est du HTML standard. La seule particularité est la syntaxe ‘..variable..’ au milieu du code qui réalise une concaténation de la string et d’une variable avec l’opérateur ..

'HTTP/1.1 200 OK\r\nConnection: keep-alive\r\nCache-Control: private, no-store\r\n\r\n\
   <!DOCTYPE HTML>\
    <html><head><meta content="text/html;charset=utf-8"><title>ESP8266</title></head>\
   <body bgcolor="#ffe4c4"><h2>Capteur DHT22 en wifi</h2>\
   <h3><font color="green">\
   <IMG SRC="http://esp8266.fancon.cz/common/hyg.gif"WIDTH="64"HEIGHT="64"><br>\
   <input style="text-align: center"type="text"size=4 name="j"value="'..humi..'"> %  humidite<br><br>\
   <IMG SRC="http://esp8266.fancon.cz/common/tmp.gif"WIDTH="64"HEIGHT="64"><br>\
   <input style="text-align: center"type="text"size=4 name="p"value="'..temp..'"> Temperature en °C<br></font></h3>\
   <IMG SRC="http://esp8266.fancon.cz/common/dht22.gif"WIDTH="200"HEIGHT="230"BORDER="2"></body></html>'


Et voilà….

1 commentaire:

  1. salut,
    un grand merci pour commencer car avec toutes ces explications j'ai bien réussi a obtenir le résultat final souhaité !!! ( et ceux ma méconnaissance totale en programmation ).

    Toutefois,
    après débranchement de l'alim ( usb pour la programation ) et rebranchement au 5v à l'endroit final de la mesure de température, la page de la MCU n'est pas accessible...
    LE script ne se lance pas tout seul après rebranchement ?
    Faut-il après chaque débranchement électrique de la platine relancer le script avec ESPLORER ? on est bien d'accord que le firmware n'a pas besoin d'etre reflasher à chaque débranchement ?

    MErci de ton aide ....
    Vincent

    RépondreSupprimer