[RISOLTO]Problema con LCD I2C 20*4 e caratteri personalizzati

Ciao ragazzi, sto costruendo una stazione mete bluetooth e ho un problema nella visualizzazione di un carattere personalizzato. Il carattere in questione è “°” da mettere prima di C nella visualizzazione della temperatura.

Quello che visualizza è questo : https://ibb.co/ckMCk6

Perché? Potete aiutarmi?

#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>


#define DHTPIN            8

#define DHTTYPE           DHT11     // DHT 11 
//#define DHTTYPE           DHT22     // DHT 22 (AM2302)
//#define DHTTYPE           DHT21     // DHT 21 (AM2301)

DHT_Unified dht(DHTPIN, DHTTYPE);

uint32_t delayMS;    //Delay del sensore

LiquidCrystal_I2C lcd(0x3F,20,4);    //Definizione del LCD e dell'indirizzo

byte Dot[8] = { B00111, B00101, B00111, B00000, B00000, B00000, B00000, B00000};

void setup() {
  dht.begin();  //Inizializzazione del sensore
  
  lcd.createChar(0, Dot);  //Creazione del carattere
  
  lcd.init();  //Inizializzazione dello schermo
  lcd.backlight();  //Attivazione retroilluminazione
  
  sensors_event_t event;
  
  dht.temperature().getEvent(&event);
  if (isnan(event.temperature)) {
    lcd.setCursor(0,0);
    lcd.print("Errore Temperatura!");
  }
  else {
    lcd.setCursor(0,0);
    lcd.print("Temperatura: ");
    lcd.setCursor(18,0);
    lcd.write(byte(0));   //Scrittura del carattere personalizzato
    lcd.print("C");
  }
  
  dht.humidity().getEvent(&event);
  if (isnan(event.relative_humidity)) {
    lcd.setCursor(0,1);
    lcd.print("Errore Umidita'!");
  }
  else {
    lcd.setCursor(0,1);
    lcd.print("Umidita': ");
    lcd.setCursor(15,1);
    lcd.print("%");
  }
}

void loop() {
  
  delay(delayMS);
  
  sensors_event_t event;
  
  dht.temperature().getEvent(&event);
  if (isnan(event.temperature)) {
    lcd.setCursor(13,0);
    lcd.print("Err");
  }
  else {
    lcd.setCursor(13,0);
    lcd.print(event.temperature);
  }
  
  dht.humidity().getEvent(&event);
  if (isnan(event.relative_humidity)) {
    lcd.setCursor(10,1);
    lcd.print("Err");
  }
  else {
    lcd.setCursor(10,1);
    lcd.print(event.relative_humidity);
  }
}

Ciao, io in passato anziché sprecare un carattere personalizzato per visualizzare un carattere ascii standard ho preferito la seguente soluzione:

lcd.write(223); //223 = °
lcd.print("C");

Prova a vedere se può andare bene anche al tuo LCD e se il carattere visualizzato è di tuo gradimento

Comunque io al tempo per visualizzare i caratteri personalizzati partivo dalla posizione 1 e non zero, non so se è quello il motivo della visualizzazione errata, prova a cambiare l’indice da zero a uno e vedere se visualizza il carattere speciale correttamente.

Grazie per le risposte. Avevo già pensato al cambio indice ma non funziona. Al codice ASCII non ci avevo pensato :-D

Vorrei comunque capire perché il carattere non viene visualizzato correttamente...

Se hai già provato a spostare l'indice fai anche questa prova, lascia l'indice a uno ma sposta la create char dopo

lcd.init();

guardando nel mio codice ho visto che io eseguivo due volte il metodo init ma non avendolo commentato :confused: :-[ non ricordo il perché

lcd.init();
lcd.init();
lcd.createChar(HEAT_SYSTEM_ICON, heatSystemIcon);

Prova anche questa soluzione se non dovesse funzionare la prima

Ha funzionato la prima, va prima inizializzato lo schermo e poi va creato il carattere. Grazie mille

Perché l'hai chiamato Dot (punto)? Per confondere le idee a chi volesse copiarti il programma? :) Anch'io ho dovuto usare il "cerchietto", ma l'ho ridefinito solo perché non mi piaceva quello di serie, che è un rettangolo. L'ho definito così:

byte cerchietto[8]=
{B00100,     
 B01010,
 B00100};

A parte la forma, però, avrei potuto usare quello standard, semplicemente scrivendo lcd.print("°"); Come puoi vedere nel datasheet del display https://www.openhacks.com/uploadsproductos/eone-1602a1.pdf è il carattere 223 (11011111) del suo set di caratteri, che corrisponde con il carattere ASCII 223.