Arduino - Python - Pyzo - AIDE

Bonjour à tous,

J'ai créé mon programme pour une gestion de serre.
Comme matériel :

  • Arduino uno R3
  • DHT22 ( température + hygrométrie )
  • LCD I2C 20x4
  • 6 LEDs
  • 2 relais

Mon code fonctionne très bien mais j'aimerai aller plus loin ...
C'est à dire faire une courbe ( en direct ) des données lues. Le traceur arduino n'étant pas top j'ai vue une autre alternative. Basculer les données sur python ( en utilisant Pyzo ) et faire la courbe.

Je me sert de ce tuto, je comprend le principe, mais la le code dépasse mon compétence ( je suis très novice ) : Tuto courbes et recupérations des données arduino sur pyhton

Quelqu'un aurait du temps pour refaire ce code python pour ma lecture ? ou m'expliquer certains points ect .... Je me rend pas compte si le travail de "retape" du code python est compliqué.

Voici mon code :

#include "DHT.h"//bibliothéque
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define DHTPIN 13 // connexion de la pin digital du capteur sur la broche n°2
#define DHTTYPE DHT22   // on appelle le capteur dht22 dans la bibliothèque

const int RELAY_Chauf = 6;
const int RELAY_Hygro = 5;

DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 20, 4);

void setup() {
 
  Serial.begin(9600); //définition de la vitesse du port
  Serial.println("Lecture du climat par capteur DHT22"); // Moniteur 
  lcd.init(); // initialisation de l'afficheur
  dht.begin(); // initialisation du capteur

  //Positionnement LEDs
  pinMode(10,OUTPUT); // Bleu température froide : en dessous de 20°C
  pinMode(11,OUTPUT); // Vert température : tout est OK
  pinMode(12,OUTPUT); // Rouge température chaude : au dessus de 25°C
  pinMode(7,OUTPUT); // Blanc hygrométrie basse : en dessous de 50%
  pinMode(8,OUTPUT); // Vert hygrometrie : tout est OK
  pinMode(9,OUTPUT); // Jaune hygrométrie haute : au dessus de 80%
  pinMode(6,OUTPUT); // Relais chauffage
  pinMode(5,OUTPUT); // Relais hygrométrie
}
 
void loop() {
 
  delay(2000); // attente d'2 seconde entre chaque mesure une fois la boucle revenue au début
  lcd.backlight(); // eclairage LCD
  float humidite = dht.readHumidity();//lecture de l'humidité.
  float temperature = dht.readTemperature();//lecture de la température en degrés Celsius.
 
  // Si la lecture ne s'effectue pas
  if (isnan(humidite) || isnan(temperature)) {
  Serial.println ("Probleme de lecture, verifier votre systeme");
    return;}

  //Ecriture sur le moniteur
  Serial.print("Température: ");
  Serial.print(temperature);
  Serial.println (" *C");
  Serial.print("Hygrométrie: ");
  Serial.print(humidite);
  Serial.println (" %\t ");

  //Ecriture température & hygrométrie sur le LCD 20x4
lcd.setCursor(0,0);
lcd.print("   Temp :       C");
lcd.setCursor(10,0);
lcd.print(temperature);
lcd.setCursor(0,2);
lcd.print("   Hygr :       %");
lcd.setCursor(10,2);
lcd.print(humidite);

    // Action pour température > 20 & < 30           <=== TOUT EST OK -- LED verte
if (temperature > 20.00 & temperature < 30.00) {
  lcd.setCursor(0,1);
  lcd.print("OK                  ");
digitalWrite (10, LOW);
digitalWrite (11, HIGH);
digitalWrite (12, LOW);
digitalWrite (RELAY_Chauf, LOW);
}

    // Action pour température < 20                    <=== TROP FROID -- LED bleu
if (temperature < 20.00) {
  lcd.setCursor(0,1);
  lcd.print("    Chauffage OK        ");
digitalWrite (10, HIGH);
digitalWrite (11, LOW);
digitalWrite (12, LOW);
digitalWrite (RELAY_Chauf, HIGH);
}

    // Action pour température > 30                    <=== TROP CHAUD -- LED rouge
if (temperature > 30.00) {
  lcd.setCursor(0,1);
  lcd.print("Extracteur OK       ");
digitalWrite (10, LOW);
digitalWrite (11, LOW);
digitalWrite (12, HIGH);
digitalWrite (RELAY_Chauf, LOW);
}

  //Action pour hygrometrie >= 60 & <= 70               <=== TOUT EST OK -- LED verte
if (humidite >= 60.00 & humidite <= 70.00) {
lcd.setCursor(0,3);
lcd.print("OK                  ");
digitalWrite (7, LOW);
digitalWrite (8, HIGH);
digitalWrite (9, LOW);
digitalWrite (RELAY_Hygro, LOW);
}

  //Action pour hygrometrie < 60                     <=== TROP SEC -- LED blanc
if (humidite < 60.00) {
lcd.setCursor(0,3);
lcd.print("Humidificateur OK   "); 
digitalWrite (7, HIGH);
digitalWrite (8, LOW);
digitalWrite (9, LOW);
digitalWrite (RELAY_Hygro, HIGH);
}

  //Action pour hygrometrie > 70               <=== TROP HUMIDE -- LED jaune
if (humidite > 70.00) {
lcd.setCursor(0,3);
lcd.print("Deshumidificateur OK");
digitalWrite (7, LOW);
digitalWrite (8, LOW);
digitalWrite (9, HIGH);
digitalWrite (RELAY_Hygro, LOW);
}
}

Bien sur je suis à l'écoute de toutes autres alternatives et d'amélioration de mon code Arduino (on m'a parlé de tableaux pour mieux organiser mes LEDs mais un peu complexe, je le reporte a plus tard)

Merci à vous.

Le \t après % ne sert à rien.
Le sketch ARDUINO va envoyer :

Température: 12 *C
Hygrométrie: 40 %	

C'est à dire une donnée par ligne.
Alors que le sketch de l'auteur envoie une seule donnée, une distance.

Je conseillerais d'envoyer les deux données sur une seule ligne :

Température: 12 *C Hygrométrie: 40 %

Ainsi la fonction PYTHON split() renverra :

['Température:', '12', '*C', 'Hygrométrie:', '40', '%']

Ensuite :
temperature = float(listeDonnees[1].decode())
humidite = float(listeDonnees[4].decode())

Merci à toi pour ton retour HBACHETTI

Ha oui mince, une petite coquille qui trainant

Je comprend l'idée j'ai modifié la partie Arduino merci, je nage un peu pour la suite, mais merci j'apprend comme ça.

Une petite aide :
plot.zip (1.5 KB)
Si tu ne connais pas PYTHON :
Autant commencer par la version PYTHON3.
Il faut bien entendu installer python3-serial et python3-matplotlib
Pas d'accolades, c'est l'indentation qui remplace. L'auteur a utilisé 4 espaces, donc il faut faire la même chose (tabulations déconseillées)

J'ai remplacé cette fonction :

def recup_port_Arduino() :
    ports = list(serial.tools.list_ports.comports())
    for p in ports:
        if 'Arduino' in p.description :
            mData = serial.Serial(p.device,9600)
    print(mData.is_open) # Affiche et vérifie que le port est ouvert
    print(mData.name) # Affiche le nom du port 
    return mData

Par :

def recup_port_Arduino() :
    port = serial.Serial('/dev/ttyUSB0', baudrate=115200, bytesize=8, parity='N', stopbits=1)
    return port

Parce que suivant l'ARDUINO que tu utilises, il n'y aura pas forcément le mot Arduino dans la description du port série. J'ai mis le port en dur.

Remplace /dev/ttyUSB0 par le nom de ton port série.
Profites-en pour changer la vitesse dans le sketch : 115200

Dernier conseil : le moniteur série IDE ARDUINO doit être fermé.

J'étais justement entrain d'écrire,

J'utilise bien la version 3.10 de python.
Pour les biblio .V3 je vais vérifier ça.
J'ai vu effectivement que l'Arduino ne porte pas forcement ce nom, par exemple sur mac c'est CDC.

Je vais essayer tes nouvelles manips en lisant bien ton fichier.
Car pour l'instant après quelques modifs des 2 codes j'ai un retour sur les données difficiles à lire pour la fonction split

b'Temp\xc3\xa9rature: 23.00 *C Hygrom\xc3\xa9trie: 29.30 % \r\n'
[b'Temp\xc3\xa9rature:', b'23.00', b'*C', b'Hygrom\xc3\xa9trie:', b'29.30', b'%']

Je vais surement trouver ma reponse dans tes nouvelles infos.

Encore merci.

Pour info je me suis inspiré de :

Je connais matplotlib, mais je n'avais encore jamais tracé deux courbes sur le même graphe.
Comme tu vois matplotlib est très documenté sur le WEB.

C'est à cause de l'UTF8.
Remplace Température et Hygrométrie dans le sketch par Temperature et Hygrometrie.

[b'Temperature:', b'25.00', b'*C', b'Hygrometrie:', b'40.00', b'%']

Le b minuscule devant les valeurs veut dire blob.

Dernière chose :

        t_acquisition += 2

Dans le script PYTHON j'augmente le max sur l'axe des X.
Si dans le sketch tu changes delay(2000) par autre chose, fais la même chose dans le script.

Petite amélioration :

#define PERIOD    4000

void setup() {
  Serial.begin(115200);
  Serial.print("Period: ");
  Serial.println(PERIOD);
}
 
void loop() {
  delay(PERIOD); // attente d'X seconde entre chaque mesure une fois la boucle revenue au début

Le sketch envoie la période au départ, et le script la reçoit :
plot.zip (1.5 KB)
Changer la valeur de PERIOD dans le sketch suffit donc.
Remarque bien qu'avec cette modif il faut lancer le script avant le sketch.

Pour palier à ce problème, autant envoyer la période à chaque fois :

  Serial.print("Period: ");
  Serial.println(PERIOD);
  Serial.print("Temperature: ");
  Serial.print(temperature);
  Serial.print(" *C ");
  Serial.print("Hygrometrie: ");
  Serial.print(humidite);
  Serial.println(" %");

Ainsi le script ne sera pas déboussolé si l'ARDUINO redémarre.
plot2.zip (1.5 KB)

Voilà je pense que tu as (presque) tout.

Merci j'étudie tout ça et comprend certaines subtilités.
Malgré ça j'ai des erreurs et je me demande si cela ne vient pas du PC ( pc de travail qui est sécurisé (autorisation spéciale pour enregistrer à la racine du pc))

Dans le doute je me pose cette question :
J'ai installé ces modules, ma liste est complète ?

  • pip install serial
  • pip install numpy
  • pip install matplotlib
  • pip install scipy
  • pip install ****\Nanpy_Python.zip

En voyant mon message d'erreur quand j'exécute le script j'ai l'impression d'avoir oublié un module "animation" mais il n'ai pas compris dans le module "matplotlib" ?
Par contre cela m'ouvre bien une fenêtre de graph (bien sur sans le graph)

Message Pozy

Running script: "\\DAPDC5\****\Desktop\Arduino\plot.py"
b'Period : 4000\r\n'
[b'Period', b':', b'4000']
Traceback (most recent call last):
  File "C:\Users\****\AppData\Roaming\Python\Python310\site-packages\matplotlib\cbook\__init__.py", line 287, in process
    func(*args, **kwargs)
  File "C:\Users\****\AppData\Roaming\Python\Python310\site-packages\matplotlib\animation.py", line 909, in _start
    self._init_draw()
  File "C:\Users\****\AppData\Roaming\Python\Python310\site-packages\matplotlib\animation.py", line 1698, in _init_draw
    self._draw_frame(frame_data)
  File "C:\Users\****\AppData\Roaming\Python\Python310\site-packages\matplotlib\animation.py", line 1720, in _draw_frame
    self._drawn_artists = self._func(framedata, *self._args)
  File "\\DAPDC5\****\Desktop\Arduino\plot.py", line 36, in animate
    temperature = float(listeDonnees[1].decode())
ValueError: could not convert string to float: ':'
Ecriture dans un fichier txt

Sketch dans l'arduino

#include "DHT.h"//bibliothéque
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define DHTPIN 13 // connexion de la pin digital du capteur sur la broche n°2
#define DHTTYPE DHT22   // on appelle le capteur dht22 dans la bibliothèque
#define PERIOD 4000

const int RELAY_Chauf = 6;
const int RELAY_Hygro = 5;

DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 20, 4);

void setup() {
 
  Serial.begin(115200); //définition de la vitesse du port
  Serial.print("Period : ");
  Serial.println(4000);
  lcd.init(); // initialisation de l'afficheur
  dht.begin(); // initialisation du capteur

  //Positionnement LEDs
  pinMode(10,OUTPUT); // Bleu température froide : en dessous de 20°C
  pinMode(11,OUTPUT); // Vert température : tout est OK
  pinMode(12,OUTPUT); // Rouge température chaude : au dessus de 25°C
  pinMode(7,OUTPUT); // Blanc hygrométrie basse : en dessous de 50%
  pinMode(8,OUTPUT); // Vert hygrometrie : tout est OK
  pinMode(9,OUTPUT); // Jaune hygrométrie haute : au dessus de 80%
  pinMode(6,OUTPUT); // Relais chauffage
  pinMode(5,OUTPUT); // Relais hygrométrie
}
 
void loop() {
 
  delay(PERIOD); // attente d'2 seconde entre chaque mesure une fois la boucle revenue au début
  lcd.backlight(); // eclairage LCD
  float humidite = dht.readHumidity();//lecture de l'humidité.
  float temperature = dht.readTemperature();//lecture de la température en degrés Celsius.
 
  // Si la lecture ne s'effectue pas
  if (isnan(humidite) || isnan(temperature)) {
  Serial.println ("Probleme de lecture, verifier votre systeme");
    return;}

  //Ecriture sur le moniteur
  Serial.print("Period: ");
  Serial.println(PERIOD);
  Serial.print("Temperature: ");
  Serial.print(temperature);
  Serial.print(" *C ");
  Serial.print("Hygrometrie: ");
  Serial.print(humidite);
  Serial.println(" % ");

  //Ecriture température & hygrométrie sur le LCD 20x4
lcd.setCursor(0,0);
lcd.print("   Temp :       C");
lcd.setCursor(10,0);
lcd.print(temperature);
lcd.setCursor(0,2);
lcd.print("   Hygr :       %");
lcd.setCursor(10,2);
lcd.print(humidite);

    // Action pour température > 20 & < 30           <=== TOUT EST OK -- LED verte
if (temperature > 20.00 & temperature < 30.00) {
  lcd.setCursor(0,1);
  lcd.print("OK                  ");
digitalWrite (10, LOW);
digitalWrite (11, HIGH);
digitalWrite (12, LOW);
digitalWrite (RELAY_Chauf, LOW);
}

    // Action pour température < 20                    <=== TROP FROID -- LED bleu
if (temperature < 20.00) {
  lcd.setCursor(0,1);
  lcd.print("    Chauffage OK        ");
digitalWrite (10, HIGH);
digitalWrite (11, LOW);
digitalWrite (12, LOW);
digitalWrite (RELAY_Chauf, HIGH);
}

    // Action pour température > 30                    <=== TROP CHAUD -- LED rouge
if (temperature > 30.00) {
  lcd.setCursor(0,1);
  lcd.print("Extracteur OK       ");
digitalWrite (10, LOW);
digitalWrite (11, LOW);
digitalWrite (12, HIGH);
digitalWrite (RELAY_Chauf, LOW);
}

  //Action pour hygrometrie >= 60 & <= 70               <=== TOUT EST OK -- LED verte
if (humidite >= 60.00 & humidite <= 70.00) {
lcd.setCursor(0,3);
lcd.print("OK                  ");
digitalWrite (7, LOW);
digitalWrite (8, HIGH);
digitalWrite (9, LOW);
digitalWrite (RELAY_Hygro, LOW);
}

  //Action pour hygrometrie < 60                     <=== TROP SEC -- LED blanc
if (humidite < 60.00) {
lcd.setCursor(0,3);
lcd.print("Humidificateur OK   "); 
digitalWrite (7, HIGH);
digitalWrite (8, LOW);
digitalWrite (9, LOW);
digitalWrite (RELAY_Hygro, HIGH);
}

  //Action pour hygrometrie > 70               <=== TROP HUMIDE -- LED jaune
if (humidite > 70.00) {
lcd.setCursor(0,3);
lcd.print("Deshumidificateur OK");
digitalWrite (7, LOW);
digitalWrite (8, LOW);
digitalWrite (9, HIGH);
digitalWrite (RELAY_Hygro, LOW);
}}

Le script affiche bien [b'Period', b':', b'4000'], il a donc compris la première ligne. Par contre je ne vois pas apparaître la suite.
Essaie de modifier le script comme suit :

`    listeDonnees = line1.split()
    print (listeDonnees)
    if len(listeDonnees)!= 0 : # parfois des lignes de données vides peuvent être envoyées, il faut les "écarter"
        if listeDonnees[0] == b'Period:':
            period = int(listeDonnees[1])
            period /= 1000
            print("period: %d" % period)
        else:
            print (listeDonnees[1])          # AJOUTER un AFFICHAGE ICI
            temperature = float(listeDonnees[1].decode())
`

Dans Setup() :

Le premier affichage de PERIOD est inutile puisqu'on le répète à chaque mesure dans loop().
Mais normalement cela ne doit pas gêner.

EDIT : le problème est bien dans le sketch. De plus tu as écrit "Period : " avec un espace avant : .

Désolé de mon incompétence ... Je débute en code, mais c'est face au problème qu'on apprend ...

Le rapport d'erreur évolue :
le script : avec les modifs que tu m'as conseillé

#importation des modules
import serial
import serial.tools.list_ports # pour la communication avec le port série
import matplotlib.pyplot as plt  # pour le tracé de graphe
from matplotlib import animation # pour la figure animée
import time # gestion du temps

#initialisation des listes

liste_temps_mesure =[] # liste pour stocker le temps"brut"
liste_temps=[] # liste pour stocker les valeurs de temps en partant de t=0
liste_temperature = [] # liste pour stocker les valeurs
liste_humidite = [] # liste pour stocker les valeurs

t_acquisition = 6.0
period = 4.0
hummax= 100 # en %


#pour le graphe en temps réel
def animate(i):
    global t_acquisition, period
    line1 = Data.readline()
    print (line1)
    # on retire les caractères d'espacement en début et fin de chaîne
    listeDonnees = line1.strip()
    # on sépare les informations reçues séparées par les espaces et on stocke ces informations dans une liste pour chacune de lignes
    listeDonnees = line1.split()
    print (listeDonnees)
    if len(listeDonnees)!= 0 : # parfois des lignes de données vides peuvent être envoyées, il faut les "écarter"
        if listeDonnees[0] == b'Period:':
            period = int(listeDonnees[1])
            period /= 1000
            print("period: %d" % period)
        else:
            print (listeDonnees[1])          # AJOUTER un AFFICHAGE ICI
            temperature = float(listeDonnees[1].decode())
            humidite = float(listeDonnees[4].decode())
            tempsmes = time.time()
            liste_temps_mesure.append(tempsmes) # temps mesuré "brut" stocké dans une liste
            tempsreel = tempsmes - liste_temps_mesure[0] # pour faire partir le temps de 0 (cette valeur de temps sera stockée dans une autre liste : liste_temps)

            liste_temperature.append(temperature)
            print("d = %f"%(temperature), " °C") # affichage de la valeur de la distance
            liste_humidite.append(humidite)
            print("d = %f"%(humidite), " %") # affichage de la valeur de la distance
            liste_temps.append(tempsreel)
            print("temps mesuré = %f"%(tempsmes), " s") # affichage de la valeur du temps absolu
            print("temps réel= %f"%(tempsreel), " s") # affichage de la valeur du temps en partant de 0
            temp.set_data(liste_temps,liste_temperature)
            hum.set_data(liste_temps,liste_humidite)
            t_acquisition += period
            plt.xlim(0, t_acquisition)
            return temp, hum

# Fonction pour la récupération des données série venant de la carte Arduino
def recup_port_Arduino() :
    port = serial.Serial('com3', baudrate=115200, bytesize=8, parity='N', stopbits=1)
    return port

Data =recup_port_Arduino()
# Création figure
fig, axes = plt.subplots(nrows=1, ncols=1, figsize=(10, 5))
temp, = plt.plot([],[], color="blue")
hum, = plt.plot([],[], color="red")
plt.xlim(0, t_acquisition)
plt.ylim(0,hummax)
plt.xlabel('temps en s')
plt.ylabel('température', color="blue")
axe2=axes.twinx()
axe2.set_ylabel("humidité",color="red")
plt.grid()

#Animation
ani = animation.FuncAnimation(fig, animate, frames=200,  interval=20,repeat=False)

plt.show()

plt.close(fig)
Data.close() # pour arrêter la lecture des données série

print("Ecriture dans un fichier txt")
lines=['t\td\n'] #première ligne du fichier txt
for i in range (len (liste_temperature)):
    line = str(liste_temps[i]) +'\t'+ str(liste_temperature[i])+'\n'
    lines.append(line)

fichier = open('data_arduino.txt', 'w').writelines(lines) #création d'un nouveau fichier texte

Le sketch arduino : avec des modifs

#include "DHT.h"//bibliothéque
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define DHTPIN 13 // connexion de la pin digital du capteur sur la broche n°2
#define DHTTYPE DHT22   // on appelle le capteur dht22 dans la bibliothèque
#define PERIOD 4000
const int RELAY_Chauf=6;
const int RELAY_Hygro=5;

DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 20, 4);

void setup(){
 
Serial.begin(115200);//définition de la vitesse du port
lcd.init();// initialisation de l'afficheur
dht.begin();// initialisation du capteur

  //Positionnement LEDs
pinMode(10,OUTPUT);// Bleu température froide : en dessous de 20°C
pinMode(11,OUTPUT);// Vert température : tout est OK
pinMode(12,OUTPUT);// Rouge température chaude : au dessus de 25°C
pinMode(7,OUTPUT);// Blanc hygrométrie basse : en dessous de 50%
pinMode(8,OUTPUT);// Vert hygrometrie : tout est OK
pinMode(9,OUTPUT);// Jaune hygrométrie haute : au dessus de 80%
pinMode(6,OUTPUT);// Relais chauffage
pinMode(5,OUTPUT);// Relais hygrométrie
}
 
void loop(){
 
delay(PERIOD);// attente d'2 seconde entre chaque mesure une fois la boucle revenue au début
lcd.backlight();// eclairage LCD
float humidite=dht.readHumidity();//lecture de l'humidité.
float temperature=dht.readTemperature();//lecture de la température en degrés Celsius.
 
  // Si la lecture ne s'effectue pas
if (isnan(humidite) || isnan(temperature)){
Serial.println("Probleme de lecture, verifier votre systeme");
return;}

  //Ecriture sur le moniteur
Serial.print("Period:");
Serial.println(PERIOD);
Serial.print("Temperature:");
Serial.print(temperature);
Serial.print("*C");
Serial.print("Hygrometrie:");
Serial.print(humidite);
Serial.println("%");

  //Ecriture température & hygrométrie sur le LCD 20x4
lcd.setCursor(0,0);
lcd.print("   Temp :       C");
lcd.setCursor(10,0);
lcd.print(temperature);
lcd.setCursor(0,2);
lcd.print("   Hygr :       %");
lcd.setCursor(10,2);
lcd.print(humidite);

    // Action pour température > 20 & < 30           <=== TOUT EST OK -- LED verte
if (temperature > 20.00 & temperature < 30.00){
lcd.setCursor(0,1);
lcd.print("OK                  ");
digitalWrite (10, LOW);
digitalWrite (11, HIGH);
digitalWrite (12, LOW);
digitalWrite (RELAY_Chauf, LOW);
}

    // Action pour température < 20                    <=== TROP FROID -- LED bleu
if (temperature < 20.00){
lcd.setCursor(0,1);
lcd.print("    Chauffage OK        ");
digitalWrite (10, HIGH);
digitalWrite (11, LOW);
digitalWrite (12, LOW);
digitalWrite (RELAY_Chauf, HIGH);
}

    // Action pour température > 30                    <=== TROP CHAUD -- LED rouge
if (temperature > 30.00){
lcd.setCursor(0,1);
lcd.print("Extracteur OK       ");
digitalWrite (10, LOW);
digitalWrite (11, LOW);
digitalWrite (12, HIGH);
digitalWrite (RELAY_Chauf, LOW);
}

  //Action pour hygrometrie >= 60 & <= 70               <=== TOUT EST OK -- LED verte
if (humidite >= 60.00 & humidite <= 70.00){
lcd.setCursor(0,3);
lcd.print("OK                  ");
digitalWrite (7, LOW);
digitalWrite (8, HIGH);
digitalWrite (9, LOW);
digitalWrite (RELAY_Hygro, LOW);
}

  //Action pour hygrometrie < 60                     <=== TROP SEC -- LED blanc
if (humidite < 60.00){
lcd.setCursor(0,3);
lcd.print("Humidificateur OK   "); 
digitalWrite (7, HIGH);
digitalWrite (8, LOW);
digitalWrite (9, LOW);
digitalWrite (RELAY_Hygro, HIGH);
}

  //Action pour hygrometrie > 70               <=== TROP HUMIDE -- LED jaune
if (humidite > 70.00){
lcd.setCursor(0,3);
lcd.print("Deshumidificateur OK");
digitalWrite (7, LOW);
digitalWrite (8, LOW);
digitalWrite (9, HIGH);
digitalWrite (RELAY_Hygro, LOW);
}}

Le message d'erreur :

Python 3.10.4 (tags/v3.10.4:9d38120, Mar 23 2022, 23:13:41) on Windows (64 bits).
This is the Pyzo interpreter with integrated event loop for ASYNCIO.
Type 'help' for help, type '?' for a list of *magic* commands.

Running script: "\\DAPDC5\****\Desktop\Arduino\Plot V2.py"
Traceback (most recent call last):
  File "\\DAPDC5\****\Desktop\Arduino\Plot V2.py", line 61, in <module>
    Data = recup_port_Arduino()
  File "\\DAPDC5\****\Desktop\Arduino\Plot V2.py", line 58, in recup_port_Arduino
    port = serial.Serial('COM3', baudrate=115200, bytesize=8, parity='N', stopbits=1)
AttributeError: module 'serial' has no attribute 'Serial'

Si je comprend bien maintenant c'est la comunication qui se fait mal ?? J'ai essayé avec l'autre bout de code (l'original) l'erreur est la même. Je suis bien sur le COM3 pourtant

Sinon la command "serial" ???
j'ai vérifié je l'ai bien installé :

pip install serial
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: serial in c:\users\****\appdata\roaming\python\python310\site-packages (0.0.97)
Requirement already satisfied: iso8601>=0.1.12 in c:\users\****\appdata\roaming\python\python310\site-packages (from serial) (1.0.2)
Requirement already satisfied: pyyaml>=3.13 in c:\users\****\appdata\roaming\python\python310\site-packages (from serial) (6.0)
Requirement already satisfied: future>=0.17.1 in c:\users\****\appdata\roaming\python\python310\site-packages (from serial) (0.18.2)

Je peux comprendre si le soucis devient un peu "lourd" et qu'il n'y est pas une correction.
Je peux reprendre mon sketch arduino mais en le réécrivant avec python ( une 1ere fois) si cela peut faciliter les choses.

Tout à fait étonnant, tout à l'heure l'objet Serial était bien créé puisqu'il recevait :
b'Period : 4000\r\n'
En tous cas le code PYTHON que tu as posté fonctionne chez moi.

Avec un simple code comme celui-ci :

import serial
port = serial.Serial('COM3', baudrate=115200, bytesize=8, parity='N', stopbits=1)
print(port.readline())

Si cela ne marche pas, il y a un pb d'installation de python-serial.

EDIT : peut-être as-tu créé dans ton répertoire un fichier nommé serial ???

Toujours pas, il n'est pas content

>>> import serial
port = serial.Serial('COM3', baudrate=115200, bytesize=8, parity='N', stopbits=1)
print(port.readline())
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: module 'serial' has no attribute 'Serial'
Traceback (most recent call last):
  File "<console>", line 1, in <module>
NameError: name 'port' is not defined

Mais effectivement je pense comme toi qu'il y a un soucis avec l'installation des modules, je vais delete python et pyzo.
Je crois pas avoir créé un dossier "serial" ( en même temps je sais pas où sont stockés les modules ) ou sinon c'est involontaire.

J'ai réinitialisé l'arduino pensant que le soucis venait de lui mais non, donc une init de pyzo et de python va surement régler le problème.

Week end chargé, mais je donnerai suite au post que le soucis soit réglé ou non.

Mais merci encore pour le temps que tu prends pour m'aider.

PS : si tu as une idée des modules indispensable à avoir je suis preneur, même si il ne me serve pas pour ce code. Je vais déjà mettre ceux la :

  • pip install serial
  • pip install numpy
  • pip install matplotlib
  • pip install scipy
  • pip install ****\Nanpy_Python.zip

As-tu vu cette remarque ?

Sinon, dans la console PYTHON (lancer python en ligne de commande) :

Python 3.8.10 (default, Mar 15 2022, 12:22:08)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
> import serial
> dir(serial)
['CR', 'EIGHTBITS', 'FIVEBITS', 'LF', 'PARITY_EVEN', 'PARITY_MARK', 'PARITY_NAMES', 'PARITY_NONE', 'PARITY_ODD', 'PARITY_SPACE', 'PosixPollSerial', 'SEVENBITS', 'SIXBITS', 'STOPBITS_ONE', 'STOPBITS_ONE_POINT_FIVE', 'STOPBITS_TWO', 'Serial', 'SerialBase', 'SerialException', 'SerialTimeoutException', 'Timeout', 'VERSION', 'VTIMESerial', 'XOFF', 'XON', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', 'basestring', 'importlib', 'io', 'iterbytes', 'os', 'portNotOpenError', 'protocol_handler_packages', 'serial_for_url', 'serialposix', 'serialutil', 'sys', 'time', 'to_bytes', 'unicode', 'writeTimeoutError']

On voit apparaître Serial.

Si ce n'est pas le cas, ce n'est pas OK.
Peut-être avec pip, une suppression de serial et réinstallation suffira.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.