Aller au contenu


Photo
- - - - -

Probleme de Librairie LCDI2C


  • Veuillez vous connecter pour répondre
10 réponses à ce sujet

#1 Astondb8

Astondb8

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 111 messages
  • Gender:Male
  • Location:Paris

Posté 21 octobre 2011 - 02:06

Bonjour,

J'ai une question pourvez vous m'aider ?

Depuis hier, je me casse la tête à essayer de faire fonctionner un LCD I2C.
Je trouvais cela facile jusqu'au moment ou je suis tombé sur un os ;)

Commençons par le commencement
Mon LCD I2C est bien connecté
5v, GNG, SDA et SDL chargées à 4.7KOhms
Adresse 0X00 (mais même problème en changeant l'adresse.
Écran 2X16 bien configuré soit dans la Lib, soit dans le SetUp (suivant la lib utilisée)
J'arrive bien a avoir du texte sur l'afficheur, donc je suppose que cela ne viens pas de là.

Description du problème

Le texte s'affiche bien
Mais jamais a la même position.
J’essaie de configurer le départ du texte soit en donnant une adresse Ligne et colonne, mais rien a faire. Suivant le nombre de caractère demandé le texte shift a chaque passage de boucle.


J’utilise pour être certain mon code un des exemple livré avec les Libs.
Donc le classique "Hello world" (mais le problème est le même avec d'autres exemple et quel que soit la Lib.

La seule solution que j'ai trouvé pour afficher correctement tu teste a la bonne place est de passer par l’envoi de chaque caractère sans utiliser de Lib LCD mais uniquement la Lib Wire et d'envoyer chaque code hexa. ce qui est somme toute un peux fastidieux. Je peux bien sur créer des fonctions qui me simplifieraient un peux la vie. Mais je mieux serait de trouver ce qui ne vas pas dans les Libs que j'utilise. Le problème est que je ne me sent pas encore capable de modifier une Lib et encore moins d'en écrire une de bout en bout...
Voici par exemple un bout de ce code utilisé qui fonctionne.


#include <Wire.h>

void setup() 
{ 
}

void loop()
{
      Wire.beginTransmission(0x00); //Transmission a l'adresse 0x00
      Wire.send(0xFE); // Efface l'écran
      Wire.send(0x14); // Positionne le curseur à 0.0
      Wire.endTransmission(); //Fin de transmission de la 1ere partie
      delay(100);
    Wire.beginTransmission(0x00);
      Wire.send(0x01); // Commence a écrire ligne 1 colonne 0
      
      Wire.send(0x41); // A
      Wire.send(0x42); // B
      Wire.send(0x43); // C
      Wire.send(0x44); // D
      Wire.send(0x45); // E
      Wire.send(0x46); // F
      Wire.send(0x47); // G
      Wire.send(0x48); // H
      Wire.send(0x49); // I
      /*
      Wire.send(0x50);
      Wire.send(0x51);
      Wire.send(0x52);
      Wire.send(0x53);
      Wire.send(0x54);
      */
      Wire.send(0x02); // Commence a écrire ligne 2 colonne 0
      
      Wire.send(0x55); // U
      Wire.send(0x56); // V
      Wire.send(0x57); // W
      /*
      Wire.send(0x58);
      Wire.send(0x59);
      Wire.send(0x60);
      Wire.send(0x61);
      Wire.send(0x62);
      Wire.send(0x63);
      Wire.send(0x64);
      Wire.send(0x65);
      Wire.send(0x66);
      Wire.send(0x67);
      Wire.send(0x68);
      Wire.send(0x69);
      Wire.send(0x670);
      */
      Wire.endTransmission(); // Fin de transmission
      delay(100);

}

Avez vous déjà utilisé un LCD en I2C et avez vous une idée pour comprendre ce qui ce passe pour ces problèmes de Libs ?

Ha si, j'oubliais,voici la doc du LCD
http://www.lextronic.fr/~lextronic_doc/CLCD.pdf

Cdlt
Yves

 


#2 Mgros

Mgros

    Membre occasionnel

  • Membres
  • Pip
  • 144 messages
  • Gender:Male
  • Location:Caissargues 30

Posté 21 octobre 2011 - 09:01

Je n'ais pas un module de cette marque mais tu as essayé directement l'exemple
envois commande pour placer curseur page 8
en utilisant la lib I2c de ton compilateur avec le start write et stop ?

sinon quand tu fais un MAJ te ton affichage ...
Tu efface tout -> tu ecris les valeurs -> tu laisse affiché un certain temps pour le voir -> etc... ?
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.
Ma Chaîne youtube
------

#3 Astondb8

Astondb8

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 111 messages
  • Gender:Male
  • Location:Paris

Posté 21 octobre 2011 - 09:25

Desolé mais je ne comprend pas de quel exemple tu parle.
Tu as un lien ?

Merci

 


#4 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

Posté 22 octobre 2011 - 07:52

Salut !

Tu n'as pas initialisé ton objet Wire dans le setup ...

Wire.begin();

++
Black Templar

Mon site internet : http://ferdinandpiette.com/


#5 Mgros

Mgros

    Membre occasionnel

  • Membres
  • Pip
  • 144 messages
  • Gender:Male
  • Location:Caissargues 30

Posté 22 octobre 2011 - 09:20

je parlais juste du pdf que tu as mis en lien ...
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.
Ma Chaîne youtube
------

#6 Astondb8

Astondb8

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 111 messages
  • Gender:Male
  • Location:Paris

Posté 22 octobre 2011 - 02:10

Bon,
Une fois de plus Luj m'a sauvé la vie ;)

Il a non seulement trouvé pourquoi cela ne marchait pas (et avec moins d'infos qu'il n'en faut pour le dire)
Mais il m'a écrie une Lib spécialement pour moi... ;)
Enfin, quand je dit pour moi, je ne suis pas juste car elle servira bien sur à tous ceux qui utilient ou utiliseront ce LCD I2C

Magique

Je la test de font en comble, vois avec Luj ce qui n'irait pas (amis bon y a pas grand chose de mauvais pour le moment ;) )
et je vous la met en partage avec une petite explication...

Cdlt
Yves

 


#7 Astondb8

Astondb8

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 111 messages
  • Gender:Male
  • Location:Paris

Posté 23 octobre 2011 - 02:16

Bonjour

Bon Luj à même fait une news sur son site pour expliquer comment utiliser ce LCD et a mis en partage la Lib qu'il a écrite pour cet écran
(je ne dit pas "qu'il m'a écrite" pas modestie, mais ça y ressemble fort pourtant ;)

Voila le lien

Je passe donc à l'étape suivante, j’essaie de faire du Crawll texte.
C'est a dire que je souhaiterais pouvoir afficher des chines plus longues que 16 caractères.
Pour cela, je dois faire en sirte de déplacer le texte vers la gauche pour le faire defiler.

Pour le moment, j'ai trouvé l'instruction "strlen" qui renvoie la longueur d'une chaine.
Une fois cette valeur connue, je crée une boucle
A chaque passage de boucle retirer le caractère le plus a gauche
Afficher ce qu'il me reste de ma chaine en continuant de positionner mon curseur à 0,0.

Je suis sur une piste mais je n'arrive pas a la mettre en forme pour le moment,
j'ai trouvé "strchr"
Cette instruction renvoie un pointeur sur la première occurrence du caractère dans la chaîne str.
Mais je n'ai pas encore trouvé comment soit supprimer ce caractère, soit renvoyer une nouvelle chaine qui commencerait au caractère suivant. Je ne suis même pas certain que cette instruction est bien celle qui me permettra d'y arriver.

Si une personne pouvait me mettre sur une piste.... wink
car, je comprend bien comment cette fonction doit travailler, mais je n'arrive pas encore à transformer cette idée n code wink

Je doit mettre la chaine dans une variable
Compter le nombre de caractères de la chaine
positionner mon curseur à 0,0
Afficher les caractères de 1 à 16
shifter d'un caractère et afficher le nouveau caractère 1 au nouveau caractère 16 ou
Afficher les caractères de 2 à 17
shifter d'un caractère et afficher le nouveau caractère 1 au nouveau caractère 16 ou
Afficher les caractères de 3 à 18
shifter d'un caractère et afficher le nouveau caractère 1 au nouveau caractère 16 ou
Afficher les caractères de 4 à 19
etc

En fin de chaine, je dois ajouter un espace à chaque passage pour toujours envoyer une chaine de 16.
En effet, si je ne fais pas cela, je dois faire un lcd.clear(); a chaque fois pour effacer la fin de ma ligne sur les colonnes ou il n'y aura pas de caractère.
Le clear ne fonctionne pas car il laisse l’écran vide (même quelques millièmes de seconde et provoque un clignotement du texte. ce qui n'est pas tres joli ni très agréable.

Voilà sur quoi je travaille. Mais je ne trouve pas l'instruction qui me permettrait de scinder ma chaine pour couper à chaque fois le 1er caractère de la chaine.

Mais je ne suis pas au bout de mes peines wink

Cdlt
Yves

 


#8 Astondb8

Astondb8

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 111 messages
  • Gender:Male
  • Location:Paris

Posté 25 octobre 2011 - 05:15

Bon et bien voila ça marche enfin... ;)
Il était temps, je commençais à désespérer... :8):


Voilà une petite vidéo du résultat

http://www.youtube.com/watch?v=JUykBHD1NSA

Voilà le code


#include <Wire.h>
#include "CLCD.h"

CLCD lcd(0x00,16,2);
char myStrings[]={
  "Test de Crawll texte pour affichur LCD 2 X 16"};

char s1[] = "orange";
char s2[] = "red";

void setup()
{
  lcd.init();
  lcd.cursor_off();
  lcd.setBacklight(1);
  Serial.begin(9600);
}

void loop()
{

  char const my_string[] = "Une chaine de test pour tester l'affichage en decale";
  int l = strlen(my_string);
  int i, j;
  for (i = 0; i < l; ++i)
  {
    //lcd.clear();
    lcd.setCursor(0,0);
    for (j = 0; (j < 16) && (i + j < l); ++j)
      lcd.print(my_string[i+j]);
    for ( ; j < 16; ++j)
      lcd.print(' ');

    delay(200);
  }
}


J'aimerais bien maintenant implémenter ma Librairie avec ce code (transformé en fonction)
Je bloque encore sur certaines choses. Mais je vais laisser ça de coté pour quelques jours avant de mettre mon PC par la fenêtre ::):
Non je plaisante. Mais passer à autre chose me fera du bien. J'y reviendrais compte sur moi.

Cdlt
Yves

 


#9 Astondb8

Astondb8

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 111 messages
  • Gender:Male
  • Location:Paris

Posté 30 octobre 2011 - 06:32

Décidément

Pas de chance.
Je voilais donner la parole à mon robot.
Pour faire les tests d'enchainement de fichiers audios, je voulais (enfin, je veux toujours) commencer par une horloge parlante.
J'ai donc enregistré tous les fichiers au format MP3
Il est
1
2
3
---
---
11
12
---
---
58
59
heure
minute
seconde

Il ne me restait plus qu'à les mettre sur la carte micro-SD (c'est chose faite)
D’écrire le code (c'est chose faite)
De le tester (C'est......)
Non ca ne marche pas...
Je relis la doc et m'appercois que ma carte micro-SD fait 4Go alors que le max accepté par ma carte Player est 1Go
Sauf que nous sommes dimanche et que je n'en trouverais pas avant demain...

Je ne perd pas mon temps et écris tout de même un programme d'horloge qui met en œuvre mon module horloge I2C et mon écran LCD I2C 2X16

Voila le code

/********************************************************************************/
/*                                                                              */
/* Programme d'horloge sur écran LCD I2C utilisant le module Horloge RTC en I2C */
/* La Librairie RTClib.h a été écrite pas Luj (Pobot.org)                       */
/* astondb8                                                                     */
/*                                                                              */
/********************************************************************************/


// Declaration des Libs
#include <Wire.h>
#include "RTClib.h"
#include "CLCD.h"

//Initialisation Horloge
RTC_Millis RTC;
//Initialisation LCD
CLCD lcd(0x00,16,2);

void setup () {
    Serial.begin(57600);
    // Pour mettre le lodule RTC à l'heure decommenter la ligne suivante
    //RTC.begin(DateTime(__DATE__, __TIME__));
    
        lcd.clear();             // Effacer le LCD
    lcd.backlight();             // Allumer le backlight du LCD
}

void loop () {
    DateTime now = RTC.now();
    lcd.backlight();
    
    lcd.setCursor(0,0);          // Positionnement du curseur la ou je souhaite écrire (Ligne 1 position 0) 
    lcd.print("Date :");         // Affichage de la chaine "Date:" 
    lcd.print(now.day(), DEC);   // suivie du jour
    lcd.print('/');              // Suivie d'un séparateur
    lcd.print(now.month(), DEC); // Suivie du mois
    lcd.print('/');              // Suivie d'un séparateur
    lcd.print(now.year(), DEC);  // Suivie du jour
    
    lcd.setCursor(1,0);          // Positionnement du curseur la ou je souhaite écrire (Ligne 2 position 0)
    lcd.print("Heure:");         // Affichage de la chaine "heure:"
    lcd.print(now.hour(), DEC);  // Suivie de l'heure
    lcd.print(':');              // Suivie d'un séparateur
    lcd.print(now.minute(), DEC);// Suivie des minutes
    lcd.print(':');              // Suivie d'un séparateur
    lcd.print(now.second(), DEC);// Suivie des secondes
    lcd.print("   ");            // Suivie de 3 espaces pour terminer la ligne et effacer les caractères en trop
  
    delay(1000);                 // Attendre 1000 millisecondes pour avoir un affichage de toutes les secondes
}




Voilà les images

Image IPB

Image IPB

Image IPB

Voila
Je terminerais ce petit programme en lui ajoutant une alarme réglable.


Cdlt
Yves

 


#10 arobose

arobose

    Membre

  • Membres
  • 62 messages
  • Gender:Male
  • Location:Meyreuil-France
  • Interests:Robotique
    Informatique
    Electronique

Posté 02 novembre 2011 - 10:54

Damn it.... mais où trouves-tu tout ce temps??????:blink:

Tu avances sur plein de choses en //.... Impressionnant...



Arobose...

#11 Astondb8

Astondb8

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 111 messages
  • Gender:Male
  • Location:Paris

Posté 02 novembre 2011 - 11:00

Tu exagère ;)
Je suis toujours en maladie (jusqu'à la fin du mois). Apres ça va etre compliqué d'avancer.
Boulot le jour robotique la nuit. Je dormirais entre temps ;)

Tu aime ce que je fais ?

Faut dire qu'a force je commence enfin a faire quelques progrès en C ?

Et puis je dois aussi faire de la mecanique ou j'zi egalement été obligé de faire quelques progrès ;)
(c'est une boutade Franck. Elle ne test pas festonnée bien dur ;). )

 





0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users