Buonasera a tutti,
sto lavorando con due schede arduino: una scheda mega 2560 e una scheda uno wifi rev2.
Le due schede sono collegate in i2c in master-slave (master è la scheda mega, la scheda uno è lo slave).
Alla scheda mega è collegato un gps (Adafruit Ultimate GPS Breakout).
Devo inviare una stringa che compongo io (utc+millis della mega) allo slave per fare elaborazione dai dati...
Sia la trasmissione, sia la ricezione dei dati devono essere gestite con degli interrupt
il codice è il seguente:
MASTER
#include <Wire.h>
#include <TinyGPS.h>
#include <Adafruit_GPS.h>
#include <SPI.h>
#include <SD.h>
int x = 0;
//variable for GPS
float lat, lon;
//TinyGPS gps; // create gps object--> con libreria TinyGPS.h
#define GPSSerial Serial3
Adafruit_GPS GPS(&Serial3);
#define GPSECHO false
uint32_t timer = millis();
String stringa_gps= " ";
File file, file_gps;
float currentTime;
char *prova_stringa = "";
bool usingInterrupt = false;
void useInterrupt(boolean);
void setup() {
Serial.begin(115200);
// put your setup code here, to run once:
Wire.begin();
GPS.begin(9600);
//GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_GGAONLY);
GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); //dovrei mettere questo qua al posto di 10HZ
//GPS.sendCommand(PMTK_SET_BAUD_9600);
GPS.sendCommand(PGCMD_ANTENNA);
//PER ABILITARE L'INTERRUPT
useInterrupt(true);
}
void loop() {
// put your main code here, to run repeatedly:
if (prova_stringa != ""){
int l = strlen(prova_stringa);
Wire.beginTransmission(8);
//Wire.write(l);
Wire.write(prova_stringa);
Wire.endTransmission();
}
//x++;
//if (x > 5) x = 0;
//delay(500);
}
SIGNAL(TIMER0_COMPA_vect) {
//file_gps = SD.open("gps.csv", FILE_WRITE);
//OCR2A = reload;
//TCNT1 = 0; //First, set the timer back to 0 so it resets for next interrupt
char c = GPS.read();
//Serial.println(c);
// if you want to debug, this is a good time to do it!
#ifdef UDR0
if (GPSECHO)
if (c) UDR0 = c;
// writing direct to UDR0 is much much faster than Serial.print
// but only one character can be written at a time.
#endif
//prova_stringa = "142003.000, 1200.00";
//Serial.println(prova_stringa);
// --------- QUA INVIO LA STRINGA -------------------
if (GPS.newNMEAreceived()) {
//Serial.println("BB");
char *stringa;
stringa = GPS.lastNMEA();
//Serial.println(stringa);
if(stringa[1] == 'G' && stringa[5] == 'A' && stringa[28] == 'N'){
// ------------- SALVO SUL CSV I DATI DEL GPS -------------------
// file_gps = SD.open("gps.csv", FILE_WRITE);
// file_gps.print(millis());
// file_gps.print(";");
// file_gps.print(GPS.lastNMEA());
// file_gps.close();
// ---------------------------------------------------------------
currentTime = millis(); //tempo attuale
char time_gps[11];
char timestamp[32] = " ";
char millis_conv[20] = " ";
strncpy(time_gps, stringa + 7, 10); // Copia i caratteri dall'indice 7 al 16
time_gps[10] = '\0'; // Aggiungi il terminatore nullo
// CREO IL MESSAGGIO CHE INVIERO' ALL'ALTRA SCHEDA...
dtostrf(currentTime, 7, 2, millis_conv);
strcpy(timestamp, time_gps); // Copia la prima stringa in timestamp
strcat(timestamp, ","); // Concatena la virgola e lo spazio
strcat(timestamp, millis_conv); // Concatena la seconda stringa
//INVIO IL MSG AL MASTER, RICHIAMO LA FUNZIONE 'trasmetti()'....
prova_stringa = timestamp;
Serial.println(prova_stringa);
//trasmetti();
}
// file_gps.print(GPS.lastNMEA());
// if (!GPS.parse(GPS.lastNMEA()))
// return;
}
}
void useInterrupt(boolean v) {
if (v) {
// Timer0 is already used for millis() - we'll just interrupt somewhere
// in the middle and call the "Compare A" function above
OCR0A = 0xAF;
TIMSK0 |= _BV(OCIE0A);
usingInterrupt = true;
} else {
// do not call the interrupt function COMPA anymore
TIMSK0 &= ~_BV(OCIE0A);
usingInterrupt = false;
}
}
SLAVE
#include <Wire.h>
int x = 0;
String dato_ricevuto = "";
char myMsg[10];
volatile bool flag = false;
void setup() {
Serial.begin(115200);
// Start the I2C Bus as Slave on address 9
Wire.begin(8);
// Attach a function to trigger when something is received.
Wire.onReceive(receiveEvent);
}
void receiveEvent(int howMany) {
// while(Wire.available()) {
// char c;
// c = Wire.read();
// dato_ricevuto += c;
// }
Serial.println(howMany);
for(int i=0; i<howMany; i++)
{
myMsg[i] = Wire.read();
}
myMsg[howMany] = '\0'; //insert null character
flag = true;
}
void loop() {
//Serial.println(dato_ricevuto);
if(flag == true){
Serial.println(myMsg);
flag = false;
}
//dato_ricevuto = "";
delay(1000);
}
Il mio problema è che in fase di ricezione ho una perdita di dati, qualcuno sa dirmi il perchè?
Grazie mille in anticipo,
Alberto.