牛羊定位器

开发板使用的是尚硅谷的定位器开发板和stm32开发板,感谢尚硅谷提供的资料,lvgl看到是韦东山老师的课,讲的非常好。写这篇文章相当于对这个项目的总结吧,因为stm32网关开发板性能太差操作太卡顿,ui界面使用电脑用codeblocks设计。

项目代码下载地址:https://gitee.com/xiao-liu-harbors-dreams/locator

网盘地址: https://pan.baidu.com/s/1UA4YaT2INWxJapZx9nrsaw?pwd=liu6 提取码: liu6

lvgl视频链接:lvgl牛羊定位器界面_哔哩哔哩_bilibili

项目需求

实现牛羊实时定位并上传定位数据,网关处可实时查看定位和步数数据

1. 项目概述

1.1 定位器相关功能

  • 获取定位数据:通过GPS模组获取牛羊的定位数据。
  • 上报定位数据:通过NB模组直接上传云平台或LoRa上报网关然后上报云平台,定时上报定位数据。

1.2 网关相关功能

  • 上传定位数据:接收定位器数据并上报云平台
  • 查询历史数据:查询云平台的历史定位数据
  • 展示界面:通过显示屏操作,显示历史步数信息和实时定位数据

二. 硬件选型

2.1 主控芯片

定位器采用stm32c8t6,和网关采用stm32zet6

2.2 LoRa模块

使用LLCC68支持 150 MHz 至 960 MHz 的连续频段,兼容全球主流 ISM 频段。在理想环境下可达 5–11 公里,适用于远距离无线通信场景。LoRa 模式下可达 -148 dBm(125 kHz 带宽)。发射功率最高 +22 dBm。超低功耗,接收电流低至 4.2–5.2 mA,休眠/睡眠电流仅 200 nA – 2 μA。可直接移植官方驱动直接使用。

2.3 NB模块

使用QS100具有高性能、低功耗、多频段,内嵌 TCP、UDP、MQTT、COAP、LWM2M等多种通信协议栈,支持中国移动 OneNET ,中国联通云和中国电信 IoT 物联网云平台。PSM模式下功耗仅1uA,eDRX模式下功耗0.1mA。驱动可查看QS100连接onenet - 2666666 - 博客园这篇文章获取。

2.4 以太网模块

网关使用w5500进行网络连接,w5500支持全硬件 TCP/IP 协议栈,支持 8 个独立 Socket。直接移植驱动即可使用。

2.4 GPS模块

使用AT6558R,BDS/GPS/GLONASS 多系统联合定位和单系统独立定位,捕获灵敏度:-148 dBm,跟踪灵敏度:-165 dBm。冷启动时间:< 30 秒,热启动时间:< 1 秒,待机电流:8uA。驱动可查看AT6558R 驱动 - 2666666 - 博客园这篇文章获取。

2.5 计步模块

使用DS3553,待机电流仅1.8uA。提供牛羊的步数数据。驱动可以查看DS3553驱动 - 2666666 - 博客园这篇文章获取

三. 开发环境与项目架构

3.1 开发环境

vscode+keil,lvgl使用的codeblocks

3.2 项目架构

3.2.1 定位器

image-20251220180802537

3.2.2 网关

image-20251220181143348

代码就不介绍了,挺简单的,定位器主要是QS100,只要了解点LWM2M协议就能看懂,网关只要会使用W5500就行,lvgl代码重要部分都做了说明,做的可能不好看,因为懒得设置样式动画了,只设置了几个动画,但相应功能都有,做这个也是为了练习一下,所以把所有控件基本上都使用了一遍。

遇到的其他问题

驱动相关问题已经在驱动文章中说明了,移植w5500和lora挺顺利没遇到什么问题,lvgl移植到网关开发板太卡顿屏幕是3.5寸的,分辨率是480 * 360,使用fsmc感觉刷新不过来太卡了,使用lvgl也挺顺利,这里主要写移植fatfs(虽然没有用到)。

1. cubemx配置fatfs

  • 使用cubemx配置完后通信失败,查看main函数中SDIO初始化代码中,数据总线长度是否为1,不是1也会通信失败,可以通过查找参考手册得知。
  • 还是通信失败可以增加栈空间再试试

image-20251212095754837

image-20251212095408240

2. lvgl 移植文件系统

使用fatfs没什么问题,这个问题是在使用codeblocks移植文件系统遇到的,因为电脑要使用c语言的stdio.h库来进行文件操作,操作时发现使用不了文件系统和不能打开不存在的文件,因为使用fatfs没有遇到这种问题。

  • 打不开文件是因为没有设置 LV_FS_STDIO_PATH这个宏。
  • 不能打开不存在的文件是因为以读写方式打开是使用的 rb+ ,如果文件不存在就会打开失败。
#define LV_USE_FS_STDIO 1
#if LV_USE_FS_STDIO
    #define LV_FS_STDIO_LETTER 'D'     /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
    #define LV_FS_STDIO_PATH "D:"       /* 这个宏必须设置,否则不能打开文件 */
    #define LV_FS_STDIO_CACHE_SIZE 0    /*>0 to cache this number of bytes in lv_fs_read()*/
#endif

/* fs_open中使用到了 LV_FS_STDIO_PATH 宏 
   以读写方式打开是使用的 rb+ ,如果文件不存在就会打开失败 */
static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode)
{
    LV_UNUSED(drv);

    const char * flags = "";

    if(mode == LV_FS_MODE_WR) flags = "wb";
    else if(mode == LV_FS_MODE_RD) flags = "rb";
    else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) flags = "rb+";  

    /*Make the path relative to the current directory (the projects root folder)*/

    char buf[MAX_PATH_LEN];
    lv_snprintf(buf, sizeof(buf), LV_FS_STDIO_PATH "%s", path);

    return fopen(buf, flags);
}
posted @ 2025-12-20 19:52  2666666  阅读(73)  评论(0)    收藏  举报