Problemi con Display LCD seriale 16x2 Picaxe I2C

Salve a tutti Ho acquistato di recente il modulo Display LCD seriale 16x2 Picaxe che contiene il componente DS1307 con un display 16x2. L'ho collegato a arduino usando il protocollo I2c. Sono riuscito a scrivere e leggere l'ora e la data che appare anche nella 2 riga del display. Il mio problema però è il seguente: Riesco a cambiare il messaggio che appare sulla prima riga del display “Serial / i2c LCD” inviando un messaggio da me definito ?

Premetto che sto usando la libreria Wire e per il DS1307 l'address I2C è 0x68 (e funzione benissimo)mentre per LCD esiste un indirizzo specifico ? Ho provato con 0xC6 o 0x50 o 0x52 ma niente... Qualcuno sa dirmi dove sbaglio ?

Grazie

Mancano informazioni; Ci scrivi un riferimento al display? (codice o sito dovel'hai comprato) Ciao Uwe

L'ho acquistato qui http://www.robot-italy.com/index.php?cPath=59_62 il codice del prodotto è il 502008. Il mio problema è che non riesco a scrivere sul display usando il protocollo I2c (uso la libreria wire.h).

Grazie in anticipo

Nel modulo in questione esiste il componente DS1307 che nel registro di memoria compreso tra 00h e 07h contiene i dati relativi all'ora (ora minuti e secondi), giorno della settimana e giorno mese e anno. Quando aggiorno la data e l'ora, in automatico sulla seconda riga del display 16x2, appaiono i dati del calendario nel formato dd/mm/aa e ora:minuti. Esiste poi uno spazio di memoria EEPROM 56X8 (dove sono riuscito in parte a scrivere dei dati). Tutte queste operazioni sono state fatte usando la libreria Wire.h usando come address il valore 0x68 con la classica configurazione a 2 fili SDA e SCL (oltre all'alimentazione 5V e grd) collegandoli nei pin 4 e 5 analog in. Suppongo che la gestione del display sia però data dal PIC16F819. Non riesco ad accedere alla scrittura del display LCD. Vorrei infatti nella prima riga (dove attualmente appare la scritta Serial / i2c LCD) poter scrivere messaggi. Il problema è che non conosco la procedura con la libreria Wire. Devo usare un address diverso ? E quale, quello del Display o del DS1307 o del Pic16F819 Ho ipotizzato che ci sia una parte della memoria del PIC che una volta sovrascritta va ad aggiornare il messaggio. Se è vero non so quale.

Grazie

Hai letto http://www.rev-ed.co.uk/docs/axe033.pdf? Ciao Uwe

Si era dato insieme al modulo che ho acquistato. Ma come posso mandare i seguenti comandi al modulo (vedi esempio pag 10):

init: pause 500 main: serout 7,N2400,(253,1,”Player 1= ”) pause 1000 serout 7,N2400,(253,2,”Player 2= ”) pause 1000 end

devo usare i comandi Wire.send(init: pause 500) ecc ? Non so che pesci pigliare....

ciao Kempis

quello mi sembra una seriale usata solo in una direzione. Percui usa la libreria Softwareserial oppure newSoftwareserial http://arduino.cc/en/Reference/SoftwareSerial http://arduiniana.org/libraries/newsoftserial/

se leggi pagina 6 spiega l'I2C

ciao Uwe

Grazie Uwe per i consigli.
Da quel che ho capito (correggimi se sbaglio) dovrei spedire le istruzioni che trovo nel manuale AX033 tramite la seriale e relative librerie che mi hai linkato sfruttando i pin 0 e 1 di arduino (rx e tx).
Tuttavia volevo sfruttare il protocollo I2C (sul display nella prima riga appare la parola Serial / i2c LCD che non riesco a togliere).
Ho letto il manuale e a pagina 6 c’è una spigazione del sistema i2c.
Tuttavia (vedi pag 7) come faccio a spedire un comando tipo writei2c 0,(254,1,255) che mi cancella il Display (da come riportato nel manuale)?
Devo spedire una serie di
wire.send(0)
wire.send(254)
wire.send(1)
wire.send(255)
e a quale indirizzo ?

Grazie

non credo che devi spedire il primo zero.

guardati negli esempi del IDE (File -Examples-wire- digital-potentiometer)


Wire.beginTransmission(xx); // transmit to device #xx
// device address is specified in datasheet
wire.send(254)
wire.send(1)
wire.send(255)
Wire.endTransmission(); // stop transmitting

Non so dirti quale é l’ indirizzo del I2E (e sono adesso troppo pigro per cercarlo)

Ciao Uwe

Risolto !!!
Poichè se si cresce, si deve crescere insieme, di seguito allego il programma che mi consente di scrivere sul display sulle 2 righe usando il protocollo I2c.
Con il display, se voglio visualizzare dei messaggi devo usare l’address 0x63 (per l’orologio RTC è 0x68)
Non ho ancora provato a far convivere un messaggio sulla prima riga inviato usando l’address 0x63 e l’ora usando l’address 0x68 (sono sicuro che in ultima analisi posso usare per entrambi l’address 0x63.
Per chi ha tempo e voglia e vuol migliorare il programma… here you are:

/*
L'esempio è riferito al modulo che trovate qui http://www.robot-italy.com/index.php?cPath=59_62
codice del prodotto è il  502008 - Display LCD seriale 16x2 Picaxe I2C sistema a display LCD e
clock chiamato anche AX033 (trovate il datasheet nel sito della robot-italy)

By Kempis
*/
#include <Wire.h>
byte addr = 0x63; //questo è l'indirizzo giusto per il display

void setup()
{
 Serial.begin(9600); //non ho provato a vedere come si comporta togliendo questa linea
 delay(500);
 Wire.begin(); // join i2c bus (address optional for master)
 delay(500);
}

 void loop()
{
//cancella_display(); //cancello il display                                                     
// inizio la trasmissione della prima linea
// a pagina 7 il comando per muovere il cursore nella prima linea è
// writei2c 0,(254,128,255) così mando la successione dei numeri
// 0,254,128 , scrivo il messaggio e poi chiudo con 255
Wire.beginTransmission(addr);
Wire.send(0);
Wire.send(254);
Wire.send(128);
Wire.send("Ciao Kempis va? ");
Wire.send(255);
Wire.endTransmission(); // stop transmitting


delay(10); //piccolo ritardo altrimenti non stampa la seconda linea

// inizio la trasmissione della seconda linea
// a pagina 7 il comando per muovere il cursore nella seconda linea è
// writei2c 0,(254,192,255) così mando la successione dei numeri
// 0,254,192 , scrivo il messaggio e poi chiudo con 255
Wire.beginTransmission(addr);
Wire.send(0);
Wire.send(254);
Wire.send(192);
Wire.send("Tutto bene ora ");
Wire.send(255);
Wire.endTransmission(); // stop transmitting


delay(50000);//refresh ogni 50 secondi
}

void cancella_display()
{
//***** tutto questo mi serve per cancellare il display *******
//NB a pagina 7 del manuale display esiste il comando 
// writei2c 0,(254,1,255) per pulire il display e attendere 30 ms
//il tutto si traduce nell'inviare all'address 0x63 la successione di
//numeri 0, 254 , 1, 255 e porre un ritardo di 30 ms
Wire.beginTransmission(addr);
Wire.send(0);
Wire.send(254);                                               
Wire.send(1);                                                  
Wire.send(255);
Wire.endTransmission();
delay(30);
//*************************************************************  
}

Grazie per l’interesse mostrato è per l’appoggio che mi avete dato.

Bye bye Kempis