Accueil > NodeMCU > Communication TCP en Micropython : 2ème partie

Communication TCP en Micropython : 2ème partie

Lors du précédent article, on a vu comment utiliser les sockets pour implémenter une communication TCP entre ma platine de test composée d’un NodeMCU Lolin et un module Wemos D1 mini en envoyant simplement un octet qui permettait d’allumer et d’éteindre alternativement la LED interne du NodeMCU Lolin.

Dans cet article, nous allons utiliser une Photo-résistance qui varie en fonction de la luminosité ambiante et effectuer une mesure de tension via le port analogique A0 du module Wemos D1 mini; cette mesure sera envoyée à ma platine de test via le protocole TCP et affichée sur l’écran OLED.
Le schéma du module de mesure sera le suivant :
Ma photo-résistance varie de 400 Ohms (noir complet) à 700 Ko (en pleine lumière). J’ai effectué un pont diviseur de tension à l’aide d’une résistance de 56 Ko.

La difficulté est de trouver un moyen simple d’envoyer une mesure de type  Float à l’aide de la librairie socket de MicroPython. La commande ‘socket.send’ n’accepte qu’une valeur de type ‘bytes’, or je veux envoyer une mesure de type ‘Float’.
Si je teste la commande ‘socket.send(2.77)’ j’obtiens une erreur. Pour solutionner cette erreur, je vais transformer la valeur en String en effectuant la commande suivante :
donnees = ‘%.2f’ % (volts)
%.2f : transforme la valeur de type Float en ne gardant que 2 chiffres après la virgule.
Maintenant en effectuant la commande ‘socket.send(donnees), je n’ai plus d’erreur.
Le programme jouant le rôle de serveur TCP sera le suivant :
#
#                       Serveur TCP
#
# Programme qui traite une requete TCP et va permettre d’afficher la mesure
# sur l’ecran OLED
#
# Tester sur NodeMCU Lolin et Wemos D1 Mini
#
# Auteur : iTechnoFrance
#
import network, socket, time, machine, ssd1306
def config_wifi():
    sta = network.WLAN(network.STA_IF)  # creation client d’acces WiFi
    sta.active(True)  # activation du client d’acces WiFi
    sta.connect(‘ssid’, ‘mot de passe’)  # connexion au point d’acces WiFi
    while(sta.isconnected() == False):
        time.sleep(1)
    ip = sta.ifconfig()[0]  # on recupere l’adresse IP
    return ip
def reception(com_net):
    connexion = com_net.accept()  # attente d’une connexion TCP
    client_sock = connexion[0]  # on recupere les infos de connexions
    reception_donnees = client_sock.read()  # attente reception de donnees et la fin de connexion
    client_sock.close()  # fermeture du socket
    return reception_donnees
# Declaration I2C
# // D1 -> GPIO05 –> SDA
# // D2 -> GPIO04 –> SCL
i2c = machine.I2C(scl = machine.Pin(4), sda = machine.Pin(5), freq=400000)
# Declaration OLED SSD1306
oled = ssd1306.SSD1306_I2C(128, 64, i2c, 0x3c) # 128 x 64 pixels
ip = config_wifi()
com_net = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  # initialise un socket TCP
com_net.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  # permet de reutiliser le socket si on relance le programme de nouveau
com_net.bind((ip, 18000))  # TCP port 18000
com_net.listen(5)  # ecoute sur le port TCP et autorise 5 connexions au maximum
while True:
    reception_donnees = reception(com_net)
    oled.fill(0) # efface l’ecran
    oled.text(« Tension : », 0, 0)
    oled.text(reception_donnees, 80, 0)
    oled.show()
Le programme client TCP effectuant la mesure est le suivant :
#
#                       Client TCP
#
# Programme qui effectue une mesure de luminosite et envoie le resultat
# via TCP au serveur TCP
#
# Tester sur NodeMCU Lolin et Wemos D1 Mini
#
# Auteur : iTechnoFrance
#
import network, socket, time, machine
def config_wifi():
    sta = network.WLAN(network.STA_IF)  # creation client d’acces WiFi
    sta.active(True)  # activation du client d’acces WiFi
    sta.connect(‘ssid’, ‘mot de passe’)  # connexion au point d’acces WiFi
    while(sta.isconnected() == False):
        time.sleep(1)
    ip = sta.ifconfig()[0]
    return ip
def emission(donnees):
    adresse_serveur = socket.getaddrinfo(« 192.168.1.38 », 18000)[0][-1]  # on formatte l’adresse IP du serveur TCP
    com_net = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  # initialise un socket TCP
    com_net.connect(adresse_serveur)  # on se connecte au serveur TCP
    time.sleep(0.1)  # laisse le temps au serveur TCP de traiter la connexion
    com_net.send(donnees)  # on envoi le message
    com_net.close()  # on ferme la connexion TCP
# Definition port Analogique A0
adc = machine.ADC(0)
config_wifi()
while True:
    tension = adc.read() # lecture du port analogique A0
    volts = (tension / 1024) * 2766 / 1000 # calibrage 2766 mV et non 3300 mV sur mon Wemos D1 mini
    donnees = ‘%.2f’ % (volts)  # creation du buffer a envoyer
    emission(donnees)  # envoi de la donnee
    time.sleep(2)  # on attend 2 secondes
On a vu dans cet article comment effectuer une mesure et l’envoyer à un serveur en utilisant le protocole TCP.
Catégories :NodeMCU Étiquettes : , , , ,
  1. Aucun commentaire pour l’instant.
  1. No trackbacks yet.

Votre commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l’aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l’aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s

%d blogueurs aiment cette page :