IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Raspberry Pi Discussion :

Erreur lors de la détection d'un switch sur un port gpio


Sujet :

Raspberry Pi

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Aidant
    Secteur : Services à domicile

    Informations forums :
    Inscription : Janvier 2024
    Messages : 52
    Points : 6
    Points
    6
    Par défaut Erreur lors de la détection d'un switch sur un port gpio
    Bonjour à tous,
    Je vous écris ce message car j'ai un problème avec un script python qui me sert à lire et enregistrer des données de météo pour mon raspberry pi.

    Il est principalment basé sur la lecture de température d'une sonde ds18b20 et le lecture de pression et humidité via des détecteusr bmp180 et dht22.

    J'ai aussi un pliviomètre à godet et un anémomètre et j'utilise la fonction add_event_detection() pour détecter et enregistrer la fermeture d'un contact quand le godet du pluviomètre s'abaisse et idem pour détecter la rotation de l'anémomètre.
    Le pluviomètre et l'anémomètre sont connectés à deux ports gpio différents. Pour chacun d'entre eux la détection du switch appelle une fonction qui enregistre dans un fichier l'heure précise de l'évènement pour que je puisse par la suite en déterminer la quantité d'eau tombée en 24h et la vitesse du vent.

    Seulement voilà quand je lance le script la partie lecture des différentes sonde se passe bien mais j'obtiens un erreur :

    Traceback (most recent call last):
    File "/home/pi/Domotique/Programmes/Enregistrement_Data_Meteo.py", line 100, in <module>
    GPIO.add_event_detect(port_gpio_anemometre, GPIO.FALLING, callback=my_callback_Anemometre, bouncetime=1000)
    RuntimeError: Conflicting edge detection already enabled for this GPIO channel
    et le fichier qui contient normalement les mm de pluie tombés dans la journée se remplit d'entrées toutes les 5s (ce qui correspond au paramètre bouncetime que j'ai rentré).

    Voici le code :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    import glob
    import urllib.request
    from lxml import etree
    from urllib.error import URLError, HTTPError
    import base64
    import csv
    import sys
    import os
    import time
    from datetime import datetime
    from pathlib import Path
    import RPi.GPIO as GPIO
    import smbus as smbus
    #import Adafruit_DHT
    #from Adafruit_BMP085 import BMP085
    import Adafruit_BMP085 as BMP085
    import simpletest_BMP
    import AdafruitDHT
    #from AdafruitDHT import temperature
    from AdafruitDHT import humidity
    from simpletest_BMP import Pressure_Ext
    from simpletest_BMP import Altitude_Ext
    #sensor = BMP085.BMP085()
     
    GPIO.setmode(GPIO.BCM)
     
    while  True :
     
        port_gpio_anemometre=13
        port_gpio_pluvio=19
        sonde_exterieure = '/28-3c01f095d48b'
     
        base_dir = '/sys/bus/w1/devices'
        sonde_ext = base_dir + '/28-3c01f095d48b/w1_slave'
        #Définition de la date sous la forme "MoisAnnee" en français.
        current_datetime = datetime.now()
        current_date = current_datetime.strftime("%B%Y") 
        Mois=['Jjanvier','février','mars','avril','mai','juin','juillet','aout','septembre','octobre','novembre','décembre']
        mois = current_datetime.date().month
        Q = Mois[mois-1]
        current_date = Q + current_datetime.strftime("%Y") 
        #print(current_date)
        Record_dir = '/home/pi/Domotique/Donnees_Meteo/' + current_date
        Record_file = Record_dir + f"/{current_date}.txt"
     
     
     
        def extraire_temperature (sonde) :
            f_sonde = open(sonde, 'r')
            lines_sonde = f_sonde.readlines()
            while lines_sonde == []:
                time.sleep(0.5)
        #        print('pas de donnees')
                lines_sonde = f_sonde.readlines()
            donnees_temperature = lines_sonde[1].split(" ")[9]
            Temp = float(donnees_temperature[2:]) / 1000
            return Temp
    #Lecture de la temperature exterieure    
        Temp_exterieure = extraire_temperature(sonde_ext)
    #    print(Temp_exterieure)
     
    #Detection implusion pluviometre gpio19
        def my_callback_Pluviometre(port_gpio_pluvio):
            current_datetime = datetime.now()
            current_date = current_datetime.strftime("%d-%m-%Y")
            current_time = current_datetime.strftime("%H:%M:%S")
            Record_file_Pluviometre = Record_dir + f"/Pluviometre_{current_date}.txt"
            data_to_write = {"Date": current_date, "Heure": current_time}
            with open(Record_file_Pluviometre, "a", newline="", encoding="utf-8") as f:
                writer = csv.DictWriter(f, fieldnames=data_to_write.keys())
                writer.writerow(data_to_write)
     
            GPIO.setup(port_gpio_pluvio, GPIO.IN, pull_up_down=GPIO.PUD_UP)
            GPIO.add_event_detect(port_gpio_pluvio, GPIO.RISING, callback=my_callback_Pluviometre, bouncetime=5000) 
     
        def my_callback_Anemometre(port_gpio_anemometre):
            current_datetime = datetime.now()
            current_date = current_datetime.strftime("%d-%m-%Y")
            current_time = current_datetime.strftime("%H:%M:%S")
            Record_file_Anemometre = Record_dir + f"/Anemometre_{current_date}.txt"
            data_to_write = {"Date": current_date, "Heure": current_time}
            with open(Record_file_Anemometre, "a", newline="", encoding="utf-8") as f:
                writer = csv.DictWriter(f, fieldnames=data_to_write.keys())
                writer.writerow(data_to_write)
     
        GPIO.setup(port_gpio_anemometre, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
        GPIO.add_event_detect(port_gpio_anemometre, GPIO.FALLING, callback=my_callback_Anemometre, bouncetime=1000) 
     
        try:
            root = {"Temp_Ext": Temp_exterieure,"Pression_Ext": Pressure_Ext/100,"Alt_Ext": round(Altitude_Ext,2),"Humidite" : round(humidity,2)/100}
            current_datetime = datetime.now()
            current_time = current_datetime.strftime("%H:%M:%S")
            Record_file = Record_dir + f"/{current_date}.txt"  
            current_date = current_datetime.strftime("%d-%m-%Y")
            data_to_write = {"Date": current_date, "Heure": current_time}
            data_to_write.update(root)
            file_exists = os.path.isfile(Record_file)
     
            with open(Record_file, "a", newline="", encoding="utf-8") as f:
                writer = csv.DictWriter(f, fieldnames=data_to_write.keys())
     
                # Écrire l'en-tete si le fichier est nouveau
                if not file_exists:
                    writer.writeheader()
     
                # Écrire les donnees
                writer.writerow(data_to_write)
     
        except HTTPError as e:
            print(f"Erreur HTTP : {e.code} {e.reason}")
     
        except URLError as e:
            print(f"Erreur d'URL : {e.reason}")
     
        except etree.XMLSyntaxError as e:
            print(f"Erreur de syntaxe XML : {e}")
     
        f.close()
        time.sleep(10)

    Sauriez-vous ce qui cloche ?

    Merci d'avance !!

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 651
    Points : 56 979
    Points
    56 979
    Billets dans le blog
    40
    Par défaut
    Bonsoir,

    Tu déclares des constantes et des fonctions dans une boucle infinie while True. Tu ne penses pas que les déclarer une seule fois avant d'entrer dans la boucle devrait suffire ?

    De plus, tu as mis le setup du port gpio du pluvio et la détection d'événement associée à l'intérieur de la fonction callback.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Aidant
    Secteur : Services à domicile

    Informations forums :
    Inscription : Janvier 2024
    Messages : 52
    Points : 6
    Points
    6
    Par défaut
    Merci f-leb pour tes remarques. J'ai fait ce script par ajouts ponctuels et j'en ai perdu de vue les bases importantes. Je vais réorganiser tout ça pour me mettre que l'essentiel dans la boucle while. Je vous redis tout ça demain.
    Merci encore pour ton coup d'œil, a force d'avoir le nez dans son script le débutant que je suis fait des bourdes...

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Aidant
    Secteur : Services à domicile

    Informations forums :
    Inscription : Janvier 2024
    Messages : 52
    Points : 6
    Points
    6
    Par défaut
    Bonjour f-leb.

    j'ai fait les modifications du code pour ne mettre dans la boucle while ce qui doit l'être et pas plus. Mais j'ai toujours ce même problème de conflit :

    Traceback (most recent call last):
    File "/home/pi/Domotique/Programmes/Enregistrement_Data_Meteo.py", line 105, in <module>
    GPIO.add_event_detect(port_gpio_anemometre, GPIO.FALLING, callback=my_callback_Anemometre, bouncetime=1000)
    RuntimeError: Conflicting edge detection already enabled for this GPIO channel
    J'ai aussi un problème récurrent avec un de mes capteurs, celui d'humidité, le DHT22. Est-ce que tu connais ? J'ai du mal à obtenit des données régulière provenant de ce capteur. Pour une valeur enregistrée dans le fichier j'ai au moins 10 ou 15 retours (None None).
    J'ai rajouté une boucle while dans le code pour qu'il relise le capteur s'il retourne None/none mais du coup j'ai presque rien en sortie. Est-ce que tu aurais un idée ?

    Voilà le code :

    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    import glob
    import urllib.request
    from lxml import etree
    from urllib.error import URLError, HTTPError
    import base64
    import csv
    import sys
    import os
    import time
    from datetime import datetime
    from pathlib import Path
    import RPi.GPIO as GPIO
    import smbus as smbus
    #import Adafruit_DHT
    #from Adafruit_BMP085 import BMP085
    import Adafruit_BMP085 as BMP085
    import simpletest_BMP
    import Adafruit_DHT
    #from AdafruitDHT import temperature
    #from AdafruitDHT import humidity
    from simpletest_BMP import Pressure_Ext
    from simpletest_BMP import Altitude_Ext
    #sensor = BMP085.BMP085()
     
    GPIO.setmode(GPIO.BCM)
    port_gpio_anemometre=13
    port_gpio_pluvio=19
    #parametres capteur humidite
    sensor = 22
    pin = 12
     
     
    sonde_exterieure = '/28-3c01f095d48b'
     
    base_dir = '/sys/bus/w1/devices'
    sonde_ext = base_dir + '/28-3c01f095d48b/w1_slave'
    #Definition de la date sous la forme "MoisAnnee" en francais.
    current_datetime = datetime.now()
    current_date = current_datetime.strftime("%B%Y") 
    Mois=['janvier','février','mars','avril','mai','juin','juillet','aout','septembre','octobre','novembre','décembre']
    mois = current_datetime.date().month
    Q = Mois[mois-1]
    current_date = Q + current_datetime.strftime("%Y") 
    #print(current_date)
    Record_dir = '/home/pi/Domotique/Donnees_Meteo/' + current_date
    Record_file = Record_dir + f"/{current_date}.txt"
     
     
     
    def extraire_temperature (sonde) :
        f_sonde = open(sonde, 'r')
        lines_sonde = f_sonde.readlines()
        while lines_sonde == []:
            time.sleep(0.5)
        #        print('pas de donnees')
            lines_sonde = f_sonde.readlines()
        donnees_temperature = lines_sonde[1].split(" ")[9]
        Temp = float(donnees_temperature[2:]) / 1000
        return Temp
     
    #    print(Temp_exterieure)
    #    sys.path.append("simpletest")
     
    #    print('Temp = {0:0.2f} *C'.format(sensor.read_temperature()))
    #    print('Pressure = {0:0.2f} Pa'.format(sensor.read_pressure()))
    #    print('Altitude = {0:0.2f} m'.format(sensor.read_altitude()))
    #    print('Sealevel Pressure = {0:0.2f} Pa'.format(sensor.read_sealevel_pressure()))
     
    #    Pressure_Ext = sensor.read_pressure()/100
    #    print(Pressure_Ext/100)
    #    Altitude_Ext = sensor.read_altitude()
    #    print(round(Altitude_Ext,2))
    #    print(round(temperature,2)*2)
    #    print(round(humidity/100,2))
     
     
    #Detection implusion pluviometre gpio19
    def my_callback_Pluviometre(port_gpio_pluvio):
        current_datetime = datetime.now()
        current_date = current_datetime.strftime("%d-%m-%Y")
        current_time = current_datetime.strftime("%H:%M:%S")
        Record_file_Pluviometre = Record_dir + f"/Pluviometre_{current_date}.txt"
        data_to_write = {"Date": current_date, "Heure": current_time}
        with open(Record_file_Pluviometre, "a", newline="", encoding="utf-8") as f:
            writer = csv.DictWriter(f, fieldnames=data_to_write.keys())
            writer.writerow(data_to_write)
     
    def my_callback_Anemometre(port_gpio_anemometre):
        current_datetime = datetime.now()
        current_date = current_datetime.strftime("%d-%m-%Y")
        current_time = current_datetime.strftime("%H:%M:%S")
        Record_file_Anemometre = Record_dir + f"/Anemometre_{current_date}.txt"
        data_to_write = {"Date": current_date, "Heure": current_time}
        with open(Record_file_Anemometre, "a", newline="", encoding="utf-8") as f:
            writer = csv.DictWriter(f, fieldnames=data_to_write.keys())
            writer.writerow(data_to_write)
     
    while True :
     
        humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
        while humidity is None and temperature is None:
            time.sleep(2)
            humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
        GPIO.setup(port_gpio_anemometre, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
        GPIO.add_event_detect(port_gpio_anemometre, GPIO.FALLING, callback=my_callback_Anemometre, bouncetime=1000) 
        Temp_exterieure = extraire_temperature(sonde_ext)
        GPIO.setup(port_gpio_pluvio, GPIO.IN, pull_up_down=GPIO.PUD_UP)
        GPIO.add_event_detect(port_gpio_pluvio, GPIO.RISING, callback=my_callback_Pluviometre, bouncetime=5000) 
     
        try:
            root = {"Temp_Ext": Temp_exterieure,"Pression_Ext": Pressure_Ext/100,"Alt_Ext": round(Altitude_Ext,2),"Humidite" : round(humidity,2)}
            current_datetime = datetime.now()
            current_time = current_datetime.strftime("%H:%M:%S")
            Record_file = Record_dir + f"/{current_date}.txt"  
            current_date = current_datetime.strftime("%d-%m-%Y")
            data_to_write = {"Date": current_date, "Heure": current_time}
            data_to_write.update(root)
            file_exists = os.path.isfile(Record_file)
     
            with open(Record_file, "a", newline="", encoding="utf-8") as f:
                writer = csv.DictWriter(f, fieldnames=data_to_write.keys())
     
                # Écrire l'en-tete si le fichier est nouveau
                if not file_exists:
                    writer.writeheader()
     
                # ecrire les donnees
                writer.writerow(data_to_write)
     
        except etree.XMLSyntaxError as e:
            print(f"Erreur de syntaxe XML : {e}")
     
        f.close()
        time.sleep(2)

    Merci d'avance !
    Antoine

  5. #5
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 651
    Points : 56 979
    Points
    56 979
    Billets dans le blog
    40
    Par défaut
    Bonjour,

    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        GPIO.setup(port_gpio_anemometre, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
        GPIO.add_event_detect(port_gpio_anemometre, GPIO.FALLING, callback=my_callback_Anemometre, bouncetime=1000) 
     
        ...
     
        GPIO.setup(port_gpio_pluvio, GPIO.IN, pull_up_down=GPIO.PUD_UP)
        GPIO.add_event_detect(port_gpio_pluvio, GPIO.RISING, callback=my_callback_Pluviometre, bouncetime=5000)

    Bis repetita placent
    La configuration des broches et des événements devrait être en dehors du while True.

    Dans une boucle infinie, tu ajoutes une détection d'événement sur un port déjà configuré pour détecter un front, d'où le message : RuntimeError: Conflicting edge detection already enabled for this GPIO channel.

    boucetime=5000 signifie aussi que si le godet bascule plusieurs fois en 5 secondes, seul le 1er basculement sera pris en compte. Le système ne risque-t-il pas d'"oublier" des basculements en cas de forte pluie ?
    Je me pose la même question pour l'anémomètre avec bouncetime=1000...

    Je n'ai pas trop de temps maintenant, je reviens plus tard pour le reste

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Aidant
    Secteur : Services à domicile

    Informations forums :
    Inscription : Janvier 2024
    Messages : 52
    Points : 6
    Points
    6
    Par défaut
    Merci f-leb pour ta réponse.

    Par contre pour cette histoire de conflit, pardonne moi mais je ne comprends pas. Les deux GPIO.setup, les deux add_event_detection et les fonctions associées sont sur deux ports GPIO différents : port_gpio_pluvio (port 13) et port_gpio_anemometre (port 19).
    Pourquoi ce conflit, dois-je faire deux scripts différents ?

    Pour le paramètre bouncetime tu as entièrement raison il est mal réglé. Je l'avais au départ réglé sur 1000 pour le pluviomètre, pour laisser le temps au godet de se remettre en position après s'être vidé mais mon fichier de sortie se remplissait de lignes une fois par seconde. J'ai changé sur 5000 et le fichier de sortie s'est rempli de lignes toutes les 5s... Je me doute que cela est dû à la boucle while True mais si je sors les détections d'évènement de la boucle est-ce que celles-ci se feront toujours à tout moment alors que l'enregistrement des données des capteurs tourne derrière ?


    Merci d'avance !

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Aidant
    Secteur : Services à domicile

    Informations forums :
    Inscription : Janvier 2024
    Messages : 52
    Points : 6
    Points
    6
    Par défaut
    J'ai sorti les deux GPIO.setup et leur add_event_detection associés de la boucle while True et je n'y ai laissé que les lectures des capteurs de température, pression et humidité.
    Curieusement la fréquence de lecture du capteur d'humidité s'est un peu améliorée.. ?? j'ai quelques valeurs pendant une minute puis le capteur est muet pendant quelques minutes et cela recommence.

    Il vient de se mettre à pleuvoir par chez moi, je vais voir si j'obtiens quelque chose du pluviomètre.

    Effectivement maintenant je n'ai plus cette erreur de conflit mais je ne comprends toujours pas très bien pourquoi...

  8. #8
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 651
    Points : 56 979
    Points
    56 979
    Billets dans le blog
    40
    Par défaut
    Citation Envoyé par Toine74 Voir le message
    Par contre pour cette histoire de conflit, pardonne moi mais je ne comprends pas. Les deux GPIO.setup, les deux add_event_detection et les fonctions associées sont sur deux ports GPIO différents : port_gpio_pluvio (port 13) et port_gpio_anemometre (port 19).
    Pourquoi ce conflit, dois-je faire deux scripts différents ?
    Ce n'est pas entre les ports 13 et 19 qu'il y a conflit.

    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    while True:
        ...
     
        GPIO.setup(port_gpio_anemometre, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
        GPIO.add_event_detect(port_gpio_anemometre, GPIO.FALLING, callback=my_callback_Anemometre, bouncetime=1000) 
     
        ...
     
        GPIO.setup(port_gpio_pluvio, GPIO.IN, pull_up_down=GPIO.PUD_UP)
        GPIO.add_event_detect(port_gpio_pluvio, GPIO.RISING, callback=my_callback_Pluviometre, bouncetime=5000)

    Pour les setup, le Raspberry n'est pas sourd Quand tu lui dis une fois que telle broche est configurée en entrée avec pull-up ou pull-down, il n'y a pas besoin de lui répéter à l'infini. Une fois suffit, et le Pi retient la configuration ==> à sortir du while True.

    Pour la détection d'événement, c'est pire car tu as un message d'erreur. Les broches ne peuvent retenir qu'une configuration de détection à la fois. Quand tu mets un GPIO.add_event_detect(port_gpio_pluvio, ...), la broche est configurée une fois pour toute pour détecter un front. Quand tu reviens la deuxième fois rajouter le même GPIO.add_event_detect(port_gpio_pluvio, ...), le Pi râle parce que pour cette même broche il y a déjà une détection d'événement configurée ==> à sortir du while True également.

    Après, en relisant ton programme, je ne comprends pas bien ta stratégie...
    Tu rajoutes une ligne dans un fichier à chaque bascule. Si le godet ne bascule que quelques fois par minute même en cas de forte pluie, pourquoi pas...

    Tu rajoutes aussi une ligne dans un fichier à chaque front descendant du signal de l'anémomètre (avec une pause antirebond de 5s ???!!). Si c'est un anémomètre avec plusieurs impulsions par tour et qui tourne à plusieurs dizaines de tours par minute, la carte SD va fumer, et rien ne va dans la méthode, car tu ne mesures pas la fréquence de rotation de la sorte. Quel matériel utilises-tu pour l'anémomètre ?

    Et en plus, tu enregistres dans un fichier la température et l'humidité toutes les 2 secondes !!?? En plus de faire fumer la carte SD (ce qui doit ralentir pas mal le système), la météo est-elle si changeante chez toi au point d'enregistrer ses variations toutes les deux secondes ?

    En fait, rien ne marche... Je t'invite à tester chaque composant (pluvio, anémomètre, température/humidité) séparément avant de tout rassembler. L'anémomètre étant le cas le plus délicat à traiter car il faut mesurer une fréquence...

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Aidant
    Secteur : Services à domicile

    Informations forums :
    Inscription : Janvier 2024
    Messages : 52
    Points : 6
    Points
    6
    Par défaut
    Hello,

    Merci pour ta réponse !

    Effectivement maintenant que j'ai retiré les GPIO.setup et les add_event_detection de la boucle cela marche beaucoup mieux...

    Si je comprends bien la commande add_event_detection fonctionnent "en boucle" par elle-même et détectera les changements d'état de la broche indépendamment même si une boucle while True tourne ailleurs dans le programme ?

    Pour les boucetime comme je disais tu as raison ils sont mal réglés. J'ai remis celui du pluvio sur 1000 et avec la pluie de cette nuit j'ai eu des entrées dans mon fichier de sortie, avec une fréquence un peu bizarre (deux en 3 minutes puis rien en deux heure puis encore 2 en 5 minutes). C'est peut-être dû à la pluie c'était pendant que je dormais donc je dois encore vérifier cela.
    Quand à l'anémomètre il fonctionne via une led infrarouge avec son détecteur associé qui est masqué un bref instant à chaque rotation du capteur. Je sais bien que 5000 est un chiffre énorme qui ne va pas du tout. Il faut que je calcule la fréquence max de rotation déduite du vent max admissible par le capteur pour en déduire un bouncetime correct.

    Quand à la lecture des capteurs je réalise en lisant ton message que le time.sleep était sur 2 sec (ça sent le copier/collé tout ça, oups...)
    En plus en relisant la doc sur le DHT22 le capteur d'humidité ils disent qu'il est relativement fréquent que le capteur renvoie None/None et qu'il faut retenter de lire.
    Je vais donc augmenter le time.sleep, disont à 30 sec ou 1minute ça devrait être beaucoup mieux...

    Voilà, en tout cas merci pour tes éclaircissements ils m'ont permis d'enfin comprendre comment arranger tout cela je pédalais dans le semoule depuis un petit moment..

    Bonne journée !

  10. #10
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 651
    Points : 56 979
    Points
    56 979
    Billets dans le blog
    40
    Par défaut
    Citation Envoyé par Toine74 Voir le message
    Si je comprends bien la commande add_event_detection fonctionnent "en boucle" par elle-même et détectera les changements d'état de la broche indépendamment même si une boucle while True tourne ailleurs dans le programme ?
    Tu configures une interruption matérielle. Dans ta boucle while True, s'il y a un front sur la broche à tout moment, le programme sera interrompu temporairement pour exécuter la fonction callback, puis le programme revient reprendre son cours normal.


    Citation Envoyé par Toine74 Voir le message
    Pour les boucetime comme je disais tu as raison ils sont mal réglés. J'ai remis celui du pluvio sur 1000 et avec la pluie de cette nuit j'ai eu des entrées dans mon fichier de sortie, avec une fréquence un peu bizarre (deux en 3 minutes puis rien en deux heure puis encore 2 en 5 minutes). C'est peut-être dû à la pluie c'était pendant que je dormais donc je dois encore vérifier cela.
    Quand à l'anémomètre il fonctionne via une led infrarouge avec son détecteur associé qui est masqué un bref instant à chaque rotation du capteur. Je sais bien que 5000 est un chiffre énorme qui ne va pas du tout. Il faut que je calcule la fréquence max de rotation déduite du vent max admissible par le capteur pour en déduire un bouncetime correct.
    Là aussi ça ne va pas, le bouncetime est une pause antirebond. Il sert à filtrer les rebonds parasites qui peuvent se produire lorsque le signal bascule, notamment pour les dispositifs mécaniques avec des contacts qui ne sont pas parfaits, voir ici. La pause antirebond est très courte et ne doit pas servir à gérer des délais de plusieurs secondes. Pour cela, il faut travailler avec la librairie datetime.

  11. #11
    Membre averti

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 204
    Points : 308
    Points
    308
    Par défaut Capteur météo
    Bonjour Toine74 et f-Leb

    J'interviens dans la discussion pour donner un avis.

    Pour une station météo, il vaut mieux séparer les capteurs et leurs action (mesure) d'avec le système de gestion des mesures.

    J'ai créer une station météo du meme genre (hormis le pluviometre).

    Pour chaque ensemble de capteur j'ai utilisé des Arduino qui collecte les mouvements des capteurs et calculs les mesures de ces capteurs.(vitesse, direction, température, pression, humidité,rayonnement solaire, UV etc....)
    Ensuite, régulièrement (toutes les cinq minutes , les Arduino transmettent les données à une base MariaDB installée
    sur le Raspberry via du HTML.

    Pour l’anémomètre, je suis resté à des moyenne minutes pour vitesse et direction qui sont envoyée à la DB toutes les cinq minutes.
    J'ai par contre des fichiers 10 secondes qui eux sont stocké dans des répertoires, un fichier par jour, un répertoire par mois. Il sont stocké sur une carte SD et transmis tous les jours sur le disque du Raspberry via FTP.

    Il est clair que si l'idée est juste d'avoir les mesures en instantané, tout cela n'est pas nécessaire, mais générer des mesures et ne pas les stocker......

    En plus, séparer les capteurs de mesures permet d'éviter les problème d'interruption et facilite la gestion du temps de réponse des capteurs......
    Avec un Raspberry, il faudrait jouer avec les trheads (ce que je n'ai encore jamais fait.....) tandis que quelque Arduino ne coûtent que quelque dizaine d'euros et me facilite la vie.

    Si un Arduino prend la foudre, on le remplace, et voila, pour le Raspberry aussi, mais les prix sont différent.

    Enfin ce n'est que mon avis...

    Bonne journée

    Michel

Discussions similaires

  1. Erreur lors du chargement d'un nouveau JAR sur TomCat
    Par Lolitaaa dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 21/01/2010, 13h29
  2. Réponses: 0
    Dernier message: 07/10/2009, 11h38
  3. Erreur lors de l'execution d'eclipse j2ee sur vista
    Par coolio971 dans le forum Eclipse
    Réponses: 1
    Dernier message: 10/03/2009, 19h25
  4. Réponses: 2
    Dernier message: 29/08/2008, 22h51
  5. Réponses: 3
    Dernier message: 29/10/2006, 23h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo