RF24 und GPS funktionieren nicht zusammen
Hallo,
ich habe zwei Codes für das Empfangen von GPS Daten mit Ausgabe in einem LCD und das Senden eines Textes anhand einer Funkfrequenz (nRFL01) und Ausgabe in einem LCD zusammengeführt. Leider funktioniert dies nicht. Ich habe die jeweiligen anderen Teile auskommentiert und der Code funktioniert dann zu diesem Teil. Wo liegt das Problem? Ich vermute entweder mit der Pinbelegung des Arduino Mega 2560 oder im Berich void Setup(), finde leider nicht die Ursacht.
Vielen Dank im Voraus, Code und Bilder siehe unten. Gruß Jochen
Sourcecode mit Funkfrequenz und auskommentiertem GPS-Code
PHP-Code:
/* Settings Arduino radio Mega 2560 GPS LCD nrF24l01 Pin 02 X Pin 03 X Pin 04 X Pin 05 X Pin 06 X Pin 09 CE Pin 10 CSN Pin 12 X Pin 31 RX Pin 50 MISO Pin 51 MOSI Pin 52 SCK Pin 53 TX
*/ //RF24 #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <RF24_config.h> int msg[1]; RF24 radio(9,10); const uint64_t pipe = 0xE8E8F0F0E1LL; //lcd & GPS #include <SoftwareSerial.h> #include <LiquidCrystal.h> SoftwareSerial mySerial = SoftwareSerial(53, 33); #define powerpin 4 //#define GPSRATE 9600 //#define GPSRATE 38400
// GPS parser for 406a #define BUFFSIZ 90 // plenty big char buffer[BUFFSIZ]; char *parseptr; char buffidx; uint8_t hour, minute, second, year, month, date; uint32_t latitude, longitude; uint8_t groundspeed, trackangle; char latdir, longdir; char status; LiquidCrystal lcd(2,3,4,5,6,12);
void setup() { lcd.begin(20, 4); if (powerpin) { pinMode(powerpin, OUTPUT); } pinMode(13, OUTPUT); //GPS /* Serial.begin(9600); mySerial.begin(9600); // prints title with ending line break lcd.setCursor(0,1); lcd.println("GPS read"); Serial.println("GPS read"); digitalWrite(powerpin, LOW); // pull low to turn on! */
//Radio radio.begin(); radio.openWritingPipe(pipe);
} void loop() { //RF24 String theMessage = " RF24"; lcd.setCursor(0,0); lcd.print(theMessage); int messageSize = theMessage.length(); for (int i = 0; i < messageSize; i++) { int charToSend[1]; charToSend[0] = theMessage.charAt(i); radio.write(charToSend,1); } //send the 'terminate string' value... msg[0] = 2; radio.write(msg,1);
radio.powerDown(); delay(1000); radio.powerUp(); //GPS /* uint32_t tmp; lcd.setCursor(0, 0); Serial.print("\n\rread: "); readline(); // check if $GPRMC (global positioning fixed data) if (strncmp(buffer, "$GPRMC",6) == 0) { // hhmmss time data parseptr = buffer+7; tmp = parsedecimal(parseptr); hour = tmp / 10000; minute = (tmp / 100) % 100; second = tmp % 100; parseptr = strchr(parseptr, ',') + 1; status = parseptr[0]; parseptr += 2; // grab latitude & long data // latitude latitude = parsedecimal(parseptr); if (latitude != 0) { latitude *= 10000; parseptr = strchr(parseptr, '.')+1; latitude += parsedecimal(parseptr); } parseptr = strchr(parseptr, ',') + 1; // read latitude N/S data if (parseptr[0] != ',') { latdir = parseptr[0]; } //Serial.println(latdir); // longitude parseptr = strchr(parseptr, ',')+1; longitude = parsedecimal(parseptr); if (longitude != 0) { longitude *= 10000; parseptr = strchr(parseptr, '.')+1; longitude += parsedecimal(parseptr); } parseptr = strchr(parseptr, ',')+1; // read longitude E/W data if (parseptr[0] != ',') { longdir = parseptr[0]; }
// groundspeed parseptr = strchr(parseptr, ',')+1; groundspeed = parsedecimal(parseptr);
// track angle parseptr = strchr(parseptr, ',')+1; trackangle = parsedecimal(parseptr);
// date parseptr = strchr(parseptr, ',')+1; tmp = parsedecimal(parseptr); date = tmp / 10000; month = (tmp / 100) % 100; year = tmp % 100; Serial.print("\nTime: "); Serial.print(hour, DEC); Serial.print(':'); Serial.print(minute, DEC); Serial.print(':'); Serial.println(second, DEC); Serial.print("Date: "); Serial.print(month, DEC); Serial.print('/'); Serial.print(date, DEC); Serial.print('/'); Serial.println(year, DEC); lcd.setCursor(0,2); Serial.print("Lat: "); if (latdir == 'N') {Serial.print('+');lcd.print('+');} else if (latdir == 'S') {Serial.print('-');lcd.print('-');}
Serial.print(latitude/1000000, DEC); Serial.print((char)176); Serial.print(' '); Serial.print((latitude/10000)%100, DEC); Serial.print('\''); Serial.print(' '); Serial.print((latitude%10000)*6/1000, DEC); Serial.print('.'); Serial.print(((latitude%10000)*6/10)%100, DEC); Serial.println('"'); lcd.print(latitude/1000000, DEC); lcd.print((char)176); lcd.print((latitude/10000)%100, DEC); lcd.print('\''); lcd.print((latitude%10000)*6/1000, DEC); lcd.print('.'); lcd.print(((latitude%10000)*6/10)%100, DEC); lcd.println('"'); lcd.setCursor(0,3); Serial.print("Long: "); if (longdir == 'E') {Serial.print('+');lcd.print('+');} else if (longdir == 'W') {Serial.print('-');lcd.print('-');} Serial.print(longitude/1000000, DEC); Serial.print((char)176); Serial.print(' '); Serial.print((longitude/10000)%100, DEC); Serial.print('\''); Serial.print(' '); Serial.print((longitude%10000)*6/1000, DEC); Serial.print('.'); Serial.print(((longitude%10000)*6/10)%100, DEC); Serial.println('"'); lcd.print(longitude/1000000, DEC); lcd.print((char)176); lcd.print((longitude/10000)%100, DEC); lcd.print('\''); lcd.print((longitude%10000)*6/1000, DEC); lcd.print('.'); lcd.print(((longitude%10000)*6/10)%100, DEC); lcd.println('"'); } //Serial.println(buffer); }
uint32_t parsedecimal(char *str) { uint32_t d = 0; while (str[0] != 0) { if ((str[0] > '9') || (str[0] < '0')) return d; d *= 10; d += str[0] - '0'; str++; } return d; }
void readline(void) { char c; buffidx = 0; // start at begninning while (1) { c=mySerial.read(); if (c == -1) continue; Serial.print(c); if (c == '\n') continue; if ((buffidx == BUFFSIZ-1) || (c == '\r')) { buffer[buffidx] = 0; return; } buffer[buffidx++]= c; }*/ }
Empfangen im anderen Arduino funktioniert:
Ausgabe im LCD Display funktioniert auch:
Sourcecode mit GPS Code und auskommentiertem Funk Code
PHP-Code:
/* Settings Arduino radio Mega 2560 GPS LCD nrF24l01 Pin 02 X Pin 03 X Pin 04 X Pin 05 X Pin 06 X Pin 09 CE Pin 10 CSN Pin 12 X Pin 31 RX Pin 50 MISO Pin 51 MOSI Pin 52 SCK Pin 53 TX
*/ //RF24 #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <RF24_config.h> int msg[1]; RF24 radio(9,10); const uint64_t pipe = 0xE8E8F0F0E1LL; //lcd & GPS #include <SoftwareSerial.h> #include <LiquidCrystal.h> SoftwareSerial mySerial = SoftwareSerial(53, 33); #define powerpin 4 //#define GPSRATE 9600 //#define GPSRATE 38400
// GPS parser for 406a #define BUFFSIZ 90 // plenty big char buffer[BUFFSIZ]; char *parseptr; char buffidx; uint8_t hour, minute, second, year, month, date; uint32_t latitude, longitude; uint8_t groundspeed, trackangle; char latdir, longdir; char status; LiquidCrystal lcd(2,3,4,5,6,12);
void setup() { lcd.begin(20, 4); if (powerpin) { pinMode(powerpin, OUTPUT); } pinMode(13, OUTPUT); //GPS Serial.begin(9600); mySerial.begin(9600); // prints title with ending line break lcd.setCursor(0,1); lcd.println("GPS read"); Serial.println("GPS read"); digitalWrite(powerpin, LOW); // pull low to turn on!
//Radio /*radio.begin(); radio.openWritingPipe(pipe); */ } void loop() { //RF24 /*String theMessage = " RF24"; lcd.setCursor(0,0); lcd.print(theMessage); int messageSize = theMessage.length(); for (int i = 0; i < messageSize; i++) { int charToSend[1]; charToSend[0] = theMessage.charAt(i); radio.write(charToSend,1); } //send the 'terminate string' value... msg[0] = 2; radio.write(msg,1);
radio.powerDown(); delay(1000); radio.powerUp(); */ //GPS uint32_t tmp; lcd.setCursor(0, 0); Serial.print("\n\rread: "); readline(); // check if $GPRMC (global positioning fixed data) if (strncmp(buffer, "$GPRMC",6) == 0) { // hhmmss time data parseptr = buffer+7; tmp = parsedecimal(parseptr); hour = tmp / 10000; minute = (tmp / 100) % 100; second = tmp % 100; parseptr = strchr(parseptr, ',') + 1; status = parseptr[0]; parseptr += 2; // grab latitude & long data // latitude latitude = parsedecimal(parseptr); if (latitude != 0) { latitude *= 10000; parseptr = strchr(parseptr, '.')+1; latitude += parsedecimal(parseptr); } parseptr = strchr(parseptr, ',') + 1; // read latitude N/S data if (parseptr[0] != ',') { latdir = parseptr[0]; } //Serial.println(latdir); // longitude parseptr = strchr(parseptr, ',')+1; longitude = parsedecimal(parseptr); if (longitude != 0) { longitude *= 10000; parseptr = strchr(parseptr, '.')+1; longitude += parsedecimal(parseptr); } parseptr = strchr(parseptr, ',')+1; // read longitude E/W data if (parseptr[0] != ',') { longdir = parseptr[0]; }
// groundspeed parseptr = strchr(parseptr, ',')+1; groundspeed = parsedecimal(parseptr);
// track angle parseptr = strchr(parseptr, ',')+1; trackangle = parsedecimal(parseptr);
// date parseptr = strchr(parseptr, ',')+1; tmp = parsedecimal(parseptr); date = tmp / 10000; month = (tmp / 100) % 100; year = tmp % 100; Serial.print("\nTime: "); Serial.print(hour, DEC); Serial.print(':'); Serial.print(minute, DEC); Serial.print(':'); Serial.println(second, DEC); Serial.print("Date: "); Serial.print(month, DEC); Serial.print('/'); Serial.print(date, DEC); Serial.print('/'); Serial.println(year, DEC); lcd.setCursor(0,2); Serial.print("Lat: "); if (latdir == 'N') {Serial.print('+');lcd.print('+');} else if (latdir == 'S') {Serial.print('-');lcd.print('-');}
Serial.print(latitude/1000000, DEC); Serial.print((char)176); Serial.print(' '); Serial.print((latitude/10000)%100, DEC); Serial.print('\''); Serial.print(' '); Serial.print((latitude%10000)*6/1000, DEC); Serial.print('.'); Serial.print(((latitude%10000)*6/10)%100, DEC); Serial.println('"'); lcd.print(latitude/1000000, DEC); lcd.print((char)176); lcd.print((latitude/10000)%100, DEC); lcd.print('\''); lcd.print((latitude%10000)*6/1000, DEC); lcd.print('.'); lcd.print(((latitude%10000)*6/10)%100, DEC); lcd.println('"'); lcd.setCursor(0,3); Serial.print("Long: "); if (longdir == 'E') {Serial.print('+');lcd.print('+');} else if (longdir == 'W') {Serial.print('-');lcd.print('-');} Serial.print(longitude/1000000, DEC); Serial.print((char)176); Serial.print(' '); Serial.print((longitude/10000)%100, DEC); Serial.print('\''); Serial.print(' '); Serial.print((longitude%10000)*6/1000, DEC); Serial.print('.'); Serial.print(((longitude%10000)*6/10)%100, DEC); Serial.println('"'); lcd.print(longitude/1000000, DEC); lcd.print((char)176); lcd.print((longitude/10000)%100, DEC); lcd.print('\''); lcd.print((longitude%10000)*6/1000, DEC); lcd.print('.'); lcd.print(((longitude%10000)*6/10)%100, DEC); lcd.println('"'); } //Serial.println(buffer); }
uint32_t parsedecimal(char *str) { uint32_t d = 0; while (str[0] != 0) { if ((str[0] > '9') || (str[0] < '0')) return d; d *= 10; d += str[0] - '0'; str++; } return d; }
void readline(void) { char c; buffidx = 0; // start at begninning while (1) { c=mySerial.read(); if (c == -1) continue; Serial.print(c); if (c == '\n') continue; if ((buffidx == BUFFSIZ-1) || (c == '\r')) { buffer[buffidx] = 0; return; } buffer[buffidx++]= c; } }
Ausgabe GPS Daten
Ausgabe GPS Daten im LCD
|