Archives par étiquette : udp server

ESP8266 : sonde de température prolixe

Quoi de mieux pour de la domotique que de pouvoir mesurer la température où et quand nous le souhaitons ? Et si j’avais envie de déployer 50 sondes dans les 50 pièces de mon immmmmmmmense château familial ?!

Eh bien là encore, nous allons passer via l’ESP8266 et une sonde DS18B20 que vous trouverez sans mal sur ebay pour quelques euros :

esp8266_temperature

Notre sonde (le tube métallique étanche en haut à gauche de l’image) se branche sur le port GPiO 3 :

esp8266_tempe_schema

Sur la platine d’expérimentation Nodemcu, DQ se relie à D3, VDD à 3v3 et GND à… GND.

Chargez ds18b20.lua sur ce lien et injectez le dans l’ESP8266.

Le script maintenant, tempe.lua :

require('ds18b20')
-- connexion au reseau wifi
wifi.sta.config("reseau_wifi","password")
wifi.sta.connect()
tmr.delay(1000000)
print(wifi.sta.status())
print(wifi.sta.getip())
-- Choix du GPiO pour la sonde DS18B20
gpio0 = 3
ds18b20.setup(gpio0)
-- Activation du serveur UDP port 5665 pour recevoir les trames
-- de commande
port=5665
srv=net.createServer(net.UDP)
srv:on("receive", function(srv, pl)
 print("Trame UDP")
 print(pl)
 -- si trame recue = SONDE, alors on lit temperature
 if pl=="SONDE\n" then
 t1=ds18b20.read()
 t1=ds18b20.read()
 print("Temp:"..t1.." C\n")
 tempe="TEMPE"..t1..""
-- et on repond sur l'IP 192.168.1.124 avec la
 -- valeur de la temperature
cu=net.createConnection(net.UDP)
 cu:on("receive",function(cu,c) print(c) end)
 cu:connect(5665,"192.168.1.124")
 cu:send(tempe)
 end
 end)
srv:listen(port)

Ici nous allons donc écouter le port UDP 5665 et guetter l’apparition d’une trame SONDE, trame qui va déclencher la lecture de la température, puis son envoi à notre Raspberry Pi chargé de recevoir et traiter les informations, sur 192.168.1.124 : vous adapterez en fonction de vos besoins et de votre installation, ce billet n’existe que pour vous présenter le principe.

 

 

ESP8266, Nodemcu, Lua : commande de relais via trames UDP

Suite des essais avec l’ESP8266 déjà présenté sur Blogwifi, associé désormais à une platine munie de 2 relais :

esp8266_relay2

J’ai relié l’un des deux relais de la platine via un transistor 2N2222, branché comme suit :

esp8266_relay

Vue la petite taille, tout a été soudé en l’air sur la platine relai comme vous pouvez le voir en détail ci-dessous :

esp8266_relay3

 

Les différents fils sont :

  • Rouge : +5Vcc (en bas à gauche de l’ESP8266)
  • Bleu : GND (en bas à gauche de l’ESP8266)
  • Vert : GPiO3 (broche D3 de la platine en haut à droite)

Le brochage de la platine de démonstration ESP8266 est le suivant :

esp8266_pinout

 

Oui, la broche D3 correspond à GPIO4 alors que je vous parle du 3 dans le billet. En fait, il faut toujours considérer le GPIOxx avec xx comme étant Dxx. Par exemple, GPIO5 sera la broche D5, GPIO4 la broche D4, etc. J’ai passé plusieurs heures à chercher sur ce détail plutôt agaçant 🙂

Et voici le script LUA que vous allez pouvoir utiliser pour envoyer EXTON ou EXTOFF via une trame UDP sur le port 5000 :

wifi.sta.config("mon_reseau_wifi","password")
wifi.sta.connect()
tmr.delay(1000000)
print(wifi.sta.getip())
gpio.mode(3, gpio.OUTPUT)
port=5000
srv=net.createServer(net.UDP)
srv:on("receive", function(srv, pl)
   print("Commande recue")
   print(pl)
   if pl=="EXTON\n" then gpio.write(3, gpio.HIGH)  end
   if pl=="EXTOFF\n" then gpio.write(3, gpio.LOW) end
   end)
srv:listen(port)

Insérez bien entendu les paramètres de votre propre réseau WiFi sur la toute première ligne.

Désormais, envoyez EXTON et le relai collera. EXTOFF et le relai se coupera.

Un détail toutefois : les GPIO sont activés (+ 3.3 Vcc) systématiquement au redémarrage. Résultat, le relai colle ! Il faut donc prévoir un script qui se lance tout seul et ira remettre à zero les GPIO utilisés. Pensez-y, sinon surprise 😉

 

Raspberry Pi 2 domotique : trames UDP (7)

Comment faire communiquer simplement deux modules situés sur un même réseau IP ? On peut déclencher une connexion SSH depuis l’un des modules, envoyer un ordre, et couper la connexion, mais c’est lourd, très lourd.

En ce moment, je teste l’envoi de simples trames UDP, émises d’un module vers un autre module, ce dernier étant à l’écoute des informations reçues et capable de les traiter selon leur contenu.

Pour tester l’idée, j’utilise l’application UDP SENDER sur Android, et je lui fais émettre des trames vers l’IP 192.168.1.124, un Raspberry Pi chargé d’écouter les trames UDP sur le port 54345 :

UDP raspberry

Envoi du mot « ON » sur le port 54345

Sur le Raspberry Pi, un simple script python3 :

import socket
sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
sock.bind( ('',54345) )
code = "on";
while True:
    data, addr = sock.recvfrom(1024)
    data = str(data, encoding='utf8')
    print(data)
    print (addr)
    if "on" in data:
      print ("ON")

Simple non ? On vérifie si « on » est contenu dans les données reçues (variable data), si oui on affiche ON à l’écran du terminal. Les données reçues et l’adresse IP d’origine sont également affichées, à des fins de test.

A nous maintenant de venir traiter les données reçues. On peut imaginer par exemple :

  • « porteon » = porte ouverte
  • « porteoff » = porte fermée
  • « rfidon » = trame RFID authentifiée reçue du lecteur extérieur

etc…

L’envoi des trames UDP peut également se faire en multicast, de façon à être reçues par n’importe quel périphérique de votre réseau IP, laissant la porte ouverte à des tas d’applications domotiques plutôt sympa 😉

Là, j’attends de pouvoir tester sur un ESP8266 : relié en WiFi, il va pouvoir se positionner n’importe où au bureau et venir délivrer en UDP ses informations : température, code RFID reçu, etc.

Tenez, un exemple trouvé au fil du web :

MFRC522-ESP8266

ESP8266 câble sur une platine RFID MFRC522

Le programme proposé ici lit les trames, mais on peut y ajouter une communication supplémentaire, en envoyant les codes reçus sur notre réseau, détectables par toute l’installation domotique. Ca vous donne des idées ? Moi oui !! 🙂