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

Python Discussion :

Affichage variable et caractere indesirable


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2015
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Affichage variable et caractere indesirable
    Bonjour à tous,

    Je rencontre un soucis avec l'affichage de variable sur un ecran LCD, j'ai testé avec plusieurs bibliotheques differentes et le caractere change parfois mais est toujours present.

    Un caractere vient systematiquement se coller apres que j'affiche une valeur recuperee dans une variable

    Un exemple sera pus concret

    Voici mon bout de code, soyez indulgents, ce sont mes debuts :

    Code : 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
    #!/usr/bin/python
    # Station Meteo
     
    # on importe le pilote
    import RPi_I2C_driver
    import time
    from time import sleep
    from datetime import datetime
    import os
    import sys
    from subprocess import *
    GPIO.setwarnings(False)
     
    # on initialise le 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
     
    # On definit les GPIO associes au sondes DHT22
    sonde1 = 14
    sonde2 = 23
    sonde3 = 15
     
    # On definit 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)
     
    # Boucle qui lit les valeurs de la sonde et verifie que ce sont des float
    while True :
    	temperature1 = run_cmd(lire_temp1)                                     # Lance la commande de lecture de la sonde et met en variable le resultat
    	humidite1 = run_cmd(lire_hum1)                                           # Lance la commande de lecture de la sonde et met en variable le resultat
    	try:                                                                                   # Test des ...
    		float(temperature1) and float(humidite1) 	                # ... valeurs pour voir si ce sont des float
    		print "sonde 1 => Ok"
    		break										# Si oui on casse la boucle
    	except ValueError:								# Sinon
    		print "sonde 1 erreur, nouvel essai..."		                # On affiche un message et on reessaye
    		sleep(1)									# On s endors 1 seconde et on recommence la boucle
     
    while True :										# Idem au bloc du dessus avec temperature2
    	temperature2 = run_cmd(lire_temp2)
    	humidite2 = run_cmd(lire_hum2)
    	try:
    		float(temperature2) and float(humidite2)
    		print "sonde 2 => Ok"
    		break
    	except ValueError:
    		print "sonde 2 erreur, nouvel essai..."
    		sleep(1)
     
    while True :										# Idem au bloc du dessus avec temperature2
    	temperature3 = run_cmd(lire_temp3)
    	humidite3 = run_cmd(lire_hum3)
    	try:
    		float(temperature3) and float(humidite3)
    		print "sonde 3 => Ok"		
    		break
    	except ValueError:
    		print "sonde 3 erreur, nouvel essai..."
    		sleep(1)
     
     
    # Bloc d affichage du LCD ligne par ligne
    lcd.lcd_display_string(datetime.now().strftime('  %d %b       %H:%M'), 1)	                	        # Affichage de la date et heure sur la 1ere ligne
    lcd.lcd_display_string("      Sal. Ch.1 Ext" , 2)								                # Affichage de la ligne 2
    lcd.lcd_display_string("Temp :%s%s%s" %(temperature1, temperature2, temperature3) , 3)		# Affichage de la ligne 3 avec t°
    lcd.lcd_display_string("Hum  :%s%s%s"%(humidite1, humidite2, humidite3) , 4)				# Affichage de la ligne 3 avec hum
    et le resultat sur le LCD :
    Images attachées Images attachées  

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 398
    Points : 36 957
    Points
    36 957
    Par défaut
    Salut,

    Lorsque vous écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lcd.lcd_display_string("Temp :%s%s%s" %(temperature1, temperature2, temperature3) , 3)
    Vous expédiez une chaine de caractères via le GPIO.
    Si cette chaine de caractère s'affiche correctement "ailleurs":
    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> s = "Temp :%s%s%s" % (1.0, 2.0, 3.0)
    >>> s
    'Temp :1.02.03.0'
    alors côté programmation, il n'y a rien à voir ni à faire car c'est le matériel (ce que fait le LCD des caractères reçus) qui est en cause.

    - W

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2015
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    je ne pense pas car lorsque j'ai testé d'inserer ce code apres "sonde1 =>Ok":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "%s, %s" %(temperature1, humidite1)
    j'ai eu ce retour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    sonde 1 erreur, nouvel essai...
    sonde 1 erreur, nouvel essai...
    sonde1 => Ok
    21.9
    , 56.7
     
    sonde2 erreur, nouvel essai...
    ...
    c'est comme si un retour chariot etait indiqué et il apparait aussi dans le print

  4. #4
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par wared05 Voir le message
    c'est comme si un retour chariot etait indiqué et il apparait aussi dans le print
    Bonsoir,
    Heu…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> cste = "Coucou,\nC'est moi!!"
    >>> cste
    "Coucou,\nC'est moi!!"
    >>> print(cste)
    Coucou,
    C'est moi!!
    Il est facile de vérifier s'il y a, ou non, un retour à la ligne!

    Et si tel est le cas, de l'enlever (avec join et splitlines ou avec replace si le/les caractères sont connus)!!

    Clodion

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2015
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    salut clodion,

    j'avoue avoir du relire quelques fois ton post, j'ai ensuite tenté ca apres la declaration de la variable :

    sans succès

    je continue mes recherches, merci de ton aide

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 398
    Points : 36 957
    Points
    36 957
    Par défaut
    Citation Envoyé par wared05 Voir le message
    je ne pense pas car lorsque j'ai testé d'inserer ce code apres "sonde1 =>Ok":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "%s, %s" %(temperature1, humidite1)
    j'ai eu ce retour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    sonde 1 erreur, nouvel essai...
    sonde 1 erreur, nouvel essai...
    sonde1 => Ok
    21.9
    , 56.7
     
    sonde2 erreur, nouvel essai...
    ...
    c'est comme si un retour chariot etait indiqué et il apparait aussi dans le print
    Comme je vous l'ai écrit, si le print ne fonctionne pas si bien, il faut regarder ce que vous expédiez.
    Le constructeur float à la gentillesse d'accepter les '\n':
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> float('1.0\n')
    1.0
    >>> float('1.0')
    1.0
    >>>
    Donc, il y a un boulot de nettoyage à faire ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            try:                                                                                   # Test des ...
    		float(temperature1) and float(humidite1) 	                # ... valeurs pour voir si ce sont des float
    		print "sonde 1 => Ok"
    		break										# Si oui on casse la boucle
    	except ValueError:								# Sinon
    		print "sonde 1 erreur, nouvel essai..."		                # On affiche un message et on reessaye
    		sleep(1)
    ligne 2 autant profiter du boulot et la remplacer par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                    temperature1, humidite1 = float(temperature1), float(humidite1)
    - W

  7. #7
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par wared05 Voir le message
    salut clodion,

    j'avoue avoir du relire quelques fois ton post, j'ai ensuite tenté ca apres la declaration de la variable :

    sans succès

    je continue mes recherches, merci de ton aide
    Bonjour,
    Le code que j'ai fourni voulait juste montrer qu'un saut de ligne correspond à un ou des caractères.
    La méthode "splitlines" renvoie une liste des lignes en supprimant ces sauts de lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> phrase = "C'est un trou de verdure\noù chante une rivière"
    >>> phrase
    "C'est un trou de verdure\noù chante une rivière"
    >>> print(phrase)
    C'est un trou de verdure
    où chante une rivière
    >>> k = phrase.splitlines()
    >>> k
    ["C'est un trou de verdure", 'où chante une rivière']
    >>>
    La méthode suivante, join, permet de concaténer des chaînes de caractères en les séparant par un motif (un espace par exemple, ou simplement rien).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> " ".join(k)
    "C'est un trou de verdure où chante une rivière"
    >>>
    Ces deux opérations permettent ainsi de nettoyer des chaînes de leurs sauts de lignes (même intra-chaîne).

    D'autre part, si systématiquement le même caractère pose problème la méthode "replace" peut-être plus simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> phrase.replace("\n", " ")
    "C'est un trou de verdure où chante une rivière"
    >>>
    Ces deux techniques permettent de supprimer des caractères non imprimables, correspondant à des sauts de ligne, qui semblent poser problème dans l'affichage sur l'écran LCD!

    Clodion

    PS: Si le message initial ne contient qu'un seul réel, la conversion par la fonction "float" est bien plus jolie, comme l'indique Wiztricks!

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2015
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    un grand merci à clodion et wiztricks pour leur aide, ca fonctionne!

    ce qui m'echappe c'est que je pensais justement verifier que ma variable est un float avec mon "try float(temperature1)"

    ca me servira de lecon pour la prochaine fois...

    je met mon code, fonctionnel pour ceux qui passeraient par la

    mon montage inclus un raspberry pi, quelques sondes DHT22 AM2302 et un ecran LCD 20x4 qui fonctionne en I2C

    Code : 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
    #!/usr/bin/python
    # -*- coding=utf-8 -*-
    # Station Meteo
     
    # on importe le pilote
    import RPi_I2C_driver
    import time
    from time import sleep
    from datetime import datetime
    import os
    import sys
    from subprocess import *
     
    # on initialise le 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
     
    # On definit les GPIO associes au sondes DHT22
    sonde1 = 14
    sonde2 = 23
    sonde3 = 15
     
    # On definit 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)
     
    # Boucle qui lit les valeurs de la sonde et verifie que ce sont des float
    while True :
    	temperature1 = run_cmd(lire_temp1)	# Lance la commande de lecture de la sonde et met en variable le resultat
    	humidite1 = run_cmd(lire_hum1)                  # Lance la commande de lecture de la sonde et met en variable le resultat
    	try:                                            # Test des
    		temperature1, humidite1 = float(temperature1), float(humidite1)
    		float(temperature1) and float(humidite1) 	# Valeurs pour voir si ce sont des float
    		print "sonde 1 => Ok"
    		break										# Si oui on casse la boucle
    	except ValueError:								# Sinon
    		print "sonde 1 erreur, nouvel essai..."		# On affiche fuck1
    		sleep(1)									# On s endors 1 seconde et on recommence la boucle
     
    while True :										# Idem au bloc du dessus avec temperature2
    	temperature2 = run_cmd(lire_temp2)
    	humidite2 = run_cmd(lire_hum2)
    	try:
    		temperature2, humidite2 = float(temperature2), float(humidite2)
    		float(temperature2) and float(humidite2)
    		print "sonde 2 => Ok"
    		break
    	except ValueError:
    		print "sonde 2 erreur, nouvel essai..."
    		sleep(1)
     
    while True :										# Idem au bloc du dessus avec temperature2
    	temperature3 = run_cmd(lire_temp3)
    	humidite3 = run_cmd(lire_hum3)
    	try:
    		float(temperature3) and float(humidite3)
    		temperature3, humidite3 = float(temperature3), float(humidite3)
    		print "sonde 3 => Ok"		
    		break
    	except ValueError:
    		print "sonde 3 erreur, nouvel essai..."
    		sleep(1)
     
     
    # Bloc d affichage du LCD ligne par ligne
    lcd.lcd_display_string(datetime.now().strftime('%d %b        %H:%M'), 1),		# Affichage de la date et heure sur la 1ere ligne
    lcd.lcd_display_string("      Sal. Ch.1 Ext" , 2),								# Affichage de la ligne 2
    lcd.lcd_display_string("Temp :%s %s %s" %(temperature1, temperature2, temperature3) , 3),	# Affichage de la ligne 3 avec t°
    lcd.lcd_display_string("Hum  :%s %s %s"%(humidite1, humidite2, humidite3) , 4),				# Affichage de la ligne 3 avec hum

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 398
    Points : 36 957
    Points
    36 957
    Par défaut
    Salut,

    Citation Envoyé par wared05 Voir le message
    ce qui m'echappe c'est que je pensais justement verifier que ma variable est un float avec mon "try float(temperature1)"
    float(temperature1) remonte une exception si la chaîne de caractère associée à la variable "temperature1" n'a pas la forme d'un "float". En écrivant "temperature1 = float(temperature1)", on assigne a "temperature1" le "float" correspondant et on élimine en passant les "\n".

    - W

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Struts] Affichage variable de session
    Par cirdec dans le forum Struts 1
    Réponses: 3
    Dernier message: 17/03/2006, 11h18
  2. Affichage variable dans une fenêtre d'alerte
    Par undercrash dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 08/03/2006, 21h35
  3. affichage d'un caractere special
    Par vince3320 dans le forum C
    Réponses: 7
    Dernier message: 09/12/2005, 10h10
  4. caracteres indesirables
    Par deubal dans le forum Langage
    Réponses: 2
    Dernier message: 31/10/2005, 12h55
  5. Nom de variable avec caracteres []
    Par zevince dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/10/2005, 15h22

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