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 :

Paramètre de type I2C à passer à une fonction dans une bibliothèque.


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2021
    Messages : 2
    Par défaut Paramètre de type I2C à passer à une fonction dans une bibliothèque.
    Bonjour à tous,

    J'écris en micropython une bibliothèque pour afficher un message sur un écran lcd connecté en i2c à un microcontroleur esp8266.
    Je n'arrive pas à faire passer en paramètre un objet i2c qui représente le brochage de mon écran lcd sur le microcontrôleur.

    Ma question est d'ordre général en python. Je saurais faire passer des paramètres string, entiers ou réels, mais je n'arrive pas à le faire avec cet objet i2c.

    Je cherche depuis plusieurs semaines sans succès. Merci de votre aide.

    Voici mon code :

    -------------------------------- programme principal, laid mais qui fonctionne --------------------------------------------------------

    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
    """
    test ecran LCD Grove en Micropython sur Esp8266 / ESP32
    """
    import time
    from machine import Pin, I2C
    from Grove_LCD import Grove_lcd
     
    i2c = I2C(scl=Pin(2), sda=Pin(14), freq=20000) # création d'un objet i2c là où il devrait être, pour indiquer le brochage sur l'ESP8266
     
     
    lcd = Grove_lcd() # Crée un objet lcd pour pouvoir utiliser ses méthodes
     
    # lcd = Grove_lcd(i2c) # voici mon objectif => faire passer l'objet i2c avec le brochage en paramètre. Je ne trouve pas la syntaxe appropriée. global i2c ???  
     
    lcd.write("Bonjour le monde ! ")       # méthode pour écrire sur l'écran
    -------------------- bibliothèque (avec le brochge i2c écrit en dur dedans, que je voudrais éviter) ---------------------------------------
    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
    79
    80
    from machine import Pin, I2C
    import time
     
    i2c = I2C(scl=Pin(2), sda=Pin(14), freq=20000) # création d'un objet i2c au mauvais endroit
    # Comment éviter de coder en dur le brochage dans la bibliothèque ?
    # Cette ligne devrait être dans le programme principal, passée en paramètre comme suit :
    # afficheur = Grove_lcd(i2c)
     
     
    class Grove_lcd():
        # global i2c ne fonctionne pas, et ce n'est pas le meilleur moyen.
        """
        Pour gerer l'afficheur 1602 Grove
        """
        def __init__(self):
     
            # initialisation
            self.set_register(0x00, 0)
            self.set_register(0x01, 0)
     
            # toutes les Leds controllées par PWM
            self.set_register(0x08, 0xAA)
     
            # attente initialisation après mise sous tension
            time.sleep_ms(50)
     
            # envoi configuration afficheur 2 lignes
            self.cmd(0x20 | 0x04 | 0x08)
            time.sleep_us(4500)
            self.cmd(0x20 | 0x04 | 0x08)
            time.sleep_us(150)
            self.cmd(0x20 | 0x04 | 0x08)
            self.cmd(0x20 | 0x04 | 0x08)
     
            # allumage afficheur
            self.disp_ctrl = 0x04 | 0x00 | 0x00
            self.display1(True)
            self.clear()
            self.disp_mode = 0x02 | 0x00
            self.cmd(0x04 | self.disp_mode)
     
        def set_register(self, reg, val):
            val = bytes((reg, val))
            i2c.writeto(0x62, val) # adresse i2c de l'afficheur pour le fond
     
        def color(self, R, G, B):
            self.set_register(0x04, R)
            self.set_register(0x03, G)
            self.set_register(0x02, B)
     
        def cmd(self, command):
            assert command >= 0 and command < 256
            val = bytes((0x80, command))
            i2c.writeto(0x3e, val) # adresse i2c de l'afficheur pour le texte
     
        def write_char(self, c):
            assert c >= 0 and c < 256
            val = bytes((0x40, c))
            i2c.writeto(0x3e, val)
     
        def write(self, text):
            text = str(text)
            for char in text:
                self.write_char(ord(char))
     
        def setCursor(self, col, row):
            col = (col | 0x80) if row == 0 else (col | 0xc0)
            self.cmd(col)
     
        def display1(self, state):
            if state:
                self.disp_ctrl |= 0x04
                self.cmd(0x08 | self.disp_ctrl)
            else:
                self.disp_ctrl &= ~0x04
                self.cmd(0x08 | self.disp_ctrl)
     
        def clear(self):
            self.cmd(0x01)
            time.sleep_ms(2)

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2018
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2018
    Messages : 29
    Par défaut
    global ne permet pas de "franchir" des modules, ils sont dans un namespace différent.
    1) Ou alors,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from script_principal import i2c
    mais cela conduirait à une boucle des imports (script 1 importe depuis script 2, qui importe depuis script 1...), bref, python n'aime pas ça (personne n'aime ça)

    2) Pour un cas comme celui-ci, je définirais un troisième fichier dédié aux configurations, plus facilement maintenable et modifiable.

    3) Sinon, la meilleure solution est de définir un attribut "i2c" pour la classe Grove_lcd
    Soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Grove_lcd():
        # global i2c ne fonctionne pas, et ce n'est pas le meilleur moyen.
        """
        Pour gerer l'afficheur 1602 Grove
        """
        def __init__(self, i2c):
     
            self.i2c = i2c
            ....
     
        def set_register(self, ...):
            ...
            self.i2c.writeto(0x62, val)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    from Grove_LCD import Grove_lcd
     
    i2c = I2C(scl=Pin(2), sda=Pin(14), freq=20000) 
    lcd = Grove_lcd(i2c)
    Soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Grove_lcd():
        def __init__(self, scl, sda, freq):
     
            self.i2c = I2C(scl=Pin(2), sda=Pin(14), freq=20000)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    from Grove_LCD import Grove_lcd
     
    lcd = Grove_lcd(Pin(2), Pin(14), 20000)

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2021
    Messages : 2
    Par défaut Super !
    Précis et rapide. (bien plus que ma réponse, mais internet était cassé ici, désolé)

    Un très grand merci.
    Jean-François.

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

Discussions similaires

  1. [KSH 93] Récupérer les options et paramètres reçus pour les passer à une autre commande
    Par al1_24 dans le forum Shell et commandes POSIX
    Réponses: 5
    Dernier message: 30/01/2019, 12h24
  2. [AC-2010] Modifier un paramètre de type "text" d'une requête par VBA
    Par metalleuse dans le forum VBA Access
    Réponses: 8
    Dernier message: 22/06/2015, 09h47
  3. Paramètre de type Delegué d'une méthode
    Par new_wave dans le forum Framework .NET
    Réponses: 3
    Dernier message: 27/11/2014, 14h10
  4. ajouter une colonne de type ATTACHMENT FIELD à une bibliothèque de document
    Par chrisade dans le forum Développement Sharepoint
    Réponses: 3
    Dernier message: 19/11/2009, 11h55
  5. Réponses: 10
    Dernier message: 02/02/2007, 16h00

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