Erreur thermomètre programmable [RESOLU]

Bonjour à tous et à toutes,

Cela fait maintenant deux jours que je fais quelques manipulations pour m'habituer à mon Arduino Esplora, et aujourd'hui je me suis lancée dans un projet de thermomètre programmable. Le but est d'imposer une limite, modifiable avec les boutons haut et bas, et qui s'affiche sur l'écran.

Cependant, dans la partie affichage de la limite, j'ai un code d'erreur disant "invalid conversion from 'int' to 'const char*' [-fpermissive]".

Je suis plutôt jeune (13 ans), donc même si à force de travail je possède une certaine compréhension du langage Arduino, je suis toujours un peu perdue en ce qui concerne les valeurs char par exemple, que je ne comprends pas bien. Ci-dessous, mon code en entier, l'erreur se trouve aux lignes EsploraTFT.text(limite, 50, 70);

Merci d'avance de votre aide, et si vous en avez le temps, je vous serais reconnaissante de m'expliquer correctement où est l'erreur et comment la réparer, et quel est le rapport avec char.

Bonne journée,
Fenrir

// include the necessary libraries
#include <Esplora.h>
#include <TFT.h>            // Arduino LCD library
#include <SPI.h>

char tempPrintoutC[3];
char tempPrintoutF[3]; // array to hold the temperature data
int buttonBas = Esplora.readButton(SWITCH_DOWN);
int buttonHaut = Esplora.readButton(SWITCH_UP);
int limite = 18;

void setup() {

  // Put this line at the beginning of every sketch that uses the GLCD
  EsploraTFT.begin();

  // clear the screen with a black background
  EsploraTFT.background(0, 0, 0);

  // Pour set les couleurs. Dans l'ordre : Bleu, Vert, Rouge
  EsploraTFT.stroke(150, 180, 0);
  // set the text to size 2
  EsploraTFT.setTextSize(2);
  // start the text at the top left of the screen
  // this text is going to remain static
  // Pour écrire et placer le texte. Dans l'ordre : Texte, Position Horizontale (X), Position Verticale (Y).
  EsploraTFT.text("C:\n ", 25, 1);
  EsploraTFT.text("F:\n ", 112, 1);
  EsploraTFT.stroke(0, 30, 250);
  EsploraTFT.text("Limite :\n ", 40, 60);

  // set the text in the loop to size 5
  EsploraTFT.setTextSize(4);
}

void loop() {

   // read the temperature  in Celcius and store it in a String
  String temperatureC = String(Esplora.readTemperature(DEGREES_C));
  String temperatureF = String(Esplora.readTemperature(DEGREES_F));

  // convert the string to a char array
  temperatureC.toCharArray(tempPrintoutC, 3);
  temperatureF.toCharArray(tempPrintoutF, 3);

//Programmation de la limite
if(buttonHaut == LOW)
  {
    limite++;
  }
else {
    //Do nothing;
  }

  if(buttonBas == LOW)
  {
    limite--;
  }
else {
    //Do nothing;
  }

 if (atoi(tempPrintoutC) > limite) {
  EsploraTFT.stroke(0, 0, 255);
 }
 else {
  EsploraTFT.stroke(255, 255, 255);
 }

 int slider = Esplora.readSlider();

 if (atoi(tempPrintoutC) > 18) {
// play the note corresponding to the slider's position:
Esplora.tone(slider);
 }
 else {
  Esplora.noTone();
 }

  
  // print the temperature one line below the static text
  EsploraTFT.text(tempPrintoutC, 12, 25);
  EsploraTFT.text(tempPrintoutF, 95, 25);
  EsploraTFT.text(limite, 50, 70);

  delay(1000);
  // erase the text for the next loop
  EsploraTFT.stroke(0, 0, 0);
  EsploraTFT.text(tempPrintoutC, 12, 25);
  EsploraTFT.text(tempPrintoutF, 95, 25);
  EsploraTFT.text(limite, 50, 70);
}

Salut;

Je n'ai pas encor chargé ton code.

Mais cela vaut dire en gros que tu inscrire une donnée de type entière "integer = int" vers une variable de type "char" utile au données alphabétique.

Je vais voir cela !!

A plus

Salut,

Merci de ta réponse, je peux patienter, ne t'en fais pas ^^

A plus !

Je n'ai pas le même code erreur !!

exit status 1
'EsploraTFT' was not declared in this scope

Je vais voir dans la librairie "esplora" je ne connais pas "esplora".

A plus!

tout comme t'as du convertir les températures en chaînes de caractères avec les commandes

// convert the string to a char array
  temperatureC.toCharArray(tempPrintoutC, 3);

Tu devras faire quelque chose d'équivalent pour ta limite, pour ce faire, tu peux utiliser la fonction sprintf :

char limiteEnChaine[5];
sprintf(limiteEnChaine, "%d", limite);
EsploraTFT.text(limiteEnChaine, 50, 70);

Explication : visiblement EsploraTFT.text() ne prend qu'une chaine de caractères (en gros, du texte, pas des valeurs) C-like* pour pouvoir afficher quelque chose, lui passer une valeur plutôt qu'une chaîne te renvoie forcément une erreur lors de la compilation.

*Chaîne de caractères "C-like" : en C et C++ les chaînes de caractère sont en quelque sorte les variables qui permettent de définir et donc d'utiliser du texte. Ces chaînes ne sont rien d'autre que des tableaux de caractères (genre char monTableau[10]; ) qui contiennent une suite de caractères représentant ton texte (par exemple pour le mot "bonjour", le tableau contiendra le caractère 'b' à l'emplacement [ 0 ] du tableau, 'o' à l'emplacement [1], et ainsi de suite jusqu'au 'r' à la place [6] du tableau. Ensuite il y a forcément le caractère '\0' (valeur 0) pour dire que la chaîne/texte est terminé (fin de chaîne), dans notre exemple, le caractère '\0' se trouve donc à la place [7] du tableau.

est ce que " EsploraTFT.text(string(limite), 50, 70);" pourrais fonctionner ?

Le code ne fonctionne pas chez moi !!

Pas grave tes entre de bonne main avec zorro !!

A plus!

Zorro_X:
tout comme t'as du convertir les températures en chaînes de caractères avec les commandes

// convert the string to a char array

temperatureC.toCharArray(tempPrintoutC, 3);




Tu devras faire quelque chose d'équivalent pour ta limite, pour ce faire, tu peux utiliser la fonction sprintf :


char limiteEnChaine[5];
sprintf(limiteEnChaine, "%d", limite);
EsploraTFT.text(limiteEnChaine, 50, 70);




Explication : visiblement EsploraTFT.text() ne prend qu'une chaine de caractères (en gros, du texte, pas des valeurs) C-like* pour pouvoir afficher quelque chose, lui passer une valeur plutôt qu'une chaîne te renvoie forcément une erreur lors de la compilation.

*Chaîne de caractères "C-like" : en C et C++ les chaînes de caractère sont en quelque sorte les variables qui permettent de définir et donc d'utiliser du texte. Ces chaînes ne sont rien d'autre que des tableaux de caractères (genre char monTableau[10]; ) qui contiennent une suite de caractères représentant ton texte (par exemple pour le mot "bonjour", le tableau contiendra le caractère 'b' à l'emplacement [ 0 ] du tableau, 'o' à l'emplacement [1], et ainsi de suite jusqu'au 'r' à la place [6] du tableau. Ensuite il y a **forcément** le caractère '\0' (valeur 0) pour dire que la chaîne/texte est terminé (fin de chaîne), dans notre exemple, le caractère '\0' se trouve danc à la place [7] du tableau.

Merci de ton explication détaillée, je vais essayer ^^

manumanu:
Le code ne fonctionne pas chez moi !!

Pas grave tes entre de bonne main avec zorro !!

A plus!

Merci d'avoir voulu m'aider, c'est l'intention qui compte =)

Bref, je vais essayer ce que tu m'as proposé Zorro, je vous donne des nouvelles dès que c'est bon.

En tout cas je découvre une bibliothèque qui vas me servir.

A plus!

Re bonjour,

Zorro, en effet, ta correction efface le message d'erreur; cependant, mon programme ne marche pas : la limite reste à 18 même si j'appuie sur les boutons haut ou bas. Je remets le code avec tes corrections au cas-où j'ai mis ta correction au mauvais endroit à cause de mon manque d'expérience, mais je ne pense pas que ce soit ça.

En espérant que toi ou quelqu'un trouve le problème, et encore désolée de mon manque d'expérience, mais je suppose qu'un forum est fait pour ça ^^'

Merci d'avance,
Fenrir

// include the necessary libraries
#include <Esplora.h>
#include <TFT.h>            // Arduino LCD library
#include <SPI.h>

char tempPrintoutC[3];
char tempPrintoutF[3]; // array to hold the temperature data
int buttonBas = Esplora.readButton(SWITCH_DOWN);
int buttonHaut = Esplora.readButton(SWITCH_UP);
int limite = 18;
char limiteEnChaine[5];

void setup() {

  // Put this line at the beginning of every sketch that uses the GLCD
  EsploraTFT.begin();

  // clear the screen with a black background
  EsploraTFT.background(0, 0, 0);
  sprintf(limiteEnChaine, "%d", limite);

  // Pour set les couleurs. Dans l'ordre : Bleu, Vert, Rouge
  EsploraTFT.stroke(150, 180, 0);
  // set the text to size 2
  EsploraTFT.setTextSize(2);
  // start the text at the top left of the screen
  // this text is going to remain static
  // Pour écrire et placer le texte. Dans l'ordre : Texte, Position Horizontale (X), Position Verticale (Y).
  EsploraTFT.text("C:\n ", 25, 1);
  EsploraTFT.text("F:\n ", 112, 1);
  EsploraTFT.stroke(0, 30, 250);
  EsploraTFT.text("Limite :\n ", 40, 60);

  // set the text in the loop to size 5
  EsploraTFT.setTextSize(4);
}

void loop() {

   // read the temperature  in Celcius and store it in a String
  String temperatureC = String(Esplora.readTemperature(DEGREES_C));
  String temperatureF = String(Esplora.readTemperature(DEGREES_F));

  // convert the string to a char array
  temperatureC.toCharArray(tempPrintoutC, 3);
  temperatureF.toCharArray(tempPrintoutF, 3);

  sprintf(limiteEnChaine, "%d", limite);

//Programmation de la limite
if(buttonHaut == LOW)
  {
    limite++;
  }
else {
    //Do nothing;
  }

  if(buttonBas == LOW)
  {
    limite--;
  }
else {
    //Do nothing;
  }

 if (atoi(tempPrintoutC) > limite) {
  EsploraTFT.stroke(0, 0, 255);
 }
 else {
  EsploraTFT.stroke(255, 255, 255);
 }

 int slider = Esplora.readSlider();

 if (atoi(tempPrintoutC) > limite) {
// play the note corresponding to the slider's position:
Esplora.tone(slider);
 }
 else {
  Esplora.noTone();
 }

  
  // print the temperature one line below the static text
  EsploraTFT.text(tempPrintoutC, 12, 25);
  EsploraTFT.text(tempPrintoutF, 95, 25);
  EsploraTFT.text(limiteEnChaine, 50, 70);

  delay(1000);
  // erase the text for the next loop
  EsploraTFT.stroke(0, 0, 0);
  EsploraTFT.text(tempPrintoutC, 12, 25);
  EsploraTFT.text(tempPrintoutF, 95, 25);
  EsploraTFT.text(limiteEnChaine, 50, 70);
}

EDIT

Et bien en fait, j'ai le plaisir de vous annoncer que le manque de réaction de mon programme était juste dû à une autre erreur de ma part, c'est à dire mettre Esplora.readButton(SWITCH_DOWN) au lieu de Esplora.readButton(1).

Je me sens vraiment stupide ^^'

Mais Zorro, ton aide n'a pas été inutile pour autant, bien au contraire, car de toute façon j'aurais quand même eu la même erreur, et en plus tu m'as aidée à progresser concernant char =)

Merci également aux autres personnes ayant voulu m'aider, comme manumanu rjnc38, ça fait plaisir de voir des personnes serviables et agréables !

Je vous donne le code au cas où vous ou quelqu'un d'autre veuille avoir un thermomètre réglable, bien que je me doute que si quelqu'un comme moi parvienne à le faire, ça ne devrait pas vous poser trop de problème ^^'

En tout cas, merci encore, et bonne continuation, à bientôt peut-être =)

Fenrir

// include the necessary libraries
#include <Esplora.h>
#include <TFT.h>            // Arduino LCD library
#include <SPI.h>

char tempPrintoutC[3];
char tempPrintoutF[3]; // array to hold the temperature data
int limite = 20;
char limiteEnChaine[5];

void setup() {

  // Put this line at the beginning of every sketch that uses the GLCD
  EsploraTFT.begin();

  // clear the screen with a black background
  EsploraTFT.background(0, 0, 0);
  sprintf(limiteEnChaine, "%d", limite);

  // Pour set les couleurs. Dans l'ordre : Bleu, Vert, Rouge
  EsploraTFT.stroke(150, 180, 0);
  // set the text to size 2
  EsploraTFT.setTextSize(2);
  // start the text at the top left of the screen
  // this text is going to remain static
  // Pour écrire et placer le texte. Dans l'ordre : Texte, Position Horizontale (X), Position Verticale (Y).
  EsploraTFT.text("C:\n ", 25, 1);
  EsploraTFT.text("F:\n ", 112, 1);
  EsploraTFT.stroke(0, 30, 250);
  EsploraTFT.text("Limite :\n ", 40, 60);

  // set the text in the loop to size 5
  EsploraTFT.setTextSize(4);
}

void loop() {

   // read the temperature  in Celcius and store it in a String
  String temperatureC = String(Esplora.readTemperature(DEGREES_C));
  String temperatureF = String(Esplora.readTemperature(DEGREES_F));

  // convert the string to a char array
  temperatureC.toCharArray(tempPrintoutC, 3);
  temperatureF.toCharArray(tempPrintoutF, 3);

  sprintf(limiteEnChaine, "%d", limite);

//Programmation de la limite
if (Esplora.readButton(3)== LOW)
  {
    limite++;
  }
else {
    //Do nothing;
  }

  if(Esplora.readButton(1)== LOW)
  {
    limite--;
  }
else {
    //Do nothing;
  }

 if (atoi(tempPrintoutC) > limite) {
  EsploraTFT.stroke(0, 0, 255);
 }
 else {
  EsploraTFT.stroke(255, 255, 255);
 }

 int slider = Esplora.readSlider();

 if (atoi(tempPrintoutC) > limite) {
// play the note corresponding to the slider's position:
Esplora.tone(slider);
 }
 else {
  Esplora.noTone();
 }

  
  // print the temperature one line below the static text
  EsploraTFT.text(tempPrintoutC, 12, 25);
  EsploraTFT.text(tempPrintoutF, 95, 25);
  EsploraTFT.text(limiteEnChaine, 50, 70);

  delay(1000);
  // erase the text for the next loop
  EsploraTFT.stroke(0, 0, 0);
  EsploraTFT.text(tempPrintoutC, 12, 25);
  EsploraTFT.text(tempPrintoutF, 95, 25);
  EsploraTFT.text(limiteEnChaine, 50, 70);
}

manumanu:
En tout cas je découvre une bibliothèque qui vas me servir. A plus!

Tant mieux, si je peux aider quelqu'un en même temps c'est toujours sympa ^^ A plus !

un document intéressant sur l' Esplora

C'est justement ce que j'allais poster, c'est grâce à ceci que je me suis rendue compte de mon erreur sur les boutons ^^

Merci rjnc38

Superbe boulot de la part de l'éditeur du document l. Coutelier !

J'étais en train de me documenter sur "esplora" => finalement je ne pourrais pas l'exploiter en tout cas pas maintenant!

Merci!

Voici la dernière version de mon code, au cas où ça intéresserait quelqu'un ^^
Notez que ce code ne marchera qu'avec un Arduino Esplora.

Il s'agit d'un thermomètre, donc les mesures prises s'affichent en Celcius et en Fahrenheit sur l'écran, et s'actualisent chaque seconde.

Vous pouvez imposer une limite de température de base 20°C, limite modifiable en appuyant sur le joystick en même temps d'appuyer sur le bouton en haut du losange pour augmenter la limite, en bas pour la baisser. Tant que la température reste en dessous de la limite, la LED restera allumée en vert.

Si la température en Celcius dépasse la limité imposée, la température s'affichera en rouge, la LED deviendra également rouge, et le buzzer se mettra en route avec un son modifiable en bougeant le slider (je ferai peut-être une mélodie par la suite).

Voilà, c'est pas grand chose, mais si ça peux rendre service à quelqu'un, alors ce sera toujours ça =)

Bonne continuation !

Fenrir

// include the necessary libraries
#include <Esplora.h>
#include <TFT.h>            // Arduino LCD library
#include <SPI.h>

char tempPrintoutC[3];
char tempPrintoutF[3]; // array to hold the temperature data
int limite = 20;
char limiteEnChaine[5];

void setup() {

  // Mettez cette ligne pour chaque sketch utilisant le GLCD
  EsploraTFT.begin();

  // clear the screen with a black background
  EsploraTFT.background(0, 0, 0);

  // Pour set les couleurs. Dans l'ordre : Bleu, Vert, Rouge
  EsploraTFT.stroke(150, 180, 0);
  // set the text to size 2
  EsploraTFT.setTextSize(2);
  // start the text at the top left of the screen
  // this text is going to remain static
  // Pour écrire et placer le texte. Dans l'ordre : Texte, Position Horizontale (X), Position Verticale (Y).
  EsploraTFT.text("C:\n ", 25, 1);
  EsploraTFT.text("F:\n ", 112, 1);
  EsploraTFT.stroke(0, 30, 250);
  EsploraTFT.text("Limite :\n ", 40, 60);

  // Set le texte dans le loop en taille 4
  EsploraTFT.setTextSize(4);
}

void loop() {

   // read the temperature  in Celcius and store it in a String
  String temperatureC = String(Esplora.readTemperature(DEGREES_C));
  String temperatureF = String(Esplora.readTemperature(DEGREES_F));

  // convert the string to a char array
  temperatureC.toCharArray(tempPrintoutC, 3);
  temperatureF.toCharArray(tempPrintoutF, 3);

//Convertir une valeur en chaîne 
  sprintf(limiteEnChaine, "%d", limite);

//Modification de la limite
if (Esplora.readButton(3)== LOW && Esplora.readJoystickButton()== LOW)
  {
    limite++;
  }

  if(Esplora.readButton(1)== LOW && Esplora.readJoystickButton()== LOW)
  {
    limite--;
  }
else {
    //Ne rien faire;
  }

//Si la température est supérieure à la limite, faire...
 if (atoi(tempPrintoutC) > limite) {
  EsploraTFT.stroke(0, 0, 255);
  Esplora.writeRed(255);
  }
  
 else {
  EsploraTFT.stroke(255, 255, 255);
  Esplora.writeGreen(255); 
 }

 //Buzzer en fonction du slider
 int slider = Esplora.readSlider();

 if (atoi(tempPrintoutC) > limite) {
// play the note corresponding to the slider's position:
Esplora.tone(slider);
 }
 else {
  Esplora.noTone();
 }
 
  // Imprimer la température une ligne sous le texte statique
  EsploraTFT.text(tempPrintoutC, 12, 25);
  EsploraTFT.text(tempPrintoutF, 95, 25);
  EsploraTFT.text(limiteEnChaine, 50, 80);

  delay(1000);
  // erase the text for the next loop
  EsploraTFT.stroke(0, 0, 0);
  EsploraTFT.text(tempPrintoutC, 12, 25);
  EsploraTFT.text(tempPrintoutF, 95, 25);
  EsploraTFT.text(limiteEnChaine, 50, 80);
  Esplora.writeRGB(0, 0, 0);
}

Ravi d'avoir pu t'aider ! :wink: