数码之家

 找回密码
 立即注册
搜索
查看: 2516|回复: 18

[Arduino] 组装只GPS记录来试验,方便户外记录路线(试验品)+0713总结

[复制链接]
发表于 2020-7-9 11:25:04 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 devcang 于 2020-7-13 08:57 编辑

承传一贯作风,直接来图
IMG_20200709_104142_.jpg
串口和下载串口重复使用,所以弄个开关,下载时,停止传送GPS的消息。

IMG_20200709_105245_.jpg
本来还可以将电池或GPS放盒子内部,但懒得开gps的孔,而Nano两面都有元件,放电池又超高一点点,刚好顶到reset按键。

制作的目的,就是要记录。原因是手机程序,自从Android8/9版本后,后台运行不了,所以,有这记录仪的想法。


修改: 将MicroCard的1117换成622k,电压差更小。考虑是否要将Nano的1117也换成622k,或者不要降压、直接连接电池(328P电压是够宽的)。这样电池供电就不成问题了。先试验硬件、和程序,还没有工作指示led,但可从Nano的灯上看到工作情况。 GPIO有多余,但程序空间不是太多,不然可以做多些功能。看看还能不能增加只液晶屏。


程序是第1版
/*
GPS/SD card read/write
SD卡连接
** MOSI - D11
** MISO - D12
** CLK  - D13
** CS   - D10
**
**GPS连接,3线,电源+TX,其中TX带开关,连接到下载串口RX
**
**devcang
**试验版本
*/

//#define Led_on()  digitalWrite(LED_BUILTIN, 1)   // 和SPI冲突,不使用
//#define Led_off() digitalWrite(LED_BUILTIN, 0)

#include <SPI.h>
#include <SD.h>

// #define FUGPS_DEBUG
//#include <NeoSWSerial.h>    //软串口
//NeoSWSerial gpsIn(8, 9);    //uint8_t receivePin, uint8_t transmitPin

#include <FuGPS.h>
FuGPS fuGPS(Serial);        // gpsIn  Serial

void printDirectory(File dir ) {//列出SD卡中的文件,大小
    while (true) {
        File entry =  dir.openNextFile();
        if (! entry) {      //没有文件了
            break;
        }

        Serial.print(entry.name());
        Serial.print("\t\t");
        Serial.println(entry.size(), DEC);
        while (entry.available()) {
            Serial.write(entry.read());
        }
        Serial.println("------------");
        entry.close();
    }
}
void setup() {
    Serial.begin(9600);//74880   9600
    while (!Serial) {
        ; // wait for serial port to connect. Needed for Leonardo only
    }
    //gpsIn.begin(9600);//软串口
    // pinMode(LED_BUILTIN, OUTPUT);//pin GPIO13 --- LED_BUILTIN 冲突,不使用

    Serial.print("Initializing SD card...");
    //  pinMode(10, OUTPUT); //这意思是,要不使用CS脚,置OUTPUT
    //  if (!SD.begin(4)){   //自定义的CS脚

    if (SD.begin()) {
        Serial.println(" done.");
        if (! SD.exists("GPS.txt")) {
            File fTmp = SD.open("GPS.txt", FILE_WRITE);
            if (fTmp) {
                fTmp.println("GPS Tracker BETA");
                fTmp.close();
            }// if (myFile)
        }

        File root = SD.open("/");
        printDirectory(root);
    } else {
        Serial.println(" failed!");
    }

    // fuGPS.Hours   = 0;  //非必要
    // fuGPS.Minutes = 0;
    // fuGPS.Seconds = 0;
}


//Latitude纬度, Longitude经度
//纬度坐标1,经度坐标1, 纬度坐标2,经度坐标2
double Distance(double n1, double e1, double n2, double e2) {
    const double jl_jd = 102834.74258026089786013677476285;
    const double jl_wd = 111712.69150641055729984301412873;
    double b = abs((e1 - e2) * jl_jd);
    double a = abs((n1 - n2) * jl_wd);
    return sqrt((a * a + b * b));
}

const String Zero = String("0"), Empty = "", Dashes = "-", Colon = ":", Space = " ", Comma = ",";

volatile unsigned long b = 0, tSaveFile = 0;
volatile float lastX, lastY;

String toStr(byte b) { //发现直接用String(),会有错误
    if (b < 10) {
        return Zero + (char)(b + '0');
    } else {
        char s = (char) (byte)((b / 10) % 10 + 0x30);
        char g = (char) (byte)(b % 10 + 0x30);
        return Empty + s + Empty + g;
    }
}

void loop() {
    if (fuGPS.read() ) {
        // Serial.print("Quality: "); Serial.print(fuGPS.Quality); Serial.print(", Satellites: "); Serial.print(fuGPS.Satellites);

        if ( fuGPS.hasFix() == true) { // 成功定位
            if((fuGPS.Hours>23) && (fuGPS.Minutes>59) && (fuGPS.Seconds>59)){//有时候会收到错误的时间数值
                fuGPS.Hours   = 0;
                fuGPS.Minutes = 0;
                fuGPS.Seconds = 0;
            }

            String strDate = toStr(fuGPS.Years) + Dashes + toStr(fuGPS.Months) + Dashes + toStr(fuGPS.Days);
            String strTime = toStr(fuGPS.Hours) + Colon + toStr(fuGPS.Minutes) + Colon + toStr(fuGPS.Seconds);
            String str = strDate + Space + strTime + Space
            + String(fuGPS.Latitude, 6)  /*纬度*/ + Comma + String(fuGPS.Longitude, 6)  /*经度*/
            + Comma + "alt:" + String(fuGPS.Altitude)
            + Comma + "acc:" + String(fuGPS.Accuracy)
            + Comma + "spd:" + (fuGPS.Speed > 0 ? String(fuGPS.Speed) : Zero);

            bool bSave = false; //下边作简单的过滤
            bSave = (Distance(lastY, lastX, fuGPS.Latitude, fuGPS.Longitude) > 3) //3米
                    && (fuGPS.Minutes > 0) && (fuGPS.Seconds > 0) && (fuGPS.Months >= 0) && (fuGPS.Days >= 0)
                    && ((millis() - tSaveFile ) > 1000);
            bSave = bSave || ((millis() - tSaveFile ) > 5000);//5秒

            if (bSave) {
                String fname = String("G") + toStr(fuGPS.Years) + toStr(fuGPS.Months) + toStr(fuGPS.Days) + ".txt";
                File fGps = SD.open(fname, FILE_WRITE);
                if (fGps) {
                    fGps.println(str);
                    fGps.close();
                    Serial.println(str);
                } else {
                    Serial.println("error opening |" + fname + "|");
                }// if (fGps)
                tSaveFile = millis();
            }

            lastX = fuGPS.Longitude;//经度
            lastY = fuGPS.Latitude; //纬度
            return;
        }
    }


    //较慢闪 LED_BUILT,再加上串口灯,还没定位 --- LED_BUILTIN 冲突,不使用
    if (fuGPS.isAlive() ){// Default is 10 seconds
        if (millis() - b >= 3000) {
            String strTime = toStr(fuGPS.Hours) + Colon + toStr(fuGPS.Minutes) + Colon + toStr(fuGPS.Seconds);
            // Led_on();
            Serial.println(strTime);
            // delay(680);
            // Led_off();
            b = millis();
        }

        //  } else { //较慢闪 LED_BUILT,还没GPS消息 --- LED_BUILTIN 冲突,不使用
        //    if (millis() - b >= 1000) {
        //      Led_on();
        //      delay(15);
        //      Led_off();
        //      b = millis();
        //    }
    }

}
//---END---


回头试试tinyGPS,看看哪个稳、准、狠。。。。




Arduino容易上手,本文也只是指引。

=================分割线==================

总结:
1、3.3的供电,换成622k,压差适合电池供电。电池给Nano的电,可以焊到USB的V+,一般有串联二极管再给328P供电的。
2、使用tinyGPS比较好,省内存又好操作。tinyGPSPlug“再封装”,操作更方便,但多用7、80字节的内存。
3、GPS的电源应该单独供电,一般情况下使用能控制省电,这样再启动不是冷启动,定位快。
4、arduino的time.h,可以方便转换时区,struct tm -> time_t  -> +8h ->struct tm 。
5、使用硬串口,支持事件。
6、SD.h,创建文件时,其文件名长度≤8字符。

修改后的程序,主要是更换tinyGPS,写TF卡文件还是同样的。而tinyGPS自带的例子,可以取来用,修变起来也不难,就不贴了。



打赏

参与人数 2家元 +70 收起 理由
人艰不拆了 + 20
家睦 + 50

查看全部打赏

 楼主| 发表于 2020-7-9 11:33:15 | 显示全部楼层
snap001280.jpg

河边散步,测试,还过得去。。。。。。。

打赏

参与人数 1家元 +20 收起 理由
亲爱的混蛋 + 20

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2020-7-9 11:49:10 | 显示全部楼层
devcang 发表于 2020-7-9 11:33
河边散步,测试,还过得去。。。。。。。

请问怎么和地图关联起来的?
回复 支持 反对

使用道具 举报

发表于 2020-7-9 12:30:27 | 显示全部楼层
记录生成gpx轨迹文件,再放到google地球或者奥维地图等软件上打开
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-9 12:41:10 | 显示全部楼层
madaxiazi 发表于 2020-7-9 12:30
记录生成gpx轨迹文件,再放到google地球或者奥维地图等软件上打开


要稍作修正,,,,,国内的地图,都是火星坐标。。。。。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-9 12:44:17 | 显示全部楼层
yaosongjin 发表于 2020-7-9 11:49
请问怎么和地图关联起来的?

坐标要先作修正(各地图,坐标不尽相同),然后,通过地图api、使用js做路线,显示出来。

上边的图片,是使用程序,生成一个.html,打开即可显示,其中是使用QQ地图的js api的。
回复 支持 反对

使用道具 举报

发表于 2020-7-9 13:00:19 | 显示全部楼层
这个666,有没有办法可以制作出野外用的?比如说山区手机信号不好的地方。:lol:
回复 支持 反对

使用道具 举报

发表于 2020-7-9 13:15:04 | 显示全部楼层
厉害了,可以打板子做成成品了,配个外壳高大上
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-9 14:56:54 | 显示全部楼层
maxking0731 发表于 2020-7-9 13:00
这个666,有没有办法可以制作出野外用的?比如说山区手机信号不好的地方。 ...

gps是全球的吧,,,,,,,要地图,可以有离线的。
回复 支持 反对

使用道具 举报

发表于 2020-7-9 16:07:22 | 显示全部楼层
devcang 发表于 2020-7-9 14:56
gps是全球的吧,,,,,,,要地图,可以有离线的。

抱歉,我说的不太清楚,我有时候去的地方比较偏僻,不知道具体要下哪部分的离线地图,手机带的GPS定位慢不说还不准,外挂个100多的蓝牙GPS模块还没车里自带的好用,耗电量也大。
回复 支持 反对

使用道具 举报

发表于 2020-7-9 22:06:36 | 显示全部楼层
可以参考这篇文章 http://bbs.mydigit.cn/read.php?tid=1931926 (就是我写的 狗头.jpg)

我当初就是参考这个解析的GPX文件
GPX文件格式说明参见:http://www.topografix.com/gpx/1/1/#SchemaProperties
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-10 08:56:15 | 显示全部楼层
ifm 发表于 2020-7-9 22:06
可以参考这篇文章 http://bbs.mydigit.cn/read.php?tid=1931926 (就是我写的 狗头.jpg)

我当初就是参考 ...

Thanks  ,,,,,,做得漂亮!

TinyGPS 或 TinyGPS++    很方便
回复 支持 反对

使用道具 举报

发表于 2020-7-10 11:15:48 | 显示全部楼层
devcang 发表于 2020-7-9 11:33
河边散步,测试,还过得去。。。。。。。

现在新手机,后台程序被杀是个问题。明明我自己做个Android程序想24小时运行,却非常难做到。而那些流氓程序,怎么都能一直后台保活。

搞得我现在只能用淘汰的老手机。
回复 支持 反对

使用道具 举报

发表于 2020-7-10 23:21:33 | 显示全部楼层
行者APP后台运行会被关掉?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-13 08:26:10 | 显示全部楼层
40560335 发表于 2020-7-10 23:21
行者APP后台运行会被关掉?

这个没有使用过。

可是能看到,诸如网易音乐、扣扣、微信也没能后台运行。。。。。。一键清理后,那些能弹出消息的,不是后台运行的,而是手机厂商(软件系统)的推送的。。。。。。


第3方的app,总有点不周到的地方,如size大、或要联网、或有广告、或不能选地图
、或操作麻烦、或不能挑选时间段,等等,总之不那么如意。与其费劲地做不必要的研究,不如组装个记录仪,简单易用。和手机配合,也能很快出来轨迹。。。。。。。
回复 支持 反对

使用道具 举报

发表于 2020-7-16 00:53:19 | 显示全部楼层
devcang 发表于 2020-7-13 08:26
这个没有使用过。

可是能看到,诸如网易音乐、扣扣、微信也没能后台运行。。。。。。一键清理后,那些能 ...

能不能被一键清理,是可以设置的,保证不想要的直接被清理,还想运行的继续运行。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-16 08:15:35 | 显示全部楼层
40560335 发表于 2020-7-16 00:53
能不能被一键清理,是可以设置的,保证不想要的直接被清理,还想运行的继续运行。 ...



手机系统是较新的,miui,没root。
网上找到,能做到的,都写程序测试过了,后台运行总是不正常。故此,不如硬件来得痛快。
回复 支持 反对

使用道具 举报

发表于 2020-7-16 18:10:35 | 显示全部楼层
14块钱用一年带硬件的那个挺香。。但是,自己做的话,重在过程。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-16 20:27:42 | 显示全部楼层
jpdd521 发表于 2020-7-16 18:10
14块钱用一年带硬件的那个挺香。。但是,自己做的话,重在过程。。

不一样的要求。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-20 17:18 , Processed in 0.312000 second(s), 17 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表