Arduino. Скетч для работы с GPS.

Нет ответов
Sawyer92
Offline
Зарегистрирован: 27.04.2016

Доброго времени суток, только начал заниматься микроконтроллерами 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);
}

Пины вроде подключил все верно, при необходимости могу указать.

Заранее, спасибо.