Data su LCD03 usando I2C

Buongiorno,
sto facendo delle prove con un display LCD03 ed un modulo RTC DS1307.

Sia il display che l’RTC sono collegati ad arduino con I2C.
Io vorrei stampare la data sul display usando il comando wire ma non so come inviare il dato che leggo dall’RTC.

Facendo con questo codice e stampando solo i secondi vedo caratteri alfanumerici.

#include <Wire.h>
#define LCD03_I2C_ADDR 0x63  // LCD03 Address
#define DS1307_I2C_ADDR 0x68 // RTC Address

void setup()
{
  Serial.begin(9600);
  Wire.begin();
  Wire.beginTransmission(LCD03_I2C_ADDR);
  //LIGHT ON
  Wire.send(0);
  Wire.send(13);
  //RESET DISPLAY
  Wire.send(0);
  Wire.send(12);
  //NO CURSOR
  Wire.send(0);
  Wire.send(4);
  Wire.endTransmission();
  delay(1000);
}

void loop()
{
printDate();
}

byte bcdToDec(byte val)  {
// Convert binary coded decimal to normal decimal numbers
  return ( (val/16*10) + (val%16) );
}

void printDate(){

  // Reset the register pointer
  Wire.beginTransmission(DS1307_I2C_ADDR);
  Wire.send(0);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_I2C_ADDR, 7);

  int second = bcdToDec(Wire.receive());
  int minute = bcdToDec(Wire.receive());
  int hour = bcdToDec(Wire.receive() & 0b111111); //24 hour time
  int weekDay = bcdToDec(Wire.receive()); //0-6 -> sunday - Saturday
  int monthDay = bcdToDec(Wire.receive());
  int month = bcdToDec(Wire.receive());
  int year = bcdToDec(Wire.receive());

  Wire.beginTransmission(LCD03_I2C_ADDR);
  Wire.send(0);
  Wire.send(3);
  Wire.send(1);     // LINEA
  Wire.send(5);     // COLONNA
  Wire.send(second);  
  Wire.endTransmission();

  //print the date EG   3/1/11 23:59:59
  Serial.print(month);
  Serial.print("/");
  Serial.print(monthDay);
  Serial.print("/");
  Serial.print(year);
  Serial.print(" ");
  Serial.print(hour);
  Serial.print(":");
  Serial.print(minute);
  Serial.print(":");
  Serial.println(second);
}

Qualche dritta ?

Grazie, Alberto

Spiegati meglio per favore. Cosa non Ti funziona?
Ciao Uwe

Se mando il valore 'second' al display con il comando wire.send il display (giustamente) visualizza un carattere ascii.

questo è il pezzo di codice che manda al display:

  Wire.beginTransmission(LCD03_I2C_ADDR);
  Wire.send(0);
  Wire.send(3);
  Wire.send(1);     // LINEA
  Wire.send(5);     // COLONNA
  Wire.send(second);  
  Wire.endTransmission();

Questo è il pezzo di codice che legge i secondi:

.....
Wire.requestFrom(DS1307_I2C_ADDR, 7);

  int second = bcdToDec(Wire.receive());
.....

Non so come convertire la variabile second da mandare al display

http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#g4f6b3dd51c1f8519d5b8fce1dbf7a665 itoa() ricorda di includere la libreria ;)

oppure il carattere ascii 49 è 1 se è solo un numero puoi semplicemente fare un chr(second+48) // 48 equivale allo 0 e i numeri vanno in odrine

itoa(): superlol fai per favore un esempio di codice funzionante perché l' uso non é cosí semplice come puó sembrare.

oppure il carattere ascii 49 è 1 se è solo un numero puoi semplicemente fare un chr(second+48) // 48 equivale allo 0 e i numeri vanno in odrine

Devi comunque separare i uni dalle decine dei secondi e sommare 48.

Ciao Uwe

nel itoa() hai 3 valori: il valore di inizio, la variabile in cui risulta e la base
noi vogliamo i decimali quindi il codice sarebbe il seguente:

#include <stdlib.h>
...

char risultato[5];
int second;
...

void setup() {
...
}

void loop() {
.....
Wire.requestFrom(DS1307_I2C_ADDR, 7);

  second = bcdToDec(Wire.receive());
  itoa(second, risultato, 10);
  Wire.beginTransmission(LCD03_I2C_ADDR);
  Wire.send(0);
  Wire.send(3);
  Wire.send(1);     // LINEA
  Wire.send(5);     // COLONNA
  Wire.send(risultato);  
  Wire.endTransmission();
.....
}

è un po da adattare ai tuoi scopi ma dovrebbe andare, al massimo metti un asterisco dopo char all’inizio, diventa quindi char* risultato[5];
il 5 è la lunghezza della stringa e va adattata :wink:

Ciao ,

mi potete aiutare …
ho preso il display e collegato ad arduino .

SDA → Pin Analog 4
SCL → Pin Analog 5
Gnd e VCC alla massa e al 5V di arduino.
Quando attacco la USB ad arduino il display si accende ed esce ModeI2C 0xc6 penso l’indirizzo esadecimade del display.
Ho preso il vostro programma e modificato solo per fare una scritta .
Ma non funziona.
Dove Sbaglio ?

#include <Wire.h>
#define LCD03 0xC6  // LCD03 Address

void setup()
{
  Serial.begin(9600);
  Wire.begin();
  Wire.beginTransmission(LCD03);
  //LIGHT ON
  Wire.send(0);
  Wire.send(13);
  //RESET DISPLAY
  Wire.send(0);
  Wire.send(12);
  //NO CURSOR
  Wire.send(0);
  Wire.send(4);
  Wire.endTransmission();
  delay(1000);
}


void loop()
{
  Wire.beginTransmission(LCD03);
  Wire.send(0);
  Wire.send(3);
  Wire.send(1);     // LINEA
  Wire.send(5);     // COLONNA
  Wire.send("Ciao");
  Wire.endTransmission();
  Serial.println("Funziona"); // Inserito per esser sicuro che arduino gira e non e' in Blocco.
  delay(1000);
}

Mi potete aiutare ?

Grazie.

Ciao…