Invio valore variabile tramite I2C a display lcd

Ciao a tutti, ho collegato un display lcd (lcd03 devantech 2x16) tramite I2C ad Arduino UNO R3 (mettendo resistenze di pull-up da 2KOhm sui collegamenti I2C).
ho trovato il modo di inviare scritte e comandi (cursore,illuminazione,ecc) tramite libreria Wire però non ho capito come inviare il valore decimale di una variabile (sensore temperatura) senza che questo venga interpretato come un comando.
ad esempio chiamando una variabile "temp":
temp = 10; (naturalmente al posto di 10 ci sarà analogRead...)
Wire.write(temp);
in questo modo al display arriva 10 che corrisponde ad un comando
Come invio il valore?
grazie

ps:un altro dubbio che ho,il primo comando tramite Wire.write dopo il Wire.beginTransmission il display non me lo legge.C'entra qualcosa il numero di bit inviati da Arduino sul bus?

I numeri piú grandi di 32 li interpreta come caratteri.

http://playground.arduino.cc/Code/LCDi2c
La libreria dovrebbe essere quella per i display della robot-electronics dove non funziona il download dal link indicato.
Prova il link nel ultimo rply:

Un esempio su:
http://code.google.com/p/quickanddirty/source/browse/trunk/avr/examples/arduino/LCD03.pde?r=237

Ciao Uwe

ciao innanzitutto grazie per la risposta, ho provato questa libreria ma caricando un esempio (LCD_test) mi da questo errore:
LCDi2cW lcd = LCDi2cW(2,16,0x4C,0); (riga di sketch evidenziata)

'LCDi2cW' does not name a type

ho provato ad installare questa:

creando una cartella nelle librerie ma è come se non la riconoscesse, cioè quando la chiamo nello sketch non si colorano i caratteri ma restano neri...

Hai chiuso e riaperto il IDE dopo aver copiato la libreria.
Ha dato il nome giusto alla cartella dove hai messo la libreria?
Dacci lo sketch che hai usato.
Ciao Uwe

allora:
-sì ho chiuso e riaperto l'IDE;
-ho dato lo stesso nome dei file .h .ccp cioè "LCDi2cR"

questo è lo sketch di esempio che a me non funge:

// [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]
// []
// []       i2c LCD library Display Test Demo
// []	
// []	4-2-2009  dale@wentztech.com
// []
// []
// [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]


#define VERSION "1.1"

#include <Wire.h>
#include <inttypes.h>

//  Uncomment the two lines for the display you are using

//	web4robot.com display

#include <LCDi2cW.h>                    
LCDi2cW lcd = LCDi2cW(2,16,0x4C,0);             


 //   robot-electronics.co.uk 

//#include <LCDi2cR.h>                      
//LCDi2cR lcd = LCDi2cR(4,40,0x63,0);



uint8_t rows = 4;
uint8_t cols = 20;



void setup() { 

  lcd.init();                          // Init the display, clears the display
 
  lcd.print("Hello World!");       // Classic Hello World!
 
   delay(1000);


}


void loop()
{

     lcdtest_basic();
  
}


void lcdtest_basic(){
  
  lcd.clear();
  lcd.print ("Cursor Test");
  delay(1000);
  Cursor_Type();
  
  lcd.clear();
  lcd.print("Characters Test");
  delay(1000);
  Characters();
  delay(1000);

  lcd.clear();
  lcd.print("Every Line");
  delay(1000);
  Every_Line(rows);
  delay(1000);
  
  lcd.clear();
  lcd.print("Every Position");
  delay(1000);
  Every_Pos(rows,cols);
  delay(1000);
  

  //Fancy_Clear();
  
   // Count_Numbers();
   // Fancy_Clear();


}

void Cursor_Type(){

  lcd.setCursor(0,0);
  lcd.print("Underline Cursor");
  lcd.setCursor(1,0);
  lcd.cursor_on();
  delay(1000);
  lcd.cursor_off();
  lcd.setCursor(0,0);
  lcd.print("Block Cursor    ");
  lcd.setCursor(1,0);
  lcd.blink_on();
  delay(1000);
  lcd.blink_off();
  lcd.setCursor(0,0);
  lcd.print("No Cursor      ");
  lcd.setCursor(1,0);
  delay(1000);
  }
  



void Count_Numbers(){

  lcd.clear();
  lcd.print("Count to 255");

  for (int i=0;i<255;i++){
    
    lcd.setCursor(1,0);
    
    lcd.print(i,DEC);
    
    lcd.setCursor(1,7);
    
     lcd.print(i,BIN);
    
    // delay(10);
    
  }
  
}


// Assume 16 character lcd

void Characters(){
  
int  chartoprint=48;
char a;

        lcd.clear();
 
  for(int i=0 ; i < rows ; i++){

      for(int j=0 ; j < cols ; j++){
        
          lcd.setCursor(i,j);
          a = char(chartoprint);
          lcd.print(char(chartoprint));
          chartoprint++;
          if(chartoprint == 127)
              return;
 
      }
  }
 
}


void Fancy_Clear(){
  
     for (int i=0 ; i < rows ; i++){
       
       for(int j=0 ; j < cols/2 ; j++){
       lcd.setCursor(i,j);
       lcd.print(" ");
  
       lcd.setCursor(i, cols - j);
       lcd.print(" ");
       }
       //delay(10);
       
     }
    
}

void Every_Line(int lines){

  lcd.clear();
  for(int i=0 ; i < lines ; i++){
      lcd.setCursor(i,0);
      lcd.print("Line : ");
      lcd.print(i,DEC);
      
  }  
}

void Every_Pos(int lines,int cols){
  
  lcd.clear();

  for(int i=0 ; i < lines ; i++){
    for(int j=0 ; j< cols ; j++){
      lcd.setCursor(i,j);
      lcd.print(i,DEC);
    }

  } 

}

può essere la versione dell'IDE ?

L'ultima versione dell'IDE è la 1.0.3 e la trovi qui --> http://arduino.cc/en/Main/Software
Le librerie ti conviene metterle all'interno la cartella "libraries" che è dentro la cartella "Arduino" che contiene gli sketch.
A seconda del S.O. utilizzato la cartella Arduino ha diversi percorsi. Su Windows la trovi dentro "Documenti".
Se dentro la cartella "Arduino" non trovi "libraries" creala.

I comandi delle librerie si colorano, ovvero vengono riconosciute dall'IDE come tali, solo se nella libreria è presente il file keyword.txt che deve contenere l'elenco dei comandi/funzioni usate dalla libreria.
Nel 90% dei casi non è presente. Se lo dimenticano quasi tutti gli autori. Non preoccuparti. Non è un problema.

Gringo per favore incolla tutti i mesaggi di errore che Ti da il IDE quando compili (verify).
Ciao Uwe

Gringo:
ciao innanzitutto grazie per la risposta, ho provato questa libreria ma caricando un esempio (LCD_test) mi da questo errore:
LCDi2cW lcd = LCDi2cW(2,16,0x4C,0); (riga di sketch evidenziata)

'LCDi2cW' does not name a type

ho provato ad installare questa:
Arduino Forum

La libreria che hai linkato semplicemente non definisce una classe LCDi2cW ma solo LCD_i2cR.
Sul Playground ho trovato questa pagina:
http://playground.arduino.cc/Code/LCDAPI
Lì si parla di una LCDi2cR ma il link porta ad un sito Apple che non funziona più.

O modifichi l'esempio che stai usando con il nuovo nome LCD_i2cR oppure contatti l'autore e chiedi a lui.

Il nuovo sito dell'autore è qui --> LCD i2c Libraries for Arduino | KB9JJA
Le nuove librerie compatibili con l'ide 1.0.2 e credo anche la ide 1.0.3 qui --> Index of /filevault/Electronics/Arduino

Oppure scarichi direttamente lo zip da qui --> http://www.wentztech.com/filevault/Electronics/Arduino/LCDi2cW-1_0_2.zip

Grazie a tutti per i numerosi interventi.
Ora sono fuori casa per qualche gg appena rientro provo i vostri consigli e posto gli errori.a presto! :wink:

Ciao..
Io sinceramente uso questa libreria, LiquidCrystal_I2C, per il dialogo con un display 20x4 e con un semplice lcd.print "stampo" qualunque cosa nel lcd.
Non so se ti può essere d' aiuto.

Dipende se usi lo stesso suo display e se la libreria è compatibile.

ciao a tutti eccomi qui,
allora la libreria LiquidCrystal_I2C non funziona (non da proprio segni di vita col mio display).

ho scaricato l'ultima versione dell'IDE (1.0.3 avevo la 1.0.2) e ho scaricato la libreria LCDi2cW-1_0_2.zip e ho preso i 2 file .h e .cpp e li ho sostituiti a quelli LCDi2cR e rinominato la cartella LCDi2cW e sembra comunicare col display ma in modo non esatto cioè quando apro l'esempio lcd_test compare il cursore e il display si illumina ad intermittenza ma non seguendo il programma (che dovrebbe anche far comparire la scritta Hello World che non compare).

ragazzi alla fine a me servirebbe solo far comparire il valore della temperatura che è una variabile il resto lo faccio tramite Wire...

grazieee

Controlla i parametri iniziali

#include <LCDi2cW.h>                    
LCDi2cW lcd = LCDi2cW(2,16,0x4C,0);             

uint8_t rows = 2;
uint8_t cols = 16;

devono corrispondere al tuo display: Righe, Colonne, Indirizzo I2C, numero del display (per il momento 0).

Per conoscere l'indirizzo lascia tutto collegato e carica questo sketch --> Arduino Playground - I2cScanner

PaoloP:
Controlla i parametri iniziali

#include <LCDi2cW.h>                    

LCDi2cW lcd = LCDi2cW(2,16,0x4C,0);

uint8_t rows = 2;
uint8_t cols = 16;




devono corrispondere al tuo display: Righe, Colonne, Indirizzo I2C, numero del display (per il momento 0).

Per conoscere l'indirizzo lascia tutto collegato e carica questo sketch --> http://playground.arduino.cc/Main/I2cScanner

allora l'indirizzo lo conosco, lo uso già con la libreria Wire (è 0x63).
quando modifico quei 2 valori rows e cols il display smette di illuminarsi ma il cursore continua a lampeggiare e spostarsi...credo che questa libreria non sia compatibile col mio display.
stavo pensando ad una soluzione: se mi accontentassi di vedere il valore della temperatura con sole 2 cifre senza decimali da -20 a 60 gradi
se io mettessi una serie di if sarebbe lungo ma funzionerebbe cioè:
if (temperatura=20){
Wire.write("20");
ho pensato di separare le decine dalle unità per risparmiare numero di if,
ci sarebbe un modo meno laborioso?

come non detto...
con gli if non funziona...sto benedetto i2c non l'ho capito un granchè

Se hai messo questo if:

if (temperatura=20){
Wire.write("20");

tu fai un'operazione di assegnamento, con 1 solo segno di uguale. I confronti si fanno con 2: "=="

sì hai ragione
:slight_smile:

rimango in attesa di qualcuno che mi dia un input da seguire per mandare sta benedetta temperatura al display

Se cerchi ci sono diverse discussioni in cui si è trattato il problema di come formattare proprio una temperatura (o comunque un numero decimale) per la stampa su display o su seriale .

allora l'indirizzo lo conosco, lo uso già con la libreria Wire (è 0x63).

ne sei proprio sicuro ?
l'LCD03 e' settabile da 0xC6 a oxCE