Buongiorno a tutti!
(piccola premessa: sono nuovo con arduino per cui mi scuso se pongo domande banali.)
Sto lavorando per un progetto universitario con due schede arduino: una scheda arduino mega2560 e una scheda arduino uno wifi rev2.
Alla scheda Mega2560 ho collegato diversi sensori tra i quali anche un GPS (Adafruit Ultimate GPS Breakout) per ricostruire il percorso che faccio.
Il mio obiettivo è quello di creare una specie di sincronizzazione tra le due schede e per fare questo, la cosa fondamentale è inviare l'ora che ottengo dal gps da una scheda all'altra (poi ovviamente devo eseguire altre operazioni ma su quelle non ho grossi problemi).
Il gps mi restituisce una stringa (con tutte le informazioni) ad ogni secondo.
Nella mia configurazione la scheda Mega sarebbe lo slave, mentre la scheda Uno il master; collegamento con I2C.
Vi allego il codice master-slave delle schede:
MASTER
void setup() {
// MASTER
Wire.begin();
....
....
....
}
void loop() {
Wire.requestFrom(7, 32);
while(Wire.available()){
char c;
c = Wire.read();
Serial.println(c);
}
// ....
//.....
//.....
}
SLAVE:
void setup() {
// SLAVE
Wire.begin(7);
Wire.onRequest(trasmetti);
....
....
....
//PER ABILITARE L'INTERRUPT
useInterrupt(true);
}
void trasmetti(char s[32]) {
// QUA IO DOVREI INVIARE AL MASTER (ARDUINO UNO) IL TIME DEL GPS (UTC) + i millisecondi correnti
//Serial.println(s);
Wire.write(s);
}
ISR(TIMER0_COMPA_vect) {
//file_gps = SD.open("gps.csv", FILE_WRITE);
char c = GPS.read();
// 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
if (GPS.newNMEAreceived()) {
char *stringa;
stringa = GPS.lastNMEA();
//Serial.println(stringa);
if(stringa[1] == 'G' && stringa[5] == 'A' && stringa[28] == 'N'){ // QUESTO IF MI SERVE PER VERIFICARE CHE LA STRINGA SIA NEL FORMATO GIUSTO
currentTime = millis();
char time_gps[11];
char timestamp[32] = " ";
char millis_conv[20] = " ";
int time_int;
//Serial.println(stringa);
strncpy(time_gps, stringa + 7, 10); // Copia i caratteri dall'indice 7 al 16
time_gps[10] = '\0'; // Aggiungi il terminatore nullo
//Serial.println(time_gps);
// 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
//Serial.println(timestamp);
//Serial.println(strlen(timestamp)); //OK, VA BENE
//INVIO IL MSG AL MASTER, RICHIAMO LA FUNZIONE 'trasmetti()'....
trasmetti(timestamp);
}
// file_gps.print(GPS.lastNMEA());
// if (!GPS.parse(GPS.lastNMEA()))
// return;
}
//file_gps.close();
}
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;
}
}
Come vedete vado a creare un 'timestamp' formato dall'ora del gps (in fromato UTC) + i millis(); questa stringa viene creata correttamente (ho verificato andando a stamparla).
Il PROBLEMA è che in fase di ricezione non la ricevo proprio, ma anche quando io richiamo la funzione 'trasmetti()' e vado a stampare il parametro che gli passo, questo non è stampato nel modo giusto.
Sapete dirmi come mai?
Grazie mille,
Alberto.