Arduino 制作gps轨迹记录仪 最详细的制作过程、代码

为什么要自己做

现售的专业记录轨迹的设备有很多,从几百元到几千元不等,智能手机也可以记录轨迹,既然可以这么方便的记录轨迹,那自己做轨迹记录仪的好处在哪里呢?
1、智能手机的待机时间是痛点,如果设置不当,自动管理后台应用的程序会让地图软件休眠,导致熄屏的时候没有记录数据。自制设备开机即记录。
2、现售的设备存储空间不是很理想,且操作需要主机菜单点击,存储路点不方便。自制设备一键记录路点。
3、买来的东西没有自己做的东西好玩。

设想的功能:

1、没有屏幕,不显示时间等信息,调试的时候可以使用屏幕,最后成品打包的时候,拿掉屏幕。
2、tf卡读卡器,取数据的时候,把卡拔出来。
3、物理按钮:拨动开关0控制电源、微动开关1控制记录路点、微动开关2控制停止操作tf卡
4、用几个led显示当前状态,led0显示电源接通、led1显示gps信号、led2显示tf卡
5、gps数据纯粹记录log文件,不做任何解析,使用谷歌地球导入文件。

需要的模块:

1、Arduino uno
2、gps模块+天线
3、tf卡模块
4、电池,目前设想是一节18650,到时候还是要看看待机时间。
5、led、按钮等。

逐步实现的代码思路

1. gps

是否解析gps数据,这是两个思路,如果解析,那么,就只需要写入$GPRMC和 GPGGA,按日期为文件名写入tf卡,并节省tf卡的空间,然而tf卡有32GB,完全不需要考虑容量;
不解析就拿不到日期,写入数据的文件就只能按序列编号递增,不便于日后查询。根据从易到难的顺序,我还是先不解析,待调试完毕,第二版增加解析的功能。
初级目标就是把原始的gps 数据写入。这步的问题在于如何设置适当的缓冲区,把串口信息写入tf卡。中间加一个定时器,设定写卡的间隔

2. tf卡

这步没有什么难度,按照官方的例程把线插好,测试一下读写即可。尽量把串口信息缓冲到内存,减少tf卡的频繁操作。卡里放个配置文件,配置记录航点的频率。

3. 按钮

要学一下端口中断,保证系统响应到按钮。这步还是设想。

初级版本的代码

1、gps部分

String s1 = ""; //缓存串口字符
//读取指定长度的串口字符存入s1,如果不解析,直接把s1写入卡中
char st;
  while (s1.length() < maxLength)
  {
    if (Serial.available()) {
      st = Serial.read();
      s1 += String(st);    
    }
  }

用习惯了c#,回头再用c来编程,处理字符串的时候特别吃力,指针和字符数组看的头大,如果有支持c#的开发板该有多好。还好后来发现arduino支持String类,简化了很多。这里不得不说,arduino只有2kB内存,缓存600B的串口数据就占掉了三分之一。如果减少缓存,就要更加频繁的读写tf卡,现在看看其他的开发板,零知开发板的内存是20kB,是uno的10倍,操作一下gps肯定是够了;nodeMcu的内存是50kB,更是让人激动。不知道这两个板子的上手难度如何,淘宝都已下单,过几天把玩一下。

2、tf卡部分

  File f = SD.open(fileWrite, FILE_WRITE);
  f.print(s1);
  f.close();
  if(s1.length() >= maxLength){
    s1="";
  }

fileWrite是待写入的文件名,由下面的函数判读

String toWriteFile()
{
  //如果默认文件不存在,直接返回默认值
  if (!SD.exists("gps1001.log"))
  {
    return String("gps1001.log");
  }
  for (int i = 1001; i < 9999; i++)
  {
    //根据递增判断目录中的最大号码的文件名
    String n = String("gps") + String(i) + String(".log");
    String n2 = String("gps") + String(i + 1) + String(".log");
    //Serial.println("check...");
    if (SD.exists(n) && (!SD.exists(n2)))
    {
      //判断当前的最大号码文件的大小,如果过大就递增一个号码
      long maxSize = 900000;
      File f = SD.open(n);
      if (f.size() > maxSize) {
        f.close();
        return n2;
      } else {
        f.close();
        return n;
      }
    }
  }
}

以上代码已调试完毕,可以完美的记录gps轨迹啦,等新的开发板到货,准备把gps信号解析出来,只记录有效信息。

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,以下是基于Arduino制作水位湿度报警雷达检测仪的代码,你可以参考一下: ```C++ // 引入超声波模块库 #include <NewPing.h> // 定义超声波模块的引脚 #define TRIGGER_PIN 12 #define ECHO_PIN 11 #define MAX_DISTANCE 200 // 定义湿度传感器的引脚 #define HUMIDITY_PIN A0 // 定义蜂鸣器和LED灯的引脚 #define BUZZER_PIN 8 #define LED_PIN 7 // 初始化超声波模块对象 NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); void setup() { // 初始化串口通信 Serial.begin(9600); // 初始化蜂鸣器和LED灯的引脚 pinMode(BUZZER_PIN, OUTPUT); pinMode(LED_PIN, OUTPUT); } void loop() { // 检测当前水位高度 int distance = sonar.ping_cm(); Serial.print("Water level: "); Serial.print(distance); Serial.println(" cm"); // 如果水位高于预设值,触发报警系统 if (distance < 10) { digitalWrite(BUZZER_PIN, HIGH); digitalWrite(LED_PIN, HIGH); delay(500); digitalWrite(BUZZER_PIN, LOW); digitalWrite(LED_PIN, LOW); delay(500); } // 检测当前湿度 int humidity = analogRead(HUMIDITY_PIN); Serial.print("Humidity: "); Serial.println(humidity); // 等待一段时间 delay(1000); } ``` 这个程序的实现原理与前面提到的流程图是一样的。它不断地使用超声波模块来检测当前水位高度,并且使用湿度传感器来检测当前水的湿度。如果当前水位高于预设值,程序将会触发报警系统,使蜂鸣器发出警报声,并且控制LED灯亮起。程序会将水位高度和湿度数据发送到串口监视器上。 希望这个代码能够对你有所帮助,如果你有任何疑问,请随时向我提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值