Arduino UNO - Problema caratteri "strani"

salve, sono nuovo del forum e mi sono appassionato di questo mondo da qualche mesetto. Ho iniziato un progetto per cercare di controllare la temperatura ext e int, accendere la caldaia tramite telecomando ir (per ora) per poi integrare il modulo wifi e programmarla in base ai giorni. Inoltre ho aggiunto 3 pulsanti per controllare la temperatura e umidità attuale, per vedere Tmax e Tmin e infine per fare un clear del display (questo è momentaneo, finchè non trovo un metodo funzionante per pulire lo schermo quando passo da una schermata a un’altra. Ora però ho un problema, quando carico il codice, i simboli tipo “goccia” e “bulbo”, vengono scritti sul monitor in maniera strana. Mi potete dire se sbaglio qualcosa? grazie. P.s se avete qualche consiglio per migliorarlo, è ben accetto! :smiley:

/*connessioni sulla scheda
   ir 1838 ( s - +) pin 11
   led resisteza 220ohm sul -, pin 13
   dht 11 ( s + -) pin 12
   rtc1302 (+ - CE , IO , CLK) pin 10 9 8, rst=ce, IO=dat, clk=clk
   schermo (- + sda scl) pin A4 sda, A5 scl
     // lcd.backlight();
*/
///////////////////////////////////// LIBRERIE ///////////////////////////////////
#include <DS1302.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
#include "IRremote.h"
#include <Wire.h>

/////////////////////////////////// VARIABILI ///////////////////////////////////
int receiver = 11; // Non usare 3 e 13
float t, tmax = 0, tmin = 80, TMax = 0, TMin = 0;  //variabile temperatura
float u;  //variabile umidità

byte bulbo[8] = {B00100,B01010,B01010,B01110,B01110,B11111,B11111,B01110};
byte goccia[8] = {B00100,B00100,B01010,B01010,B10001,B10001,B10001,B01110};
byte gradi[8] = {B11000,B11000,B00011,B00100,B00100,B00100,B00011,B00000};

int  statopulsante1, statopulsante2, esci = LOW;

#define led1 13
#define pag1 7              // pin di input dove è collegato il pulsante  
#define pag2 6
#define esc 5

/////////////////////////////////////////////////////////////////////////////
IRrecv irrecv(receiver);           // IR
decode_results results;            // IR
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  //DISPLAY
DS1302 rtc(10, 9, 8); //RTC orologio
DHT dht(12, DHT11); //DHT temperatura

void setup()
{
  pinMode(pag1, INPUT);     // bottone 1
  pinMode(pag2, INPUT);     // bottone2
  pinMode(esc, INPUT);     // esc
  pinMode (led1, OUTPUT);  //led
   //// disabilita protezione RTC per orologio/////////////////////////
  rtc.halt(false);
  rtc.writeProtect(false);
  lcd.createChar(1, bulbo);
  lcd.createChar(4, goccia);
  lcd.createChar(3, gradi);
  lcd.begin(16, 2);
  Serial.begin(9600);
  dht.begin();
  irrecv.enableIRIn(); // Start IR
  // Per modificare data o ora togliere commento e caricare i 3 set, poi ripristinarli e ricaricare
  //rtc.setDOW(SUNDAY);        // Set Day-of-Week to FRIDAY
  //rtc.setTime(11, 36, 0);     // Set the time to 12:00:00 (24hr format)
  //rtc.setDate(11, 12, 2016);   // Set the date to August 6th, 2010
}

void loop() {
  errore();
  dati();
  benvenuto();
  statopulsante1 = digitalRead(pag1);  
  statopulsante2 = digitalRead(pag2);
  esci = digitalRead(esc);

  // controlla che l'input sia HIGH (pulsante premuto)
   if (esci == HIGH) {
    pulizia();
   }

  if (statopulsante1 == HIGH) {
    pagina1();
    statopulsante2 = 0;
    delay(5000);
  }
  if (statopulsante2 == HIGH) {
    pagina2();
    statopulsante1 = 0;
    delay(5000);
  }

  }

void benvenuto()
{
  dati();
  lcd.setCursor(0, 0);
  lcd.print("   ");
  lcd.setCursor(10, 1);
  lcd.print(" ");
  lcd.setCursor(12, 0);
  lcd.print("     ");
  // scrittura a video ora
  // GIORNO
  lcd.setCursor(3, 0);
  lcd.print(rtc.getDOWStr()); //FORMAT_SHORT
  // Data
  lcd.setCursor(0, 1);
  lcd.print(rtc.getDateStr()); //FORMAT_SHORT
  //ORA
  lcd.setCursor(11, 1);
  lcd.print(rtc.getTimeStr(FORMAT_SHORT)); //FORMAT_SHORT
  
}
void Tmaxmin()
{
  lcd.clear();
  if (t < tmin)
  {
    tmin = TMin;
  }

  if (t > tmax)
  {
    tmax = TMax;
  }
  //////////////////min////////
  lcd.setCursor(1, 0);
  lcd.print("T-Min");
  lcd.setCursor(1, 1);
  lcd.print(tmin,1);
  lcd.setCursor(5, 1);
  lcd.write(3);
  ////////////////////max//////////
  lcd.setCursor(10, 0);
  lcd.print("T-Max");
  lcd.setCursor(10, 1);
  lcd.print(tmax,1);
  lcd.setCursor(14, 1);
  lcd.write(3);
}


void dati() {
  t = dht.readTemperature() - 3;
  u = dht.readHumidity() + 10;
  TMax = TMin = t;
}

void pagina1() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.write("Int ");
  lcd.setCursor(5, 0);
  lcd.write(1);
  lcd.setCursor(7, 0);
  lcd.print(t, 0);
  lcd.setCursor(9, 0);
  lcd.write(3);
  lcd.setCursor(11, 0);
  lcd.write(2);
  lcd.setCursor(13, 0);
  lcd.print(u, 0);
  lcd.setCursor(15, 0);
  lcd.print("%");
  /////EXT//////////////
  lcd.setCursor(0, 1);
  lcd.write("Ext ");
  lcd.setCursor(5, 1);
  lcd.write(1);
  lcd.setCursor(7, 1);
  //lcd.print(t, 0);
  lcd.setCursor(9, 1);
  lcd.write(3);
  lcd.setCursor(11, 1);
  lcd.write(2);
  lcd.setCursor(13, 1);
 // lcd.print(u, 0);
  lcd.setCursor(15, 1);
  lcd.print("%");

}

void pagina2() {
  Tmaxmin();
}

void pulizia() {
  lcd.clear();
}

void errore() {
  if  (isnan(t) || isnan(u))
  {
    lcd.clear();
    lcd.setCursor(4, 0);
    lcd.print("ERRORE DHT");
    digitalWrite(led1, HIGH);
    delay(2000);
  }
  else
  {
    digitalWrite(led1, LOW);
  }
}

Ti sei presentato ?
Prova a verificare che hai impostato i parametri della seriale (baud a 9600, parity e stop) uguale per entrambe le parti.

Si Si!! Miticooooooooo!!!
ho scambiato l'ordine dei comandi, portando in testa questo:

lcd.begin(16, 2);
  Serial.begin(9600);

Grazie mille.