[Risolto]Problemi con Leonardo e LCD Display standard

Buongiorno,

Sto lavorando con una Leonardo e un LCD standard, il programma che sto testando fa la lettura della temperatura da una sonda di temperatura I2C.
La lettura della temperatura avviene in modo corretto, in quanto rimando sulla seriale il valore e controllando col serial monitor i valori passano correttamente.
Il mio problema arriva quando tento di scrivere il valore su LCD standard.
Se io invio una stringa con il seguente comando funziona e appare correttamente:

lcd.print("temperatura");

quando invece cerco di scrivere il valore della variabile che contiene la temperatura con il seguente comando:

lcd.print(temp);

mi appaiono sul display dei caratteri incomprensibili.

Sono abbastanza alle prime armi con la programmazione siate clementi :disappointed_relieved:

rages:
Buongiorno,

Sto lavorando con una Leonardo e un LCD standard, il programma che sto testando fa la lettura della temperatura da una sonda di temperatura I2C.
La lettura della temperatura avviene in modo corretto, in quanto rimando sulla seriale il valore e controllando col serial monitor i valori passano correttamente.
Il mio problema arriva quando tento di scrivere il valore su LCD standard.
Se io invio una stringa con il seguente comando funziona e appare correttamente:

lcd.print("temperatura");

quando invece cerco di scrivere il valore della variabile che contiene la temperatura con il seguente comando:

lcd.print(temp);

mi appaiono sul display dei caratteri incomprensibili.

Sono abbastanza alle prime armi con la programmazione siate clementi :disappointed_relieved:

Potresti postare lo sketch intero che sai utilizzando?

prova ad usare lcd.write(temp);

Stavo provando questo programma, ho aggiunto io la parte x l'LCD

#include <i2cmaster.h>
#include <LiquidCrystal.h>
#include <stdio.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
char buf[10];

void setup(){
lcd.begin(16, 2);
Serial.begin(9600);
Serial.println("Setup...");

i2c_init(); //Initialise the i2c bus
PORTD = (1 << PORTD2) | (1 << PORTD3);//enable pullups
}

void loop(){
int dev = 0x5A<<1;
int data_low = 0;
int data_high = 0;
int pec = 0;



i2c_start_wait(dev+I2C_WRITE);
i2c_write(0x07);

// read
i2c_rep_start(dev+I2C_READ);
data_low = i2c_readAck(); //Read 1 byte and then send ack
data_high = i2c_readAck(); //Read 1 byte and then send ack
pec = i2c_readNak();
i2c_stop();

//This converts high and low bytes together and processes temperature, MSB is a error bit and is ignored for temps
double tempFactor = 0.02; // 0.02 degrees per LSB (measurement resolution of the MLX90614)
double tempData = 0x0000; // zero out the data
int frac; // data past the decimal point

// This masks off the error bit of the high byte, then moves it left 8 bits and adds the low byte.
tempData = (double)(((data_high & 0x007F) << 8) + data_low);
tempData = (tempData * tempFactor)-0.01;

float celcius = tempData - 273.15;
float fahrenheit = (celcius*1.8) + 32;

Serial.print("Celcius: ");
Serial.println(celcius);
sprintf(buf, "Temperatura!%d", celcius);
lcd.write(buf);


Serial.print("Fahrenheit: ");
Serial.println(fahrenheit);

delay(5000); // wait a second before printing again
lcd.clear();
delay(5000);
}

Scusate per la domanda ... molto probabilmente è una idiozia ... ma è possibile che il mio display che proviene dalla cina mi riporti dei caratteri cinesi al posto degli europei ???

rages:
Stavo provando questo programma, ho aggiunto io la parte x l'LCD

#include <i2cmaster.h>

#include <LiquidCrystal.h>
#include <stdio.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
char buf[10];

void setup(){
lcd.begin(16, 2);
Serial.begin(9600);
Serial.println("Setup...");

i2c_init(); //Initialise the i2c bus
PORTD = (1 << PORTD2) | (1 << PORTD3);//enable pullups
}

void loop(){
int dev = 0x5A<<1;
int data_low = 0;
int data_high = 0;
int pec = 0;

i2c_start_wait(dev+I2C_WRITE);
i2c_write(0x07);

// read
i2c_rep_start(dev+I2C_READ);
data_low = i2c_readAck(); //Read 1 byte and then send ack
data_high = i2c_readAck(); //Read 1 byte and then send ack
pec = i2c_readNak();
i2c_stop();

//This converts high and low bytes together and processes temperature, MSB is a error bit and is ignored for temps
double tempFactor = 0.02; // 0.02 degrees per LSB (measurement resolution of the MLX90614)
double tempData = 0x0000; // zero out the data
int frac; // data past the decimal point

// This masks off the error bit of the high byte, then moves it left 8 bits and adds the low byte.
tempData = (double)(((data_high & 0x007F) << 8) + data_low);
tempData = (tempData * tempFactor)-0.01;

float celcius = tempData - 273.15;
float fahrenheit = (celcius*1.8) + 32;

Serial.print("Celcius: ");
Serial.println(celcius);
sprintf(buf, "Temperatura!%d", celcius);
lcd.write(buf);

Serial.print("Fahrenheit: ");
Serial.println(fahrenheit);

delay(5000); // wait a second before printing again
lcd.clear();
delay(5000);
}




Scusate per la domanda ... molto probabilmente è una idiozia ... ma è possibile che il mio display che proviene dalla cina mi riporti dei caratteri cinesi al posto degli europei ???

Ho capito il problema: quando vai a fare il print su display scrivi così:
lcd.print(temp,DEC)

ho provato a fare come dici con DEC ma mi escono sempre caratteri strani tipo cinesi :fearful:, sicuramente non un numero.

rages:
ho provato a fare come dici con DEC ma mi escono sempre caratteri strani tipo cinesi :fearful:, sicuramente non un numero.

Mooolto strano, puoi postare il codice INTERO con le tue modifiche?

cece il programma è quello che ho postato, sembra che quando vado ad utilizzare sprintf mi vada tutto in tilt, se io uso lcd.print("stringa") funge, se invece utilizzo come nel programma sopracitato lcd.print(buf) derivato dal comando sprintf mi escono scritte tipo cinesi.

rages:
sembra che quando vado ad utilizzare sprintf mi vada tutto in tilt, se io uso lcd.print("stringa") funge,

Va in tilt perché il buffer, "char buf[10];" è troppo piccolo per contenere la scritta e il valore, devi dimensionarlo ad almeno 20 caratteri per essere sicuro.

aumentato a 20 e non cambia nulla astrobeed

Piccola correzione, mi sono accorto che anche lcd.print("stringa") funziona solo perchè è in void setup, poi non funziona più.

Non so più dove sbattere la testa ... nessuna altra idea ?

Vedo che il codice non usa la Wire per gestire l'I2C ma una libreria propria. Ora, siccome con l'uscita dell'IDE 1.x i metodi print delle classi di Arduino sono stati cambiati, potrebbe anche essere che se lo sketch è stato scritto per versioni precedenti dell'IDE ci sia qualche incompatibilità.

Ti passo anche un vecchio codice che usavo tempo fa per stampare su un LCD la temperatura letta da un sensore.

float i,  x;
char temperature[10];

    x = analogRead(3);
    i =  (((x / 1023.0) * 5.00) - 2.7315) * 100.0; //((x * 500.0) / 1023.0)- 273.0;
    dtostrf(i, 5, 1, temperature);
    lcd.LCD_3310_write_string(6,4,"Temp: ",MENU_NORMAL);
    lcd.LCD_3310_write_string(36,4,temperature, MENU_NORMAL);

Usavo dtostrf() per convertire il float in stringa di char[]. Provalo.

nulla da fare sempre caratteri ostrogoti, mi inizia a venire il dubbio che sia un problema hardware ...
Il fatto è che questo programma lo avevo già provato con Arduino Uno rev.3 e LCD shield e tutto funzionava alla grande, adesso volevo portarlo sulla Leonardo con LCD standard e non funziona più.

Andiamo per gradi ed a esclusione:

  • IDE usato x la uno 1.00 e 1.01, adesso leonardo 1.01 e 1.02
  • LCD shield (driver LCD4bit_mod) vs LCD standard con libreria standard (naturalmente modificando i comandi)
  • driver i2c lo stesso (tendo ad escludere che sia questo il colpevole perchè dalla seriale leggo correttamente le temperature, quindi l'interfacciamento sembra corretto)

l'unica cosa che mi viene da pensare è che ci sia un errore nella conversione float ---> char

altrimenti un problema hardware che mi fa incazzare qualcosa e manda in panico la scheda, ma mi sembra un programma banale.

Ho fatto un altro test.

Provato l'esempio di base "hello World" e tutto funzia, a questo punto mi vien da pensare che per qualche oscuro motivo la libreria I2C vada in conflitto con la trasmissione sul LCD. Possibile ?
Dico questo perchè se nel programma della temperatura metto anche un semplice lcd.print("hello"); i caratteri sono indecifrabili.

ragazzi forse ho capito ... è un problema hardware, tutto mi è stato più chiaro guardando questa foto Arduino Leonardo Pinout Reference | www.johngineer.com/blog/… | Flickr.
Io ho connesso LCD sui pin 12, 11, 5, 4, 3, 2 e la sonda sui pin SCL e SDA, però da quanto posso evincere da questa foto i pin 2 e 3 sono interconnessi con SCL e SDA ... quindi vanno in conflitto ??? Adesso non sono in laboratorio per provare ma mi sembra una risposta possibile.

Sì, sulla Leonardo l'I2C è sui pin 2 e 3: