[resolu] Afficheur ELCD série et librairie sd1307

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:

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:

 //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.

Ce qui est en rouge est en trop :

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

Les apostrophes.....

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...

// 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);
}

Et comme ça, ça fonctionne :

  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);

??

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 :

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

Version c++ :

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

Version "Arduino" :

String str = heure;
ELCD_put_str(str.toCharArray());

Juste dans ce bout de code :

  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));

Merci pour votre aide mais le casse tête continue...
J'ai toujours des erreurs de compilation :frowning:

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

#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:

 // 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é:

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"

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

Regarde ce topic

... c'est pas beau de pas suivre les exemples :wink:

j'ai pas dit de faire :

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

mais :

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*

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é

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

 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 :slight_smile:

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 ???

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:

#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);  
}

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

 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 :grin:
C'est bien que ça fonctionne.

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.

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.

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