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

Arduino Discussion :

Scroller du texte de droite à gauche (Librairie DFRobot_LCD.h)


Sujet :

Arduino

  1. #1
    Membre régulier
    Homme Profil pro
    Coach
    Inscrit en
    novembre 2019
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Coach

    Informations forums :
    Inscription : novembre 2019
    Messages : 216
    Points : 73
    Points
    73
    Par défaut Scroller du texte de droite à gauche (Librairie DFRobot_LCD.h)
    Bonjour,

    Dans la quasi totalité de mes projets, j'utilise un écran LCD 2x16 I2C de chez DFRobot (le DFR0555 qui a des couleurs fixes contrairement à certains modèles RGB)) et la librairie qui va avec "DFRobot_LCD.h", et ce tandem marche comme un charme depuis des années. Je pense que le lien est bien relatif à la librairie "DFRobot_LCD.h" et non pas à celle qui gère les écrans RGB, mais ce devrait pas avoir beaucoup d'impact pour ma question ci-dessous:

    Je voudrais savoir s'il existe des fonctions appelables depuis cette librairie, permettant de scroller des chaines de caractères, sans avoir à se programmer ça à la mano ?

    Mon idée est de stocker du texte dans une chaîne de caractères, puis de pouvoir facilement scroller ce texte (qui dépassera 16 caractères), de la droite vers la gauche.

    Aux lignes 133 et 134 du code donné dans le lien de la librairie, je vois 2 fonctions prometteuses:
    • void scrollDisplayLeft();
    • void scrollDisplayRight();


    et j'ai aussi trouvé ces fonctions:
    • void leftToRight();
    • void rightToLeft();



    mais je ne sais où trouver d'infos sur comment les utiliser ? (paramètres, ce que ça fait, etc...)

    Merci

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


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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : janvier 2009
    Messages : 12 443
    Points : 55 914
    Points
    55 914
    Billets dans le blog
    37
    Par défaut
    Bonsoir,

    On oublie qu'avec les librairies Arduino, il y a souvent un dossier Exemples

    Voir DFRobot_LCD/examples/Roll/Roll.ino.

  3. #3
    Membre régulier
    Homme Profil pro
    Coach
    Inscrit en
    novembre 2019
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Coach

    Informations forums :
    Inscription : novembre 2019
    Messages : 216
    Points : 73
    Points
    73
    Par défaut
    On oublie qu'avec les librairies Arduino, il y a souvent un dossier Exemples
    Purée et pourtant j'ai pas Alzheimer !!

    Bon c'est presque ça mais pas vraiment ce que je voudrais: dans l'exemple ils envoie une chaine fixe "hello World !" sur le LCD puis ils la font scroller.

    Cette chaine "hello World" fait 12 caractères (13 pour le comptage) et est donc < aux 16 caractères du LCD, donc là effectivement ça va.

    Mais dans mon cas, je voudrais pouvoir scroller une chaine de caractère qui fera plus que les 16 caractères du LCD; donc afficher les 16 premiers caractères du texte, puis commencer à scroller.
    Je pourrais certes le faire à la mano: afficher les 16 premiers, puis afficher de 2 à 17, puis etc... mais je pense que ce serait mieux si je pouvais appeler une fonction, si elle existe ?.

    J'imagine donc déclarer une chaine de disons 32 caractères que je remplirai dynamiquement à l'intérieur de mon programme quand j'en aurai besoin; et éventuellement générer une nouvelle chaine à scroller en la tronquant à sa longueur (pour éviter des blancs en fin de d'affichage):
    mais si je fais un
    je vais me prendre une erreur car ça dépasse 16 non ?

    Je vais essayer en attentant vos suggestions (des fois que la fonction donnée en exemple sache traiter des chaines de plus de 16 caractères...).

  4. #4
    Membre régulier
    Homme Profil pro
    Coach
    Inscrit en
    novembre 2019
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Coach

    Informations forums :
    Inscription : novembre 2019
    Messages : 216
    Points : 73
    Points
    73
    Par défaut
    Bon comme je n'ai besoin que des scrolling à gauche et à droite (pas de remise au centre), j'ai cherché à définir 2 fonctions "ScrollingLeft" et "ScrollingRight" que j'appellerai quand j'en aurai besoin.

    J'ai fait un essai, avec le code suivant:

    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
     
    #include <Wire.h>
    #include "DFRobot_LCD.h"
     
    DFRobot_LCD lcd(16,2);  //16 characters and 2 lines of show
     
    const int delai_scrolling = 500; // fixe la valeur du délai de scrolling
    char texte[32];// déclare la chaine appelée "texte" que l'on affichera sur le LCD, longueur max 32 à
    				// ajuster si trop long
     
    void ScrollingLeft()
    {
    	for (int positionCounter = 0; positionCounter < 32; positionCounter++) 
    	{
            // scroll one position left:
            lcd.scrollDisplayLeft();
            // wait a bit:
            delay(delai_scrolling);
        }
    }	
     
    void ScrollingRight()
    {
    	for (int positionCounter = 0; positionCounter < 32; positionCounter++) 
    	{
            // scroll one position right:
            lcd.scrollDisplayRight();
            // wait a bit:
            delay(delai_scrolling);
        }
    }	
     
    void setup() 
    {
        // initialize
    	strcpy(texte, "Hello world et encore Hello World");
        lcd.init();
        // Print a message to the LCD.
        lcd.print(texte);
        delay(1000);
    }
     
    void loop() 
    {
    	ScrollingLeft;
    	delay(1000);
     
    	ScrollingRight;
        delay(1000);
     
    }
    ça m'affiche bien "Hello World et encore Hello World" sur le LCD mais ça ne scrolle pas...

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


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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : janvier 2009
    Messages : 12 443
    Points : 55 914
    Points
    55 914
    Billets dans le blog
    37
    Par défaut
    Et avec les parenthèses ?
    Citation Envoyé par grizzli06 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void loop() 
    {
    	ScrollingLeft();
    	delay(1000);
    	
    	ScrollingRight();
        delay(1000);
    
    }

  6. #6
    Membre régulier
    Homme Profil pro
    Coach
    Inscrit en
    novembre 2019
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Coach

    Informations forums :
    Inscription : novembre 2019
    Messages : 216
    Points : 73
    Points
    73
    Par défaut
    Heureusement que le ridicule ne tue pas sinon j'aurais consommé mes 9 vies de chat en une seule fois ...

    Désormais ça scrolle avec une petite nuance:

    si la longueur du texte est égal à la valeur indiquée dans la boucle for:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for (int positionCounter = 0; positionCounter < 33; positionCounter++) "
    alors c'est parfait,

    mais si la longueur réelle du texte est inférieure à cette valeur (ici 33, correspondant à la définition de "texte"), alors ça fonctionne pour le ScrollingLeft, mais ça part en sucette vers le milieu du texte pour le ScrollingRight.

    J'imagine (à confirmer) qu'il faudrait remplacer "33" par la longueur réelle du texte (?) mais comme dans mon cas je voudrais traiter des chaines de longueur variable, c'est pas encore ça...

    Y a-t-il une fonction qui renvoie la longueur effective d'une chaine de caractère ?

    Sinon je pourrai toujours contourner ça en définissant en dur plusieurs chaines de caractères (je n'en aurai pas 200 non plus), mais c'est moins élégant !!

  7. #7
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    septembre 2019
    Messages
    2 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : septembre 2019
    Messages : 2 504
    Points : 4 839
    Points
    4 839
    Par défaut
    Citation Envoyé par grizzli06 Voir le message
    Y a-t-il une fonction qui renvoie la longueur effective d'une chaine de caractère ?
    strlen(maChaine) si maChaine est une c-string (un tableau de caractères terminé par le caractère nul) (doc)

    maChaine.length() si maChaine est instance de la classe String (doc)

  8. #8
    Membre régulier
    Homme Profil pro
    Coach
    Inscrit en
    novembre 2019
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Coach

    Informations forums :
    Inscription : novembre 2019
    Messages : 216
    Points : 73
    Points
    73
    Par défaut
    Bon c'est pas tout à fait ce que je veux faire, mais j'ai fait ce script et il 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
    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
     
    #include <Wire.h>
    #include "DFRobot_LCD.h"
     
    DFRobot_LCD lcd(16,2);  //16 characters and 2 lines of show
     
    const int delai_scrolling = 500; // fixe la valeur du délai de scrolling
    char texte[33];// déclare la chaine appelée "texte" que l'on affichera sur le LCD, longueur max 32 à
    				// ajuster si trop long
     
     
    void ScrollingLeft()
    {
    	lcd.print(texte);
    	int text_length;
    	text_length=strlen(texte);
    	Serial.print("longueur text_length= ");
    	Serial.println(text_length);
    	for (int positionCounter = 0; positionCounter < text_length; positionCounter++) 
    	{
            // scroll one position left:
            lcd.scrollDisplayLeft();
            // wait a bit:
            delay(delai_scrolling);
        }
    }	
    /*
    void ScrollingRight()
    {
    	for (int positionCounter = 0; positionCounter < 33; positionCounter++) 
    	{
            // scroll one position right:
            lcd.scrollDisplayRight();
            // wait a bit:
            delay(delai_scrolling);
        }
    }	
    */
    void setup() 
    {
    	Serial.begin(9600); // initialisation Moniteur Serie
        // initialize
    	strcpy(texte, "Hello world et encore");
        lcd.init();
        // Print a message to the LCD.
        lcd.print(texte);
        delay(1000);
    }
     
    void loop() 
    {
    	ScrollingLeft();
    	//delay(1000);
     
    	// ScrollingRight(); on ne teste que le ScrollinLeft, on verra plus tard
        // delay(1000);
     
    }
    En rajoutant la variable calculée "text_length" dans la boucle de ScrollingLeft, il me semble que l'affichage est un peu plus rapide, car sinon il devait scroller des blancs jusqu'à la longueur 33, avant de recommencer à scroller le texte.

    Idéalement je voudrais passer un argument de type "chaine de caractère" à la fonction ScrollingLeft, de façon à ce qu'au milieu de mon programme je puisse faire un "ScrollingLeft(texte à scroller);" ce qui m'éviterait d'avoir à dire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    lcd.print(texte);
    ScrollingLeft();
    mais bon je pourrai m'en sortir avec ça car je n'aurai pas de nombreux textes à scroller...

  9. #9
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    septembre 2019
    Messages
    2 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : septembre 2019
    Messages : 2 504
    Points : 4 839
    Points
    4 839
    Par défaut
    Citation Envoyé par grizzli06 Voir le message
    Idéalement je voudrais passer un argument de type "chaine de caractère" à la fonction ScrollingLeft, de façon à ce qu'au milieu de mon programme je puisse faire un "ScrollingLeft(texte à scroller);" ce qui m'éviterait d'avoir à dire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    lcd.print(texte);
    ScrollingLeft();
    mais bon je pourrai m'en sortir avec ça car je n'aurai pas de nombreux textes à scroller...
    Coder cette fonction n’est pas super dur… essayez

Discussions similaires

  1. Réponses: 11
    Dernier message: 11/01/2015, 20h39
  2. Texte défilant droite gauche qui ne saccade pas
    Par popovitch130 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/09/2011, 14h12
  3. figure a gauche et text a droite
    Par feynman dans le forum Beamer
    Réponses: 1
    Dernier message: 12/01/2010, 16h44
  4. Faire circuler un texte de droite a gauche
    Par MonPc dans le forum Débuter
    Réponses: 5
    Dernier message: 24/12/2008, 09h49
  5. Texte défilant gauche droite et droite gauche
    Par casavba dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 19/11/2008, 12h01

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