salve,
ho la seguente configurazione:
2 arduino nano collegati tramite i2c
1 monitor LCD 16x02 collegato tramite i2c allo slave Receiver
1 ds1307 collegato tramite i2c allo slave receiver
utilizzo il seguente sorgente nello slave receiver:
#include <Wire.h> // include la libreria
#include <LiquidCrystal_I2C.h>
#include "RTClib.h"
LiquidCrystal_I2C lcd(0x3E, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
RTC_DS1307 RTC; // orologio
static int anno;
static int giorno;
static int mese;
static int ora;
static int secondo;
static int oldSecondo;
static int minuto;
static int oldMinuto;
static int annoGrezzo;
//------------------------------------------------------------
// si ripete la union esattamente come nel master
union Scomp_float // si utilizza union x float
{
float temp;
char byte_s[4];
} S_float;
//------------------------------------------------------------
// si ripete la union esattamente come nel master
union Scomp_long // si utilizza union x long
{
long int mioL;
char byte_sL[4];
} S_long;
//------------------------------------------------------------
//------------- byte temporanei
byte f0 = 0; // contengono i byte ricevuti
byte f1 = 0;
byte f2 = 0;
byte f3 = 0;
byte a1 = 0;
//-------------------------------------------------------------
// qui si introdurranno i dati ricomposti dopo la trasmissione
long int masterLong = 0;
float masterFloat = 0;
int masterInt = 0;
//--------------------------------------------------------------
void setup()
{
Wire.begin(80); // join i2c bus with address #4
Wire.onReceive(receiveEvent); // register event
lcd.begin(16, 2);
Serial.begin(9600); // start serial for output
//-----------orologio-----------
RTC.begin();
// Check to see if the RTC is keeping time. If it is, load the time from your computer.
if (! RTC.isrunning())
{
Serial.println("RTC is NOT running!");
// This will reflect the time that your sketch was compiled
RTC.adjust(DateTime(__DATE__, __TIME__));
}
//-----------fine orologio-----------
}
void loop()
{
//------------------------------------------------------------
// si stampano i dati ricevuti e ricomposti
//------------------------------------------------------------
Serial.println(masterInt);
Serial.println(masterLong);
Serial.println(masterFloat);
DateTime now = RTC.now();
annoGrezzo = now.year();
anno = ( annoGrezzo % 100);
mese = now.month();
giorno = now.day();
ora = now.hour();
minuto = now.minute();
lcd.setCursor(0,0);
lcd.print(masterInt);
lcd.setCursor(0, 1);
lcd.print(giorno);
lcd.print(" ");
lcd.print(mese);
lcd.print(" ");
lcd.print(anno);
lcd.print(" ");
lcd.print(ora);
lcd.print(":");
lcd.print(minuto);
delay (1000);
lcd.clear();
}
// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany)
{
if (howMany == 2) // se in arrivo due dati
{
f0 = Wire.read(); // si leggono i byte
f1 = Wire.read();
masterInt = ((f1 << 8) | f0); // si ricompone l'intero
}
if (howMany == 4) // se in arrivo 4 dati è un float
{
f0 = Wire.read(); // si leggono i byte
f1 = Wire.read();
f2 = Wire.read();
f3 = Wire.read();
S_float.byte_s[0] = f0; // si ricompone il float
S_float.byte_s[1] = f1;
S_float.byte_s[2] = f2;
S_float.byte_s[3] = f3;
masterFloat = S_float.temp;
}
if (howMany == 5) // se in arrivo 5 dati è un long
{
f0 = Wire.read(); // si leggono i byte
f1 = Wire.read();
f2 = Wire.read();
f3 = Wire.read();
a1 = Wire.read();
S_long.byte_sL[0] = f0; // si ricompone il long
S_long.byte_sL[1] = f1;
S_long.byte_sL[2] = f2;
S_long.byte_sL[3] = f3;
masterLong = S_long.mioL;
}
}
nel master Sender il seguente:
#include <Wire.h> // si include la libreria
//---------------------------------------------------------
union Scomp_float // si utilizza union x float
{
float temp;
char byte_s[4];
}S_float;
//---------------------------------------------------------
union Scomp_long // si utilizza union x long
{
long int mioL;
char byte_sL[4];
}S_long;
//----------------------------------------------------------
//----------------------------------------------------------
// questi sono i dati che si vogliono trasmettere
long int mioLong = 1234567801;
float mioFlo = 123456.29;
//----------------------------------------------------------
byte a1 = 0; // conterrà i primo byte dell'int
byte a2 = 0; // conterrà il secondo byte dell'int
byte f0 = 0; // contengono i byte del float e del long
byte f1 = 0;
byte f2 = 0;
byte f3 = 0;
void setup()
{
Wire.begin(); // join i2c bus (address optional for master)
}
void loop()
{
int mioInt = random(30000);
//-----------------------------------------------------
// trasmissione di un intero ( 2 byte)
//-----------------------------------------------------
a1 = byte(mioInt); // si scompone l'intero in 2 byte
a2 = byte( mioInt >> 8);
Wire.beginTransmission(80); // inzia trasmissione allo slave
Wire.write(a1); // invia un byte
Wire.write(a2); // invia il secondo byte
Wire.endTransmission(); // stop transmitting
//------------------------------------------------------
delay (2000);
//------------------------------------------------------
// trasmissione intero lungo 4 byte
//------------------------------------------------------
S_long.mioL = mioLong; // si scompone in 4 byte
f0 = S_long.byte_sL[0];
f1 = S_long.byte_sL[1];
f2 = S_long.byte_sL[2];
f3 = S_long.byte_sL[3];
a1 = 1; // si trasmette questo byte solo per segnalare allo slave
// che stiamo trasmettendo un long
// una volta scomposto si trasmettono i 4 byte
Wire.beginTransmission(80); // trasmette allo slave
Wire.write(f0); // invia un byte
Wire.write(f1); //
Wire.write(f2); //
Wire.write(f3); // invia un byte
Wire.write(a1);
Wire.endTransmission(); // fine trasmissione
//-------------------------------------------------------
delay (2000);
//------------------------------------------------------
// trasmissione di un float 4 byte
//------------------------------------------------------
S_float.temp = mioFlo; // si scompone in 4 byte
f0 = S_float.byte_s[0];
f1 = S_float.byte_s[1];
f2 = S_float.byte_s[2];
f3 = S_float.byte_s[3];
// una volta scomposto si trasmettono i 4 byte
Wire.beginTransmission(80); // trasmette allo slave
Wire.write(f0); // invia un byte
Wire.write(f1); //
Wire.write(f2); //
Wire.write(f3); // invia un byte
Wire.endTransmission(); // fine trasmissione
//-------------------------------------------------------
delay (3000);
}
//------ end master ----------------------------------
ricevo tranquillamente i valori per un tot di tempo dopo di che il display lcd incomincia a stampare caratteri casuali e da seriale la comunicazione procede senza problemi. Inoltre ho notato che commentando la libreira RTCLIB e le varie componenti per il modulo ds1307 la comunicazione avviene correttamente ed il display visualizza senza nessun problema le variabili passate dal Master Sender.
vi ringrazio in anticipo di una vostra risposta, saluti Ciccio.
Ho provato a cambiare indirizzo allo schermo LCD , provato a cambiare il numero di comunicazione del Wire ma tutto con esito sempre negativo.