基于STM32单片机智能手表手环GSM短信上报GPS定位校时
1 基于STM32单片机智能手表手环GSM短信上报GPS定位校时
本设计以STM32单片机为核心,结合GPS模块、GSM模块、LCD1602液晶显示器、按键、LED指示灯以及电源电路,构建了一个具备定位、信息显示和远程短信交互功能的智能手表/手环系统。系统不仅能实现GPS定位与实时时钟显示,还能通过GSM模块将数据上报,用户也可以通过发送短信的方式查询设备的实时状态。本系统的功能设计贴近实际应用,兼具实用性与学习研究价值。
2 系统功能介绍
- GPS定位功能:通过GPS模块获取当前经纬度信息,并可通过浏览器输入经纬度查看具体位置。
- LCD显示功能:采用LCD1602液晶屏显示经纬度与时钟/日期信息,用户可通过按键切换显示模式。若GPS定位未成功,显示“gps link…”。
- 电位器调节功能:通过电位器调节LCD屏对比度,从而调节显示清晰度。
- 手电筒功能:通过一个按键控制LED灯亮灭,具备手电筒的功能。
- 短信发送功能:通过按键触发,系统将当前经纬度信息通过GSM模块以短信方式发送给指定人员。
- 短信查询功能:用户可发送“GET”短信至设备号码,设备解析指令后自动回复LCD显示的实时数据。
- 指示灯提示:在短信发送或接收过程中,LED灯会进行闪烁提示,增强人机交互效果。
- 电源要求:GSM模块上电需要几秒钟初始化,且系统供电必须保证稳定的+5V/2A,以保证模块正常工作。GPS天线必须放置在开阔环境中,确保定位成功率。
3 系统电路设计
系统硬件电路主要由STM32单片机最小系统、GPS模块电路、GSM模块电路、LCD1602液晶显示电路、按键与LED电路、电位器调节电路和电源电路组成。下面将分别介绍各模块的设计原理和功能。
3.1 STM32单片机最小系统
STM32单片机是本系统的核心控制器,承担数据采集、信号处理、显示驱动、串口通信和逻辑控制等任务。
- 核心元件:STM32F103C8T6。
- 复位电路:采用上电自动复位和手动复位相结合,保证系统启动稳定。
- 时钟电路:外接8MHz晶振,通过倍频后获得系统时钟。
- 存储资源:内部Flash和SRAM用于存储程序和运行数据。
- 外设接口:通过USART与GPS、GSM模块通信,通过GPIO与按键、LED交互,通过并口/模拟接口与LCD1602进行显示。
3.2 GPS模块电路
GPS模块用于获取设备所在位置的经纬度信息。
- 通信方式:通过USART串口与STM32通信。
- 输出格式:模块输出NMEA-0183格式的字符串数据,包括时间、纬度、经度、海拔、速度等信息。
- 电源要求:一般为+3.3V或+5V供电。
- 设计要点:必须保证GPS天线在开阔环境中,避免定位失败。
3.3 GSM模块电路
GSM模块用于实现短信收发功能。
-
通信方式:与STM32通过USART通信,使用AT指令集进行控制。
-
供电要求:电源电流需达到2A以上,否则模块可能无法正常注册网络。
-
功能实现:
- 系统上电后自动初始化GSM模块。
- 按键触发后,通过AT+CMGS命令将GPS获取的经纬度信息发送至预设号码。
- 当收到短信时,系统会判断是否为“GET”指令,并将LCD显示内容打包为短信发送回去。
3.4 LCD1602显示电路
LCD1602液晶显示器用于显示GPS定位信息与时间日期信息。
- 显示模式:采用4位数据总线方式与STM32连接,节省IO口。
- 显示内容:第一行显示经纬度或提示信息,第二行显示日期和时间。
- 按键切换:通过按键可在经纬度显示和时间显示之间切换。
- 异常提示:若GPS定位失败,则显示“gps link…”。
3.5 按键与LED电路
本系统采用3个独立按键和一个LED灯:
- 按键1:切换LCD显示内容。
- 按键2:控制LED手电筒开关。
- 按键3:触发GSM模块发送短信。
- LED指示灯:用于提示短信收发过程状态。
3.6 电位器调节电路
电位器用于调节LCD1602对比度,确保在不同环境下显示清晰度最佳。
3.7 电源电路
电源电路为整个系统提供稳定电压。
- 供电要求:GSM模块需要+5V/2A供电,STM32与LCD采用+5V供电,GPS模块一般+3.3V/5V均可。
- 稳压芯片:可采用AMS1117-3.3为GPS模块供电。
- 电磁干扰抑制:在GSM模块供电端增加电解电容与去耦电容,避免启动时电压不稳导致系统复位。
4 系统程序设计
程序部分使用STM32标准外设库开发,主要包括GPS数据解析、GSM短信处理、LCD显示控制、按键与LED控制等功能模块。以下分模块进行介绍。
4.1 主程序设计
主程序负责各模块初始化与循环调度。
- 初始化LCD、USART、按键与LED。
- 进入循环后,实时接收GPS数据并解析。
- 根据按键状态决定LCD显示内容。
- 若触发短信发送,则调用GSM发送函数。
- 若检测到接收短信,则进行解析与应答。
int main(void) {LCD_Init();USART1_Init(9600); // GPSUSART2_Init(115200); // GSMKey_Init();LED_Init();while(1) {GPS_Update();if(Key1_Pressed()) {LCD_ToggleView();}if(Key2_Pressed()) {LED_Toggle();}if(Key3_Pressed()) {GSM_SendLocation(GPS_Latitude, GPS_Longitude);}GSM_ReceiveHandler();LCD_Update();}
}
4.2 GPS数据解析程序
GPS模块输出NMEA格式数据,如$GPRMC
语句,其中包含经纬度、UTC时间等信息。程序需解析字符串并提取所需字段。
void GPS_Update(void) {char buffer[128];if(USART1_ReadLine(buffer)) {if(strstr(buffer, "GPRMC")) {Parse_GPRMC(buffer, &GPS_Latitude, &GPS_Longitude, &GPS_Time);}}
}
4.3 GSM短信发送与接收程序
短信处理采用AT指令:
- 发送短信:使用
AT+CMGS
命令,将经纬度信息发送到目标号码。 - 接收短信:系统检测收到的短信内容,如果为“GET”,则返回LCD上的实时信息。
void GSM_SendLocation(float lat, float lon) {char cmd[64];sprintf(cmd, "AT+CMGS=\"%s\"\r\n", "1234567890");USART2_SendString(cmd);DelayMs(100);sprintf(cmd, "LAT:%.6f,LON:%.6f\r\n", lat, lon);USART2_SendString(cmd);USART2_Send(0x1A); // 结束符
}void GSM_ReceiveHandler(void) {char msg[128];if(USART2_ReadSMS(msg)) {if(strstr(msg, "GET")) {char reply[64];sprintf(reply, "DATA:%s", LCD_CurrentData());GSM_SendSMS("1234567890", reply);}}
}
4.4 LCD显示控制程序
LCD显示根据按键状态在经纬度和时间显示之间切换。
void LCD_Update(void) {LCD_Clear();if(displayMode == 0) {LCD_ShowString(0,0,"LAT:");LCD_ShowFloat(0,4,GPS_Latitude,6);LCD_ShowString(1,0,"LON:");LCD_ShowFloat(1,4,GPS_Longitude,6);} else {LCD_ShowString(0,0,GPS_Time.date);LCD_ShowString(1,0,GPS_Time.clock);}
}
4.5 按键与LED控制程序
按键与LED功能实现较为简单,主要通过GPIO电平读取与翻转实现。
void LED_Toggle(void) {LED = !LED;
}int Key1_Pressed(void) {return (KEY1 == 0);
}
5 总结
本设计基于STM32单片机,构建了一个集GPS定位、GSM短信交互、LCD显示和人机交互于一体的智能手表/手环系统。通过GPS模块实现经纬度与时间获取,通过LCD1602进行直观显示,通过GSM模块实现远程短信查询与上报。系统设计中采用了电位器调节LCD对比度、按键控制LED手电筒、指示灯提示短信处理状态等细节,使系统更贴近实际应用。
该系统在功能实现上不仅展示了单片机与无线通信、定位模块的综合应用,也为智能穿戴设备的开发提供了参考,具有较强的学习和实践价值。