Symbole °

Bonjour à touts(es)
Je suis sur un projet qui est proposé sur le Net pour afficher la température
Matériel:
Carte UNO
Capteur TMP36GZ
Afficheur NDS 1602 A
Mon probléme est de faire afficher le symbole "°" sur l'afficheur
J'utilise le code suivant:
lcd.write( "°" ); // affiche le signe degré
mais en retour j'ai sur l'afficheur j'ai un symbole tout autre "∞"
Avez vous une idée a me proposée ?
D'avance merci.
CDLT

Essaye ceci, ça devrait fonctionner:

void setup() {

Serial.begin(250000);

Serial.println(" \xB0" "C. Humidity: ");

}

void loop() {
 
}

Bonjour,

Essaies lcd.write('\xDF');

Merci les amis
c'est tout bon
Vous m'avez mis sur la piste j'ai saisie "lcd.write('Alt+0176');"
Le symbole ° apparait matérialisé par un petit point sur la lige la plus haute
Apparemment les symbole doivent être saisies par leurs code ASCII...
Il doit y avoir une différence entre (' ') et (" ") pour la saisie du texte?
CDLT

Loulou17700:
Il doit y avoir une différence entre (' ') et (" ") pour la saisie du texte?

J'ai constaté ça oui, par exemple:

Serial.print("Yo") renvois Yo mais Serial.print('Yo') renvois 22895

Du coup, j'ai cherché et: Littéraux de caractère C++ | Microsoft Learn

OK Merci
le (" ") retourne le texte tel quel...
alors que (' ') retourne une valeur exha je suppose, j'ai rencontré ça sous excel dans les conversions notamment
pour les format de date.
@+

" " est une chaine de caractères
' ' est un caractère

kamill:
" " est une chaine de caractères
' ' est un caractère

on peut même dire pour être très clair: ' ' est pour un SEUL caractère

si vous regardez mon projet d'afficheur et contrôle de T° et Humidité vous verrez que pour mon afficheur LCD j'ai utilisé const char * degree = "\337"; // °

j'avais posté il y a un moment ce petit bout de code pour un écran LCD en I2C

vous mettez un bouton entre la pin 8 et GND, à chaque click sur le bouton il vous affiche le caractère correspondant à un code entre 0 et 255 (0x00 et 0xFF en hexa)

// ---------------------------------------------
// Gestion du LCD
// ---------------------------------------------
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// adresse LDC 0x27  16 caractères, 2 lignes
LiquidCrystal_I2C lcd(0x27, 16, 2);

// le bouton pour les modes
// La librairie de gestion des boutons
#include <OneButton.h>    // https://github.com/mathertel/OneButton
const byte buttonPin = 8; // notre bouton est sur la pin 8
OneButton button(buttonPin, true); // true pour le mettre en INPUT_PULLUP

void simpleclick()
{
  static byte c = 0;

  c += 1;
  lcd.setCursor(0, 0);
  lcd.write(c);
  lcd.setCursor(2, 0);
  lcd.print(c);  lcd.print("   ");
  
  lcd.setCursor(0, 1);
  lcd.write(c + 1);
  lcd.setCursor(2, 1);
  lcd.print(c + 1);lcd.print("   ");
}


void setup() {
  Serial.begin(115200);
  // initialize the LCD
  lcd.begin();
  lcd.backlight();

  // On attache la fonction simpleClick() comme callBack en cas de simple click
  button.attachClick(simpleclick);
  simpleclick();
}

void loop() {
  button.tick();
}

Merci à vous tous avec toute ces infos je suis ravis :slight_smile:
Cordialement

Bonsoir tout le monde,
Suite à vos précédents postes qui m'ont vivement intéressés j'ai finalement opté pour la version "tableau" je ne sais pas si c'est comme ça qu'ont dit, cette option me donne le résultat attendu, ce n'est peut être pas la plus économe en mémoire, mais pour une utilisation ponctuelle elle a l'avantage de faire afficher le caractère que l'ont veux... je vais me faire une matrice sur papier pour définir le code voulu 0101010..... 0 c'est vide, 1 c'est noir.....
l'avantage aussi est de pouvoir faire des caractères en négatif (fond noir) en inversant les 0 et 1.
J'ai remarqué également qu'il y aune # d’affichage entre le "LCD" et le "Serial.print" apparemment le même code caractère s'affiche de façon # exemple le symbole °,
Donc voici le code en entier il y a surement des améliorations a apportées!!! j'ai fait avec les moyens du bord.

#include <LiquidCrystal.h> // charger la librairie LiquidCrystal
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; //Associe les pins de LiquidCrystal avec les pins de l'Arduino
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
#include <dht11.h> // charger la librairie DHT11
dht11 DHT11; // Créer le capteur DHT11 (Humidité/Température)
#define DHT11PIN 7 // Définir la pin utilisée sur Arduino pour lire le capteur DHT11
//Tableau dessin caractére °
byte degrees[8] = {
B01100,
B10010,
B10010,
B01100,
B00000,
B00000,
B00000,
B00000
};
void setup() {

}
void loop() {
int chk = DHT11.read(DHT11PIN); // Lecture du capteur
lcd.createChar(0, degrees); // Variable du caractère "°"
lcd.begin(16, 2); //Configure le nombre de colonnes et de rangées du LCD'S
lcd.setCursor(0,0); //début ligne 1
lcd.print("Humid.: "); // Affiche "Humid.: "
lcd.print((float)DHT11.humidity, 0); // Affiche la valeur Humidité
lcd.print(" %"); // Affiche "%" Humidité
lcd.setCursor(0,1);//début ligne 2
lcd.print("Temp. : "); // Affiche "Temp.:"
lcd.print((float)DHT11.temperature, 0); // Affiche la valeur Température
lcd.write(byte(0));// Affiche "°" Caractére
lcd.print('C'); // Affiche "C" Température
delay(2000); //pause 2s fige l'affichage des valeurs
for (int positionCounter = 0; positionCounter < 16; positionCounter++) { // Calcul nouvelle positions à gauche
lcd.scrollDisplayLeft(); //Avance d'une position à gauche <
delay(100); // pause 1/100s entre chaque position
}
delay(100); // pause 1/100s (Retard à la fin de la boucle compléte)
}

CDLT

C’est un peu dommage vu qu’il y a 99,99% de chances que ce caractère existe déjà...

Aviez vous essayé

const char * degree = "\337C"; // °C
....

lcd.setCursor(0,0);
lcd.print(10);
lcd.print(degree);
...

Vous devriez voir 10°C sur la première ligne

Je vais refaire un test avec votre code mais il me semble que ça n'a rien donné de concluant....
J'ai juste à intégrer les lignes de code au bon endroit dans mon code?
Est ce qu'il peut y avoir plusieurs librairie LiquidCrystal ce qui pourrai expliquer que je n'ai pas le même résulta que vous?
CDLT

Tous les afficheurs 1602 n'ont pas le même charset
La plupart ont ce charset qui permet d'afficher les caractères ascii et le katakana.
Il permet d'afficher le ° avec le code \xDF ou \337

D'autres on ce charset qui permet d'afficher les caractères accentués.
Il y a un caractère qui ressemble au ° en \xB0

Et je pense qu'il existe d'autres versions

Bonjour et merci kamill,
ceci confirme se que je supposé, en fait le code que me propose JML correspond au caractère de la première ligne, deuxième colonne en partant de la droite sur le premier tableau.
sur le deuxième tableau le code ( \xBO ) ° devrait corresponde le tout est de le convertir, est là je suis un peut perdu entre hex décimal ....
cordialement à vous

@ kamill
comment utiliser les tables que tu m'a fourni pour récupérer le code hex ?

si je part de l'exemple de JML: const char * degree = "\337C"; // °C

Exemple le code de la première ligne cinquième colonne en partant de droite.

le code ASCII est bien le caractère tel qu'il est présenté (A, B, C, D, E, F....)?
CDLT

337 c'est en octal. Ca donne DF en hexa
Sur le premier charset ça correspond à la colonne D (avant avant dernière colonne) et à la ligne F (dernière ligne). Tu retrouves bien le caractère °

C'est tout bon MERCI à vous.
Le PB venait bien de l'afficheur, j'ai acheter un nouvel afficheur et tout est rentrè dans l'ordre j'ai pu intégrer le bout de code que me proposé JML.
Le modèle est un SHIELD VMA203, ce qui confirme bien que tous les LCD ne gère pas les même tables de caractères, indépendamment de la librarie LiquidCrystal.
Je risque de vous mettre a contribution prochainement pour un nouveau projet "un compte tour pour circuit 24"....
Encore Merci

Vous aviez essayé mon bout de code qui affiche les caractères les uns après les autres ? Je suis persuadé que le ° y était aussi!!!

@ JML en fait j'ai pris que le bout de code qui concerne le "°" mais je vais tester l'intégralité du code pour voir ce que ça donne voir me donner de nouvelles idées;-) je ne manquerais pas de vous informer du résultat
Ce qui est sur c'est bien le LCD qui est en cause avec le nouveau pas de problème, ce qui est dommage c'est qu'il est sur un Shield avec des boutons qui ne me sont pas très utile pour ce montage, je pourrais toujours l'utilisé par ailleurs...
Bien cordialement

@JML, bonjour je viens de tester votre code il tourne (avec qq modif) et je trouve "°" en position 223,

le code modifier ceci dut à mont LCD j'ai même put tester les boutons :wink:

// Gestion du LCD
// ---------------------------------------------
//#include <Wire.h>
//#include <LiquidCrystal.h>

// adresse LDC 0x27 16 caractères, 2 lignes
//LiquidCrystal lcd(16, 2);
#include <LiquidCrystal.h> // charger la librairie LiquidCrystal (LCD1602-VMA203)
const int rs = 8, en = 9, d4 = 4, d5 = 5, d6 = 6, d7 = 7; //Associe les pins de LiquidCrystal avec les pins de l'Arduino
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
// le bouton pour les modes
// La librairie de gestion des boutons
#include <OneButton.h> // GitHub - mathertel/OneButton: An Arduino library for using a single button for multiple purpose input.
const byte buttonPin = A0; // notre bouton est sur la pin A0 pour moi
OneButton button(buttonPin, true); // true pour le mettre en INPUT_PULLUP

void simpleclick()
{
static byte c = 0;

c += 1;
lcd.setCursor(0, 0);
lcd.write(c);
lcd.setCursor(2, 0);
lcd.print(c); lcd.print(" ");

lcd.setCursor(0, 1);
lcd.write(c + 1);
lcd.setCursor(2, 1);
lcd.print(c + 1);lcd.print(" ");
}

void setup() {
Serial.begin(115200);
// initialize the LCD
lcd.begin(16, 2);
//lcd.begin();
// lcd.backlight();

// On attache la fonction simpleClick() comme callBack en cas de simple click
button.attachClick(simpleclick);
simpleclick();
}

void loop() {
button.tick();
}
+++++++++++++++++++++++++++++++++++

le système de boutons est de type résistif cad x résistances en séries est les boutons intercalé entre chaque bouton additionne la résistances totale qui est lue sur le A0
Le schéma est ici https://www.velleman.eu/downloads/29/infosheets/vma203_scheme.pdf
Dans le code il va falloir que j’essaie de faire une modif pour le faire reculer (décompter) 8765432.... avec "c -= 1;" il n'y a que le buton rst qui retourne à zero.
cordialement