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);
}
Пины вроде подключил все верно, при необходимости могу указать.
Заранее, спасибо.