gps логгер с rgb светодиодом

carboksyl
Offline
Зарегистрирован: 28.07.2015

Простой гпс логгер, на базе Ардуино нано, который записывает трек на микро-сд флешку в формате GPX. Фаил сохраняется в папку с названием даты, название трека - время начала записи трека. 

модуль сд карты подключен стандартым образом, распиновка в скетче, управляется библиотекой SD.h

модуль ГПС подойдет любой, подсоединяется стандартно vin,gnd,rx,tx. управляется библиотекой TinyGPS.h

Подключен rgb светодиод на схеме ws2812 (для управления таких светодиодных лент есть библиотека AdafruitNeoPixel.h)

так же поставлена тактовая кнопка на пины 8 и 9, управляется библиотекой Keypad.h

После включения логгера светодиод мигнет красным если  микроСД карточа не инициализирована, и зеленым если она на месте. Далее, когда Будут пойманы спутники и определено местоположнение мигнёт голубым.

далее Происходит ежесекундная запись точек трека.

При нажатии кнопки меняются 4 режима индикации свктодиода 1. не горит. 2.моргает цветом, соответствующим направлению движения(компас). 3. моргает цветом, соответствующим скорости движения от 0 до 20 кмч. 4. моргает цветом, соответствующим скорости движения от 0 до 120 кмч.

Цвета моргания и другие параметры меняются в скетче

код

#include <Adafruit_NeoPixel.h>
#include <SPI.h>
#include <SD.h>
#include <TinyGPS.h>
#include <SoftwareSerial.h>
#include <Keypad.h>

#define chipSelect 4
SoftwareSerial shield(5, 6); // configure software serial port 
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(1, 2, NEO_GRB + NEO_KHZ800);
static void smartdelay(unsigned long ms);
static void pix(int del, uint32_t color);
TinyGPS gps;
const byte ROWS = 1; //four rows
const byte COLS = 1; //three columns
char hexaKeys[ROWS][COLS] = {
    {'#'}
};
byte rowPins[ROWS] = {8}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {9}; //connect to the column pinouts of the keypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 


//String sfilename, filename;
char filename1[20];
char date1[22];
char filepath[20];
unsigned long start;
 float latitude, longitude;
 int year, h_dop;
 byte month, day, hour, minute, second;
 byte loopA;
File dataFile;
boolean pereriv=1;

void setup()
{
  pinMode(10, OUTPUT);
  shield.begin(9600);
  Serial.begin(9600);
  pixels.begin();    
   if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    pix(600, pixels.Color(255,0,0));//моргнёт красным если карты нет
   }
   else {Serial.println("SD card is ready");
   pix(300, pixels.Color(0,255,0));}//моргнёт зеленым если карта есть
   if (shield.available()){
   gps.encode(shield.read());
  unsigned long h_dop=gps.hdop();
   }
   
   do { Serial.println("wait");
        smartdelay(1000);
        h_dop=gps.hdop();
        Serial.println(h_dop);
   } while (h_dop ==  TinyGPS::GPS_INVALID_HDOP) ;

    pix(300, pixels.Color(0,120,255));//моргнёт синим если спутники пойманы
    
    
   gps.crack_datetime(&year,&month,&day,&hour,&minute,&second);
    hour = hour + 3;
    if (hour > 23) {hour = hour - 24; day +=1;}
    sprintf(filename1, "/%02d-%02d-%02d", day, month, year-2000);//название папки
    sprintf(filepath, "/%02d-%02d-%02d/%02d-%02d%s",day, month, year-2000,  hour, minute, ".GPX");//путь к файлу в папке
    Serial.println(filepath);
    SD.mkdir(filename1);
    
    if (!SD.exists(filepath)){
   dataFile = SD.open(filepath, FILE_WRITE);//создание файла 
   dataFile.print(F(
    "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"
    "<gpx version=\"1.1\" creator=\"Batuev\" xmlns=\"http://www.topografix.com/GPX/1/1\" \r\n"
    "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n"
    "xsi:schemaLocation=\"http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd\">\r\n"
    "\t<trk>\r\n<trkseg>\r\n"));  
    dataFile.print(F("</trkseg>\r\n</trk>\r\n</gpx>\r\n"));
    dataFile.close();
 }}
 
 void loop() {
   char customKey = customKeypad.getKey();
   if (customKey == '#') {loopA = (loopA+1)%4; pix(200, pixels.Color(255,120,loopA*80));}
    
    //byte a;
    uint32_t color;
    float falt, h_dop1 ;
    gps.crack_datetime(&year,&month,&day,&hour,&minute,&second);
    gps.f_get_position(&latitude, &longitude); 
 falt = gps.altitude()/100;
 h_dop1 = gps.hdop();
 h_dop1 = h_dop1 /100;
 int spd = gps.f_speed_kmph();
 
 if(loopA==0) 
 color= pixels.Color(0,0,0);
 if (loopA==1){ //режим компас
 int compas = gps.f_course();
  Serial.println(compas);
  byte comp =compas/90;
  compas=map(compas, 0, 360, 0, 255);
  switch (comp){
case 0:сектор СВ
       color= pixels.Color(0,4*abs(compas-64),2*abs(compas));
       break;
case 1:       //сектор ЮВ   
       color= pixels.Color(2*abs(compas-64),0,128);
       break;
case 2: //сектор ЮЗ
       color= pixels.Color(128,0,2*abs(192-compas));
       break;
case 3: //сектор СЗ
       color= pixels.Color(2*abs(compas-256),4*abs(compas-192),0);
       break;
         }}
else if (loopA==2){//режим спидометр
    int spd1=map(spd, 0, 20, 0, 255);//диапазон скоростей от 0 до 20 кмч
    color= pixels.Color(spd1,0,128-(spd1/2));}
else if (loopA==3){//спидометр
    int spd1=map(spd, 0, 120, 0, 255);//диапазон скоростей от 0 до 120 кмч
    color= pixels.Color(spd1,0,128-(spd1/2));}
pixels.setPixelColor(0, color);
pixels.show();


 hour = hour + 3;
       if (hour > 23) {hour = hour - 24; day +=1;}
       year -= 2000;
    sprintf(date1, "%4d-%02d-%02dT%02d:%02d:%02dZ",year, month, day, hour,minute,second);
     Serial.println(date1);
  if ( start > 2000) {
    dataFile = SD.open(filepath, FILE_WRITE);
    unsigned long filesize = dataFile.size();
     // back up the file pointer to just before the closing tags
    filesize -= 27;
    dataFile.seek(filesize);
    dataFile.print(F("<trkpt lat=\"")); 
    dataFile.print(latitude,7);
    dataFile.print(F("\" lon=\""));
    dataFile.print(longitude,7);
    dataFile.println(F("\">"));
    dataFile.print(F("<time>"));
    dataFile.print(date1);
    dataFile.println(F("</time>"));      
    dataFile.print(F("<ele>")); 
    dataFile.print(falt,1);
    dataFile.print(F("</ele>\r\n<hdop>")); 
    //dataFile.print(F("<hdop>")); 
    dataFile.print(h_dop1,3);
    dataFile.println(F("</hdop>\r\n</trkpt>"));
    dataFile.print(F("</trkseg>\r\n</trk>\r\n</gpx>\r\n"));
    dataFile.close();
}
pixels.clear();
pixels.show();
smartdelay(1000);

}

static void smartdelay(unsigned long ms) {
  start = millis();
  do 
  {
    while (shield.available())
      gps.encode(shield.read());
  } while (millis() - start < ms);
}

static void pix(int del, uint32_t color){
start=millis();
     do { pixels.setPixelColor(0, color);
     pixels.show();} while (millis()- start < del);
     pixels.clear();
     pixels.show();}

 

 

ioleg73
Offline
Зарегистрирован: 16.05.2015

Господа, а скетч не битый ни у кого не сохранился?