Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5

Recuperation des données aléatoire sur DHT22
#1

salut à tous,

je me suis fait un petit projet perso avec capteurs DHT22 et affichage sur LCD 20x4

apres avoir pondu mon bout de code je me suis rendu compte qu'il fallait parfois 20/30 tentatives pour recuperer une info "correcte"

je precise que j'ai 3 sondes qui presentent le meme fonctionnement, elle peuvent parfois fonctionner du 1er coup

voici la commande OS passée :

Code :
[== Indéfini ==]
sudo nice -20 ./Adafruit_DHT 22 14 |grep Temp |awk '{ print $3 }'

j'ai donc du bidouiller mon code pour que la commande passe en boucle avec une pause de 2 secondes

apparement le probleme n'apparait pas avec un arduino

j'ai parcouru le net sans trouver d'info sinon une piste sur une frequence d'horloge
Répondre
#2

Il faut voir le montage et le programme pour plus d'informations.

Regarde du coté de chez Yaug qui a fait un article sur le sujet : http://www.manuel-esteban.com/lire-une-s...pberry-pi/

Raspberry Pi Home Server : http://www.pihomeserver.fr
Hotspot Wifi avec portail captif pour Raspberry Pi: Kupiki Hotspot
Répondre
#3

super, je vais tester ca, merci chris!
Répondre
#4

ca n'a pas resolu mon probleme, je vais donc detailler un peu

alors la commande
Code :
[== Indéfini ==]
sudo nice -20 ./Adafruit_DHT 22 14

me repond ca
Code :
[== Indéfini ==]
Using pin #14
Data (40): 0x1 0xb5 0x0 0xdb 0xb1

au lieu de ca
Code :
[== Indéfini ==]
Using pin #14
Data (40): 0x1 0xb7 0x0 0xfb 0xb3
Temp =  25.1 *C, Hum = 43.9 %

voici mon code (soyez indulgent c'est mon 1er script en python)
Code :
[== Indéfini ==]
#!/usr/bin/python
# -*- coding=utf-8 -*-
# Thermopi - Station Meteo, horloge et date
# Par El Wared - Juin 2015
# Necessite les librairies Adafruit_DHT et RPi_I2C_driver trouvees sur le net

# imports divers
import RPi_I2C_driver
import time
from time import sleep
from datetime import datetime
import os
import sys
from subprocess import *
import locale
locale.setlocale(locale.LC_ALL, 'fr_FR')

# Mise en variable de la bibliotheque du lcd
lcd = RPi_I2C_driver.lcd()

# Fonction qui permet de passer une commande OS
def run_cmd(cmd):
    p = Popen(cmd, shell=True, stdout=PIPE)
    output = p.communicate()[0]
    return output

# Definition des caracteres perso, fais avec http://www.quinapalus.com/hd44780udg.html
fontdata1 = [
        # Char 0 - thermometre
        [ 0x4, 0xa, 0xa, 0xe, 0xe, 0x1f, 0x1f, 0xe],
        # Char 1 - goutte
        [ 0x4, 0x4, 0xa, 0xa, 0x11, 0x11, 0x11, 0xe],
        # Char \x02 - degre celcius
        [0x18, 0x18, 0x0, 0x0, 0x3, 0x4, 0x4, 0x3],
        # Char \x03 - pourcent
        [0x0 ,0x18 ,0x19 ,0x2 ,0x4 ,0x8 ,0x13 ,0x3],
        # Char \x04 - barre char de gauche
        [0x0,0x0,0x0,0x1f,0x0,0x0,0x0,0x0],
        # barre du millieu
        [0x0,0x0,0x0,0x1f,0x4,0x4,0x4,0x4],
        # barre verticale
        [0x4,0x4,0x4,0x4,0x4,0x4,0x4,0x4],
]

# Import des caracteres perso
lcd.lcd_load_custom_chars(fontdata1)


# Mise en variable des GPIO associes au sondes DHT22
sonde1 = 14
sonde2 = 23
sonde3 = 15

# Mise en variable la commande OS dans les variables lire_*
lire_temp1 = "sudo nice -20 ./Adafruit_DHT 22 %d |grep Temp |awk '{ print $3 }'" % (sonde1)
lire_hum1 = "sudo nice -20 ./Adafruit_DHT 22 %d |grep Temp |awk '{ print $7 }'" % (sonde1)
lire_temp2 = "sudo nice -20 ./Adafruit_DHT 22 %d |grep Temp |awk '{ print $3 }'" % (sonde2)
lire_hum2 = "sudo nice -20 ./Adafruit_DHT 22 %d |grep Temp |awk '{ print $7 }'" % (sonde2)
lire_temp3 = "sudo nice -20 ./Adafruit_DHT 22 %d |grep Temp |awk '{ print $3 }'" % (sonde3)
lire_hum3 = "sudo nice -20 ./Adafruit_DHT 22 %d |grep Temp |awk '{ print $7 }'" % (sonde3)

# Creation d'une variable contenant l'heure actuelle
heure = datetime.now().strftime('%H:%M   %d %b')

# Creation des variables des temperatures et humidites pour chaque sonde
t1 = 0
t2 = 0
t3 = 0
h1 = 0
h2 = 0
h3 = 0

# Creation de la fonction qui va aller lire les valeurs des sondes
def acq_valeurs() :
    # Definition des variables t* et h* comme des variables globales
    global t1, t2, t3, h1, h2, h3
    # Creation d'une boucle...
    while True :
        # ... qui va lire les valeurs de la sonde
        t1 = run_cmd(lire_temp1)                
        h1 = run_cmd(lire_hum1)                       
        try:                                    
            # Permet de supprimer un caractere indesirable en fin de chaine http://www.developpez.net/forums/d1527828/autres-langages/python-zope/general-python/affichage-variable-caractere-indesirable/
            t1, h1 = float(t1), float(h1)
            # Test des valeurs pour verifier que ce sont des "float"
            float(t1) and float(h1)                     
            # Si c'est le cas la boule est cassée et passe au prochain bloc
            break
        # En cas d'erreur...
        except ValueError:    
            # ... attente d'une seconde et retour a la lecture des valeurs
            sleep(1)
            
    # Bloc identique a celui du dessus pour la sonde 2        
    while True :                                        
        t2 = run_cmd(lire_temp2)
        h2 = run_cmd(lire_hum2)
        try:
            t2, h2 = float(t2), float(h2)
            float(t2) and float(h2)
            break
        except ValueError:
            sleep(1)
            
    # Bloc identique a celui du dessus pour la sonde 2                
    while True :                                        
        t3 = run_cmd(lire_temp3)
        h3 = run_cmd(lire_hum3)
        try:
            float(t3) and float(h3)
            t3, h3 = float(t3), float(h3)
            break
        except ValueError:
            sleep(1)

# Creation de la fonction qui va afficher sur le lcd avec les valeurs des sondes en parametre            
def affichage(t1, t2, t3, h1, h2, h3):            
    # Bloc d affichage du LCD ligne par ligne
    # Affichage de la date et heure sur la 1ere ligne
    lcd.lcd_display_string(datetime.now().strftime('%H:%M   %d %b'), 1),
    # Affichage de la ligne 2    
    lcd.lcd_display_string("   Piece\x05Salon\x05Ch.1 " , 2),
    # Affichage de la ligne 3 avec t°
    lcd.lcd_display_string("\x00 :%s\x02\x06%s\x02\x06%s\x02" %(t1, t2, t3) , 3),
    # Affichage de la ligne 3 avec hum
    lcd.lcd_display_string("\x01 :%s\x03\x06%s\x03\x06%s\x03"%(h1, h2, h3) , 4),                

# Affichage du lcd avec les valeurs a zero
affichage(t1, t2, t3, h1, h2, h3)

# Boucle principale d'acquisition et d'affichage
while 1:
    # Lecture des sondes via la fonction acq_valeurs()
    acq_valeurs()
    # Boucle de test d'heure et d'affichage
    while 1:
        # Mise en variable de l'heure actuelle...
        heure2 = datetime.now().strftime('%H:%M   %d %b')
        # ... et tester si "heure" est different de "heure2"
        # Permet de changer l'heure a chaque minute (fonction horloge du lcd)
        if heure != heure2 :
            # Si la minute courante est differente, affichage des valeurs mise en variable precedement...
            # ... avec la fonction affichage
            affichage(t1, t2, t3, h1, h2, h3)
            # Mise en variable de l heure courante...
            heure = datetime.now().strftime('%H:%M   %d %b')
            # ... et la boucle est cassee et retourne a la lecture des sondes via la fonction acq_valeurs()
            break
        # Autrement (si heure est egale a heure2)...
        else :
            # Boucle qui permet de laisser passer le temps pour ne renouveller les valeurs que
            # si l'heure courante a change
            while 1:
                # Mise en variable de l heure courante...
                heure2 = datetime.now().strftime('%H:%M   %d %b')
                # ... et si heure est egal a heure2
                if heure == heure2 :
                    # Attente de 2 secondes
                    sleep(2)
                # Autrement (heure different de heure2)
                else:
                    # Affichage des valeurs...
                    affichage(t1, t2, t3, h1, h2, h3)
                    # et la boucle est cassee et retourne a la lecture des sondes via la fonction acq_valeurs()
                    break

grosso modo j'ai de la chance quand j'ai ce genre de sorti à l'ecran...
Code :
[== Indéfini ==]
[email protected] ~/scripts/thermopi $ sudo ./thermopi.py
Sonde1 No Ok
Sonde1 No Ok
Sonde1 No Ok
Sonde1 No Ok
Sonde1 Ok
Sonde2 No Ok
Sonde2 No Ok
Sonde2 No Ok
Sonde2 No Ok
Sonde2 No Ok
Sonde2 No Ok
Sonde2 No Ok
Sonde2 No Ok
Sonde2 Ok
Sonde3 No Ok
Sonde3 Ok
Affichage des valeurs1
Répondre
#5

Bonjour Wared,

Pourquoi tu n'importe pas la librairie Adafruit_DHT dans ton script? (Je suppose que tu l'as correctement compilée)
Par exemple le script Adafruit_DHT.py que fournit Adafruit comme exemple d'usage de sa librairie :
Code :
#!/usr/bin/python
# Copyright (c) 2014 Adafruit Industries
# Author: Tony DiCola

# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:

# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
import sys

import Adafruit_DHT


# Parse command line parameters.
sensor_args = { '11': Adafruit_DHT.DHT11,
                '22': Adafruit_DHT.DHT22,
                '2302': Adafruit_DHT.AM2302 }
if len(sys.argv) == 3 and sys.argv[1] in sensor_args:
    sensor = sensor_args[sys.argv[1]]
    pin = sys.argv[2]
else:
    print 'usage: sudo ./Adafruit_DHT.py [11|22|2302] GPIOpin#'
    print 'example: sudo ./Adafruit_DHT.py 2302 4 - Read from an AM2302 connected to GPIO #4'
    sys.exit(1)

# Try to grab a sensor reading.  Use the read_retry method which will retry up
# to 15 times to get a sensor reading (waiting 2 seconds between each retry).
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)

# Note that sometimes you won't get a reading and
# the results will be null (because Linux can't
# guarantee the timing of calls to read the sensor).  
# If this happens try again!
if humidity is not None and temperature is not None:
    print 'Temp={0:0.1f}*C  Humidity={1:0.1f}%'.format(temperature, humidity)
else:
    print 'Failed to get reading. Try again!'

Comme tu vois, il suffirait d'appeler
Code :
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
dans ton script. Pour commencer tu peux tester avec ce bout de script (avec sudo). La méthode .read_retry devrait permettre d'effectuer la bonne lecture.

Cool
Répondre
#6

En gros, je me base sur ce qui est écrit sur le github d'adafruit : https://github.com/adafruit/Adafruit_Python_DHT

Cool
Répondre
#7

salut gambit,

c'est super comme idée, ca va alleger tout ca

alors apres avoir telechargé le master je suis allé dans le repertoire du DHT pour python et j'ai lancé le sudo python setup.py install, je pense que tout est configuré comme il faut, à moins que j'ai loupé un épisode...

quand je lance le script j'ai une erreur sur le "import Adafruit_DHT", je lui ai copié le fichier dans le repertoire de mon script pour avoir au final une erreur sur le "read_retry"

en fouinant un peu j'ai vu que la difference entre ton script posté plus haut et celui du repertoire Adafruit_DHT_Driver_python est dans les imports, au lieu de faire un "import Adafruit_DHT" en debut de scipt j'ai un 'import dhtreader"....
Répondre
#8

re,

j'ai fini par m'en sortir apres avoir ré installé raspbian et tout fait bien propre ca fonctionne nickel comme ca, plus aucun soucis, les acquisitions se font tout le temps parfaitement

merci gambit pour le coup de main
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)