dimanche 13 mars 2016

Module ESP8266

Mes premiers essais 

J'ai découvert  grâce a internet ce petit module qui permet de mettre du wifi  sur des tas de montages ce qui permet  de connecter des objets sur internet.
He bien c'est ce que j'ai commencé a faire avec un thermomètre qui surveille la température du frigo, pour cela j'ai utilisé le plus petit ESP de la gamme le 8266-01.
Le problème c'est que dans le frigo le montage est alimenté par des piles et lorsqu'il ce connecte au wifi il consomme plus de 200ma donc une mesure toute les 8 heures suffit amplement sinon les piles ne vont pas durer bien longtemps.On peut plonger l'ESP dans un sommeil profond ou il ne consomme que  quelques microampères mais pas plus de 35mn  avec  les anciens firmware avec la fonction  node.dsleep().Donc pour plusieurs heures j'ai contourné le problème avec  le module de RTC de mémoire utilisateur qui survit au sommeil profond. Pour cela il faut charger le module RTCmem dans le firmware sur le site (par exemple)  http://nodemcu-build.com/.
Il faut aussi au préalable souder un petit fil entre une patte du processeur et RST voir http://hackaday.com/2015/02/08/hack-allows-esp-01-to-go-to-deep-sleep/  c'est pas facile facile mais avec un bon fer a souder avec une panne très fine et bien propre ,une bonne vue et une main sure c'est faisable ,je l'ai fait sur plusieurs sans problèmes.

Voila donc le programme init.lua:



  1. val = rtcmem.read32 ( 0 ) --utilise memoire 0

  2. if (val>15)then
  3.           rtcmem.write32 ( 0 , 0 )
  4.           sleep_time =1 * 1000 * 1000 --1secondes
  5.           tmr.alarm(2, 5000, 0, function() node.dsleep(sleep_time)end)
  6. elseif (val<0)then
  7.             rtcmem.write32 ( 0 , 0 )
  8.           sleep_time =1 * 1000 * 1000 --1secondes
  9.           tmr.alarm(2, 5000, 0, function() node.dsleep(sleep_time)end)            

  10. else
  11.     if (val==15) then      -- pour 8heures
  12.              
  13.                          dofile('mesuretemp.lua')

  14.     else
  15.     val=val+1
  16.     rtcmem.write32 ( 0 ,(val))        
  17.     sleep_time =1800* 1000 * 1000   --30minutes
  18.           tmr.alarm(2, 5000, 0, function() node.dsleep(sleep_time)end)
  19.     end
  20. end        



programme mesuretemp.lua


  1. t=require("ds18b20")

  2. wifi.setmode(wifi.STATION)  -- Wifi en mode station
  3. cfg = { ip="192.168.0.27", netmask="255.255.255.0", gatway="192.168.0.1"}
  4. wifi.sta.setip(cfg)  -- on force l'adresse IP en dehors de la plage du DHCP
  5. wifi.sta.config("votre reseau,"la cle")
  6.  print ("Config fait, IP est" ..wifi.sta.getip ())
  7. print(wifi.sta.getmac())

  8. t1=string.format( "%.1f",t.readNumber(4))
  9. --t1=20
  10.  print("Temp:"..t1.." C\n")

  11. -- tempe="TEMPE" ..t1..""
  12. cu=net.createConnection(net.UDP)  -- connexion Socket UDP
  13. cu:connect(5666,"192.168.0.20")      --  Port d'écoute 5666 et adresse du serveur
  14. tmr.alarm(0,2000, 1, function()

  15. cu:send (" temperature du frigo = "..t1)
  16. end) -- lecture capteur


  17. val=val+1
  18. rtcmem.write32 ( 0 ,(val))
  19.         sleep_time =1800* 1000 * 1000 --30minutes
  20.         tmr.alarm(2, 5000, 0, function() node.dsleep(sleep_time)end)



     
 programme ds18b20


  1. -- DS18B20 one wire module for NODEMCU
  2. -- LICENCE: http://opensource.org/licenses/MIT
  3. -- Vowstar <vowstar@nodemcu.com>
  4. -- Dramatic simplification: Peter Scargill
  5. --------------------------------------------------------------------------------

  6. -- Set module name as parameter of require
  7. local modname = ...
  8. local M = {}
  9. _G[modname] = M
  10. --------------------------------------------------------------------------------
  11. -- Local used modules
  12. --------------------------------------------------------------------------------
  13. -- Table module
  14. local table = table
  15. -- String module
  16. local string = string
  17. -- One wire module
  18. local ow = ow
  19. -- Timer module
  20. local tmr = tmr
  21. -- Limited to local environment
  22. setfenv(1,M)
  23. --------------------------------------------------------------------------------
  24. -- Implementation – you don’t get any shorter than this
  25. --------------------------------------------------------------------------------

  26. function readNumber(pin)
  27.         ow.setup(pin)
  28.         ow.reset(pin)
  29.         ow.write(pin, 0xCC, 1)
  30.         ow.write(pin, 0xBE, 1)
  31.         data = nil
  32.         data = ""
  33.         for i = 1, 2 do
  34.             data = data .. string.char(ow.read(pin))
  35.         end
  36.         t = (data:byte(1) + data:byte(2) * 256) / 16
  37.         if (t>100) then
  38.         t=t-4096
  39.         end
  40.         ow.reset(pin)
  41.         ow.write(pin,0xcc,1)
  42.         ow.write(pin, 0x44,1)
  43.         return t        
  44. end

  45. -- Return module table
  46. return M


Voila, les valeurs de la température sont envoyées sur un serveur a base de raspberry2 toutes les 8 heures qui me prévient par un mail si la température dépasse les 10°C.

Je suis électronicien de base et non informaticien donc les programmes ne sont sans doute pas fait dans les règles de l'art mais ça fonctionne et c'est bien là le principal.
Bonnes bidouilles


Aucun commentaire:

Enregistrer un commentaire