Pages: [1] 2   Go Down
Author Topic: [Risolto]Problemi con Leonardo e LCD Display standard  (Read 1138 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Code:
lcd.print("temperatura");
quando invece cerco di scrivere il valore della variabile che contiene la temperatura con il seguente comando:
Code:
lcd.print(temp);
mi appaiono sul display dei caratteri incomprensibili.

Sono abbastanza alle prime armi con la programmazione siate clementi  smiley-sad-blue

« Last Edit: November 11, 2012, 03:11:49 pm by rages » Logged

Dueville (VI)
Offline Offline
Edison Member
*
Karma: 28
Posts: 1722
http://cesarecacitti.wordpress.com/
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Code:
lcd.print("temperatura");
quando invece cerco di scrivere il valore della variabile che contiene la temperatura con il seguente comando:
Code:
lcd.print(temp);
mi appaiono sul display dei caratteri incomprensibili.

Sono abbastanza alle prime armi con la programmazione siate clementi  smiley-sad-blue


Potresti postare lo sketch intero che sai utilizzando?
Logged

Arduino UNO r3, Arduino MEGA 1280, adafruit motor shield, bluetooth module, enc28j60 shield.
Ultimi acquisti: un sacco di componenti elettronici, ATTEN AT 8586

Tuscany
Offline Offline
Edison Member
*
Karma: 37
Posts: 1487
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

prova ad usare   lcd.write(temp);
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
#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 ???
Logged

Dueville (VI)
Offline Offline
Edison Member
*
Karma: 28
Posts: 1722
http://cesarecacitti.wordpress.com/
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
#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)
Logged

Arduino UNO r3, Arduino MEGA 1280, adafruit motor shield, bluetooth module, enc28j60 shield.
Ultimi acquisti: un sacco di componenti elettronici, ATTEN AT 8586

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ho provato a fare come dici con DEC ma mi escono sempre caratteri strani tipo cinesi  smiley-eek-blue, sicuramente non un numero.


Logged

Dueville (VI)
Offline Offline
Edison Member
*
Karma: 28
Posts: 1722
http://cesarecacitti.wordpress.com/
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ho provato a fare come dici con DEC ma mi escono sempre caratteri strani tipo cinesi  smiley-eek-blue, sicuramente non un numero.



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

Arduino UNO r3, Arduino MEGA 1280, adafruit motor shield, bluetooth module, enc28j60 shield.
Ultimi acquisti: un sacco di componenti elettronici, ATTEN AT 8586

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9185
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

aumentato a 20 e non cambia nulla astrobeed
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 313
Posts: 21650
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Code:
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.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: November 11, 2012, 12:54:44 pm by rages » Logged

Pages: [1] 2   Go Up
Jump to: