🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
🚩 **基于单片机的GPS定位位置记录系统 **
🥇学长这里给一个题目综合评分(每项满分5分)
🧿 选题指导, 项目分享:
基于stm32单片机丰富的板载资源,并结合GPS模块及显示等其他模块,在方便记录轨迹的同时,提供校为便利的用户交互体验(如声音提示和用户按键交互,及屏幕显示)。项目可用于运动轨迹记录,及实时显示速度等展示,及其他应用领域,解决部分场景下位置记录实时查看不便或需要借助其他功耗相对较高的记录设备的问题,同时增加生活的趣味性。
定位界面
系统日期和时间界面 (GPS校时后)
经纬度界面
实时速度于定位距离界面
系统日期时间界面,GPS轨迹录制状态显示
GPS轨迹查看
整体硬件由4部分组成:
stm32单片机、SSD1306 OLED显示屏、GPS模块(支持北斗和GSP双模定位)和SD卡
注:其中开发板还用到了GREEN和RED灯,和S2及S3按键
硬件示意图
硬件整体外观如下图所示
SSD1306 OLED显示屏(II2C)引脚连接
PE3 - OLED SCL、PE2 - OLED SDA、电源引脚
GPS模块引脚连接(串口)
PA4 - GPS RX、PA3 - GPS TX、电源引脚
OLED和GPS模块电源引脚连接
模块供电,均采用开发板提供的3.3V电源引脚
简介
开发板采用中科蓝讯的32位RISC-V指令集的AB32VG1型号MCU,主频120M。MCU有8M的Flash,和192K SRAM。支持3.0V-5.0V供电。
与一般MCU不同的是,这款MCU具有MPU模块,就是电源管理模块,支持Charge电路、BUCK电路、LDO电路等等,手册第十页给出了MPU模块的详细参数。
开发环境搭建
根据官方的指导,使用的是RT-thread官方stduio平台,先更新软件源代码至最新版,下载中科蓝讯软件包,下载RISC-V-GCC工具链,编译程序会用到。
软件包配置
接下来选择我们本次实验用到的软件包,wavplayer软件包、optparse软件包和multibutton软件包,实现通过板载按键控制声音的播放语音量的增减。
然后对软件包进行简单配置,按键的示例代码可以勾选也可以不勾选,后面要对此进行修改,改为评测板上的用户按键,optparse软件包默认即可。
项目的软件采用RT-Thread官方提供的IDE RT-ThreadStudio开发,SDK基于AB32VG1-AB-PROUGEN,同时部分模块采用官方软件包,如ssd1306软件包,也移植了部分软件,如TinyGPS++和GPX(该部分开源软件主要由C++编写,移植采用C实现,并修改部分BUG),GPS记录后的轨迹符合GPX规范,可以用GPXSee(http://www.gpxsee.org) 软件查看。
软件框架
核心数据结构和API如下:
/* Clock */
typedef struct{
uint16_t year;
uint8_t month;
uint8_t day;
uint8_t week;
uint8_t hour;
uint8_t minute;
uint8_t second;
uint16_t millisecond;
} Clock_Info_t;
/* GPS */
typedef struct{
bool isVaild;
float longitude;
float latitude;
float altitude;
float course;
float speed;
int16_t satellites;
Clock_Info_t clock;
} GPS_Info_t;
/* GPS 数据回调 */
typedef rt_int32_t (*gps_callback_t)(GPS_Info_t info);
int gps_init(gps_callback_t callback);
bool gps_get_info(GPS_Info_t* info);
float gps_get_distance(GPS_Info_t* info, float preLong, float preLat);
page.c (page.h) - OLED界面
OLED界面主要实现:系统本地日期时间显示、定位状态显示、当前经纬度和实时速度及已经定位的距离
头文件定义:
typedef enum _page_type {
PAGE_STARTUP = 0,
PAGE_DATE_TIME,
PAGE_LOCATION,
PAGE_SPEED,
PAGE_MAX,
}page_type_t;
typedef enum _page_state {
PAGE_STATE_LOCATION = 0x1,
PAGE_STATE_TRACK = 0x2,
}page_state_t;
void page_init();
void page_switch(rt_int32_t index);
void page_update();