Arduino. Скетч для работы с GPS.
- Войдите на сайт для отправки комментариев
Доброго времени суток, только начал заниматься микроконтроллерами Arduino, опыт в пару месяцев и возникла следующая проблема:
Имеются: Arduino Uno, Arduino Mega, 2 радиомодуля nrf24l01 и GPS приемник NEO-6M.
Задача: Arduino Uno должна получать данные с GPS приемника и с помощью радиомодуля отправлять их на вторую Arduino (Arduino Mega), с которой уже эти данные будут выводится на экран ПК посредством USB-кабеля.
Использовал библиотеки: Mirf, TinyGPS++.
Тестовые примеры из данных библиотек работают.
Написал скетчи для одной и второй arduino, но.. передачи данных не происходит.
Подскажите в чем ошибся в коде, или мб есть у кого готовые скетчи для этих целей.
Код Arduino Mega на которую должны передаваться данные (сервер).
#include <SPI.h> #include <Mirf.h> #include <MirfHardwareSpiDriver.h> #define MAX_BUFF 32 String mess = "", mess2 = "", result_mess = ""; char buff[MAX_BUFF], check[MAX_BUFF]; int i = 0; void setup(){ Serial.begin(9600); Mirf.cePin = 48; Mirf.csnPin = 53; Mirf.spi = &MirfHardwareSpi; Mirf.init(); Mirf.setRADDR((byte *)"app1"); Mirf.setTADDR((byte *)"app2"); Mirf.payload = MAX_BUFF; Mirf.channel = 10; Mirf.config(); Serial.println("Start.."); } void loop(){ boolean m1 = false, m2 = false; while (true) { readMessage(buff); switch(buff[0]) { case '1': check[0] = buff[2]; check[1] = buff[3]; m1 = true; // Serial.print(check); break; case '2': if(m1) { mess += String(buff); m1 = false; m2 = true; } break; case '3': if(m2) { mess.remove(0,2); mess2 = String(buff); mess2.remove(0,2); mess += ',' + mess2; m1 = false; m2 = false; if(Cheksum(check,mess)) { Serial.println(mess); } mess = ""; mess2 = ""; } break; } } } boolean Cheksum(char ch[],String mess) { byte r = 0; byte sise=mess.length(); byte b[sise]; mess.getBytes(b,sise); for(byte j=0;j<sise;j++) r^=b[j]; return (atoi(ch) == r) ? true : false; } void readMessage(char *buff) { if(Mirf.dataReady()) { Mirf.getData((uint8_t *)buff); } }
Код для Arduino Uno передающего данные с GPS (клиента):
#include <TinyGPS++.h> #include <SoftwareSerial.h> #include <SPI.h> #include <Mirf.h> #include <nRF24L01.h> #include <MirfHardwareSpiDriver.h> #define MAX_BUFF 32 //буфер приема-передачи static const int RXPin = 4, TXPin = 3; TinyGPSPlus gps; SoftwareSerial ss(RXPin, TXPin); void setup() { Serial.begin(9600); ss.begin(9600); Mirf.spi = &MirfHardwareSpi; Mirf.init(); Mirf.cePin=7; Mirf.csnPin=8; Mirf.setRADDR((byte *)"app2"); //Здесь задаём адрес Mirf.payload = 32; //Здесь задаём буфер Mirf.channel = 10; Mirf.setTADDR((byte *)"app1"); Mirf.config(); } void loop() { static boolean sch = true; ss.println(); while (ss.available() > 0) if (gps.encode(ss.read())&&gps.location.isValid()&& gps.date.isValid()) { if(sch) BildAndSendServer(); sch = (sch) ? false : true; } } byte cheksum(String str) { byte r=0; byte sise=str.length(); byte b[sise]; str.getBytes(b,sise); for(byte i=0;i<sise;i++) r^=b[i]; return r; } void BildAndSendServer() { double timed=gps.time.value()/100.0; String message1 = String(timed)+","+String(gps.location.lat(),6)+","+String(gps.location.lng(),6)+","; String message2=String(gps.speed.kmph())+","+String(gps.altitude.meters())+","+String(gps.course.deg()); char ch1[32], ch2[32],chek[7]; String cheks="1,"+String (cheksum(message1+message2)); message1="2,"+message1; message2="3,"+message2; message1.toCharArray(ch1,message1.length()); message2.toCharArray(ch2,message2.length()+1); cheks.toCharArray(chek,7); Mirf.send((uint8_t *)chek); while(Mirf.isSending()){ } delay(100); Mirf.send((uint8_t *)ch1); while(Mirf.isSending()){ } delay(100); Mirf.send((uint8_t *)ch2); while(Mirf.isSending()){ } delay(100); }
Пины вроде подключил все верно, при необходимости могу указать.
Заранее, спасибо.