Go Down

Topic: [resolu] Afficheur ELCD série et librairie sd1307 (Read 1 time) previous topic - next topic

pascalou

Nov 04, 2011, 08:05 pm Last Edit: Nov 06, 2011, 11:07 pm by pascalou Reason: 1
Bonjour tout le monde.

Je débute sous Arduino et je tente désespérément d'afficher la date et le résultat d"une mesure de température sur un afficheur ELCD.
Le code fonctionne formidablement bien pour des chaînes de caractères mais mon problème c'est que je veux afficher le résultat d'une lecture d'un DS1307.
Ce code est prévu pour afficher les infos provenant du DS1307 dans le terminal série Arduino:
Code: [Select]

void loop()
{

 Serial.print(RTC.get(DS1307_HR,true)); //read the hour and also update all the values by pushing in true
 Serial.print(":");
 Serial.print(RTC.get(DS1307_MIN,false));//read minutes without update (false)
 Serial.print(":");
 Serial.print(RTC.get(DS1307_SEC,false));//read seconds
 Serial.print("      ");                 // some space for a more happy life
 Serial.print(RTC.get(DS1307_DATE,false));//read date
 Serial.print("/");
 Serial.print(RTC.get(DS1307_MTH,false));//read month
 Serial.print("/");
 Serial.print(RTC.get(DS1307_YR,false)); //read year
 Serial.println();

 delay(1000);

}


Mon soucis, c'est que je n'arrive pas à faire afficher un (RTC.get(DS1307_DATE,false)) à l'aide de ELCD_put_str()

J'ai tenté des tas de trucs dans le genre de ce qui suit mais rien à faire, je n'arrive pas à trouver la bonne syntaxe:
Code: [Select]

//Acquisition de la date et affichage sur le LCD
 heure='RTC.get(DS1307_HR,true)'; //récupère l'heure du DS1307
ELCD_Cursor_Position(12, 3); //se positionne au bon endroit avant affichage
 ELCD_put_str(heure); //Est sensé afficher l'heure sur le LCD :-(

C'est sans doute un problème de conversion de chaîne de caractère au sein de la routine.
Si quelqu'un peut m'aider ça serait super.

Pascalou.

Jean-François

#1
Nov 04, 2011, 08:41 pm Last Edit: Nov 04, 2011, 08:43 pm by Jean-François Reason: 1
Ce qui est en rouge est en trop :

Quote
heure='RTC.get(DS1307_HR,true)'; //récupère l'heure du DS1307


Les apostrophes.....
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

pascalou

#2
Nov 04, 2011, 09:52 pm Last Edit: Nov 04, 2011, 10:07 pm by Jean-François Reason: 1
Merci Jean François mais ça ne fonctionne pas.
Dans le bout de code ci dessous, je récupère la valeur (mesure_brute) de la mesure d'une tension sur la voie 0 à l'aide d'un capteur de température TMP35.
Ca fonctionne avec le terminal série donc le capteur est OK et la conversion analogique/numérique se fait bien.

Par contre pour afficher sur le LCD rien ne va.
J'affiche un -- puis la valeur du capteur au même endroit pour voir ce qui se passe.
La valeur n'est jamais affichée, je ne vois que mes -- donc cela ne fonctionne pas:  Serial.print(mesure_brute); n'envoie rien de compréhensible au LCD série.
Je pense que je suis obligé d'utiliser un ELCD_put_str( ); mais que mettre entre les parenthèses pour afficher la valeur de mesure_brute ?
C'est franchement casse tête ce truc...
Code: [Select]

// acquisition de la temperature
 mesure_brute=analogRead(Voie_0); // récupère la température
 mesure_brute=mesure_brute/2;       // divise par deux pour avoir des degrés à la louche
 // Envoie la valeur sur l'afficheur LCD
 ELCD_Cursor_Position(12, 3);
 ELCD_put_str("--");
 delay(500);
 ELCD_Cursor_Position(12, 3);
 Serial.print(mesure_brute);
 
 //Acquisition de la date et affichage
 //ELCD_Cursor_Position(12, 3);
 //heure=RTC.get(DS1307_HR,true);
 //Serial.print(heure);

 
 delay(1000);
}

Jean-François

Et comme ça, ça fonctionne :

Code: [Select]
 
  mesure_brute=analogRead(Voie_0); // récupère la température
  mesure_brute=mesure_brute/2;       // divise par deux pour avoir des degrés à la louche

ELCD_Cursor_Position(12, 3);
ELCD_put_str(mesure_brute);


??
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

skywodd

Bonjour,

L'heure que tu récupère est un int, pour l'afficher sur le ELCD il faut la transformer en string (chaine de caractères), pour ça il y a trois méthodes :

Version c :
Code: [Select]

char str[4]; // heure 0-24 -> max 2 caractères + \0
str = itoa(heure, str, 10);
ELCD_put_str(str);


Version c++ :
Code: [Select]

char str[4];
sprintf(str, "%d", heure);
ELCD_put_str(str);


Version "Arduino" :
Code: [Select]

String str = heure;
ELCD_put_str(str.toCharArray());
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Super_Cinci

Juste dans ce bout de code :

Code: [Select]

  ELCD_Cursor_Position(12, 3);
  ELCD_put_str("--");
  delay(500);
  ELCD_Cursor_Position(12, 3);
  Serial.print(mesure_brute);


Tu ne risques pas d'écrire ta valeur sur le LDC, tu l'envoies au port série... remplace le Serial.print(mesure_brute); par ELCD_put_str(string(mesure_brute));

pascalou

#6
Nov 05, 2011, 10:37 am Last Edit: Nov 05, 2011, 10:58 am by Jean-François Reason: 1
Merci pour votre aide mais le casse tête continue...
J'ai toujours des erreurs de compilation :-(

Je récapitule ci dessous les différentes versions de code proposées ainsi que les erreurs obtenues:

Le programme dans sa totalité pour que vous puissiez voir le code dans son intégralité avec la solution proposée par Super_CinCi

Code: [Select]
#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h>

const int Voie_0=0; //declaration constante de broche analogique
     int mesure_brute=0;// Variable pour acquisition résultat brut de conversion analogique numérique
     int heure=0, minute=0, seconde=0, jour=0, mois=0, annee=0;

void setup() {
 Serial.begin(19200);
 ELCD_initialize();
 delay(200);
 ELCD_Clear_LCD();
 ELCD_Cursor_Position(0, 0);
 ELCD_put_str("Bonjour Pascal !");
 delay(30);
 ELCD_Cursor_Position(0, 1);
 ELCD_put_str("Date:");
 delay(30);
 ELCD_Cursor_Position(0, 2);
 ELCD_put_str("Heure:");
 delay(30);
 ELCD_Cursor_Position(0, 3);
 ELCD_put_str("Temperature:");
 delay(30);
 
}

void loop() {
 
 // acquisition de la temperature
 mesure_brute=analogRead(Voie_0);
 mesure_brute=mesure_brute/2;
 // Envoie la valeur sur l'afficheur LCD
 ELCD_Cursor_Position(12, 3);
 ELCD_put_str("--");
 delay(500);
 ELCD_Cursor_Position(12, 3);
[b] ELCD_put_str(string(mesure_brute));[/b]
 
 //Acquisition de la date et affichage
 //ELCD_Cursor_Position(12, 3);
 //heure=RTC.get(DS1307_HR,true);
 //Serial.print(heure);
 
 delay(1000);
}


/* Low Level ELCD routine */
void ELCD_initialize(){
 Serial.print(0xA0, BYTE);
}

void ELCD_Cursor_OFF(){
 Serial.print(0xA3, BYTE);
 Serial.print(0x0C, BYTE);
}

void ELCD_Cursor_ON(){
 Serial.print(0xA3, BYTE);
 Serial.print(0x0E, BYTE);  
}

void ELCD_Clear_LCD(){
 Serial.print(0xA3, BYTE);
 Serial.print(0x01, BYTE);
}

void ELCD_Cursor_Position(int x, int y){
 Serial.print(0xA1, BYTE);
 Serial.print(x, BYTE);
 Serial.print(y, BYTE);  
}

void ELCD_put_str(char *str){
 Serial.print(0xA2, BYTE);
 while(*str)
   Serial.print(*str++);
 Serial.print(0, BYTE);  
}

void ELCD_put_ch(char ch){
 Serial.print(0xA2, BYTE);
 Serial.print(ch);
 Serial.print(0, BYTE);  
}




J'obtiens cette erreur de compilation:
Bonjour_Pascal_ELCD.cpp: In function 'void loop()':
Bonjour_Pascal_ELCD:38: error: 'string' was not declared in this scope


VERSION DE SKYWOOD:
Extrait de la portion de code modifiée:

Code: [Select]

// acquisition de la temperature
 mesure_brute=analogRead(Voie_0);
 mesure_brute=mesure_brute/2;
 // Envoie la valeur sur l'afficheur LCD
 ELCD_Cursor_Position(12, 3);
 ELCD_put_str("--");
 delay(500);
 ELCD_Cursor_Position(12, 3);
 String str = mesure_brute;
 ELCD_put_str(str.toCharArray(mesure_brute));
 
 //Acquisition de la date et affichage
 //ELCD_Cursor_Position(12, 3);
 //heure=RTC.get(DS1307_HR,true);
 //Serial.print(heure);
 
 delay(1000);
}


J'obtiens cette erreur:

Bonjour_Pascal_ELCD.cpp: In function 'void loop()':
Bonjour_Pascal_ELCD:39: error: no matching function for call to 'String::toCharArray(int&)'
/Applications/ARDUINO/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/WString.h:80: note: candidates are: void String::toCharArray(char*, unsigned int)


ET ENFIN LA VERSION DE JEAN FRANCOIS:
Extrait du code modifié:
Code: [Select]

void loop() {
 
 // acquisition de la temperature
 mesure_brute=analogRead(Voie_0);
 mesure_brute=mesure_brute/2;
 // Envoie la valeur sur l'afficheur LCD
 ELCD_Cursor_Position(12, 3);
 ELCD_put_str("--");
 delay(500);
 ELCD_Cursor_Position(12, 3);
 ELCD_put_str(mesure_brute);
 
 //Acquisition de la date et affichage
 //ELCD_Cursor_Position(12, 3);
 //heure=RTC.get(DS1307_HR,true);
 //Serial.print(heure);
 
 delay(1000);
}


QUI ME DONNE CETTE ERREUR:


Bonjour_Pascal_ELCD.cpp: In function 'void loop()':
Bonjour_Pascal_ELCD:38: error: invalid conversion from 'int' to 'char*'
Bonjour_Pascal_ELCD:38: error: initializing argument 1 of 'void ELCD_put_str(char*)'


Comme vous pouvez le constater, c'est un peu compliqué.
Avez vous d'autres idées ?

Cdt,

Pascalou.

Edit de Jean-François : merci de mettre le code entre les balises "code"

Jean-François

Ta valeur brute est un entier, pour l'envoyer au LCD il faut la convertir en chaine de caractère.

Regarde ce topic
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

skywodd

... c'est pas beau de pas suivre les exemples ;)

j'ai pas dit de faire :
Code: [Select]

String str = mesure_brute;
ELCD_put_str(str.toCharArray(mesure_brute)); // erreur !

mais :
Code: [Select]

String str = mesure_brute; // la valeur mesure_brute est transformé en chaine de caractères
ELCD_put_str(str.toCharArray()); // ELCD_put_str utilise un char* mais str est un objet "String", avec la fonction .toCharArray() on transforme String en un char*
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Super_Cinci

C'est de ma faute : dans ma proposition de correction, j'ai pas mis de S majuscule à String(mesure_brute), ce qu'il aurait fallut faire... sinon, ça aurait peut-être marché

pascalou

#10
Nov 05, 2011, 02:23 pm Last Edit: Nov 05, 2011, 03:20 pm by pascalou Reason: 1
J'ai enfin trouvé une solution simple pour ceux que ça interesse.
Je transforme la variable INT issue de la mesure en String

Code: [Select]
String texte = (String(mesure_brute)); // Conversion de la mesure en string


Si mesure_brute n'est pas une variable de type INT, rien ne fonctionne.
Je ne sais pas pourquoi mais apparemment mes soucis provenaient de là.
J'avais essayé de la déclarer en char (en fait j'ai quasiment tout essayé depuis deux jours :-)

En espérant que ça pourra aider quelqu'un ayant des soucis d'affichages de variables provenant de conversions numériques/analogiques sur un ELCD.

Merci pour votre aide.

Par contre toujours pas de solution pour afficher directement l'heure récupérée d'une lecture d'un DS1307 à l'aide de la fonction ELCD_put_str() !
Le code ci dessous ne fct pas: (la première ligne passe mais pas la seconde)
Sans doute encore un problème de variable.
Quel est le type de variable conseillé pour récupérer une date/heure dans un DS1307 ???

Code: [Select]

String heure=String(RTC.get(DS1307_HR,true)); //Lecture de l'heure
ELCD_put_str(heure);


Le code qui me permet d'afficher la température:

Code: [Select]

#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h>

const int Voie_0=0; //declaration constante de broche analogique pour capteur temperature
     int mesure_brute;// Variable pour acquisition résultat brut de conversion analogique numérique
     float heure;
     char affichage;


void setup() {
 Serial.begin(19200);
 ELCD_initialize();
 delay(200);
 ELCD_Clear_LCD();
 ELCD_Cursor_Position(0, 0);
 ELCD_put_str("MESURES ARDUINO");
 delay(30);
 ELCD_Cursor_Position(0, 1);
 ELCD_put_str("Date:");
 delay(30);
 ELCD_Cursor_Position(0, 2);
 ELCD_put_str("Heure:");
 delay(30);
 ELCD_Cursor_Position(0, 3);
 ELCD_put_str("Temp:");
 delay(30);
 
}

void loop() {
 
 // acquisition de la temperature du TMP35
 mesure_brute=analogRead(Voie_0);
 
 // Envoie la valeur sur l'afficheur LCD en 3 parties distinctes.

 String texte = (String(mesure_brute)); // Conversion de la mesure en string
 
 ELCD_Cursor_Position(6, 3);
 delay(30);
 ELCD_put_ch(texte.charAt(0)); // Affiche le premier caractère
 delay(30);
 ELCD_Cursor_Position(7, 3);
 delay(30);
 ELCD_put_ch(texte.charAt(1)); // Affiche le deuxième caractère
 delay(30);    
 ELCD_Cursor_Position(8, 3);
 delay(30);
 ELCD_put_ch(texte.charAt(2)); // Affiche le troisième caractère
 delay(30);
 
 delay(1000); // On patiente une seconde
 
 }


/* Low Level ELCD routine */
void ELCD_initialize(){
 Serial.print(0xA0, BYTE);
}

void ELCD_Cursor_OFF(){
 Serial.print(0xA3, BYTE);
 Serial.print(0x0C, BYTE);
}

void ELCD_Cursor_ON(){
 Serial.print(0xA3, BYTE);
 Serial.print(0x0E, BYTE);  
}

void ELCD_Clear_LCD(){
 Serial.print(0xA3, BYTE);
 Serial.print(0x01, BYTE);
}

void ELCD_Cursor_Position(int x, int y){
 Serial.print(0xA1, BYTE);
 Serial.print(x, BYTE);
 Serial.print(y, BYTE);  
}

void ELCD_put_str(char *str){
 Serial.print(0xA2, BYTE);
 while(*str)
   Serial.print(*str++);
 Serial.print(0, BYTE);  
}

void ELCD_put_ch(char ch){
 Serial.print(0xA2, BYTE);
 Serial.print(ch);
 Serial.print(0, BYTE);  
}



Jean-François


J'ai enfin trouvé une solution simple pour ceux que ça interesse.
Je transforme la variable INT issue de la mesure en String

Code: [Select]
String texte = (String(mesure_brute)); // Conversion de la mesure en string

Si mesure_brute n'est pas une variable de type INT, rien ne fonctionne.



C'est ce que tout le monde t'explique depuis le début  :smiley-mr-green:
C'est bien que ça fonctionne.
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

skywodd

Quote
String texte = (String(mesure_brute)); // Conversion de la mesure en string

C'est pas utile de faire un cast de int vers String pour le stocker dans une String.

Code: [Select]

String texte = mesure_brute;

La librairie String arduino ce charge de la conversion directement, faire un "pré" cast du int ne fait qu'utiliser inutilement de la ram.
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

pascalou

Merci pour les infos, tout fonctionne a présent !

Go Up