一、項目開發(fā)背景
項目開發(fā)背景源于現(xiàn)代單兵作戰(zhàn)、戶外探險及應(yīng)急救援等領(lǐng)域?qū)θ藛T實時位置監(jiān)控的迫切需求。在復(fù)雜多變的野外環(huán)境或任務(wù)執(zhí)行過程中,指揮中心需精準(zhǔn)掌握人員動態(tài)位置以確保行動安全與效率。傳統(tǒng)定位設(shè)備往往存在體積大、功耗高、數(shù)據(jù)傳輸延遲或依賴專用終端等問題,難以滿足輕量化、實時化和低成本的要求。
現(xiàn)有解決方案中,GPS技術(shù)雖成熟,但獨(dú)立定位終端通常缺乏高效穩(wěn)定的遠(yuǎn)程數(shù)據(jù)同步能力,且定制化開發(fā)周期長、成本高昂。同時,物聯(lián)網(wǎng)技術(shù)的快速發(fā)展為實時位置服務(wù)提供了新思路,但市面上集成定位、低功耗通信與云端可視化的便攜設(shè)備仍顯不足,尤其在惡劣環(huán)境下的可靠性與易用性亟待提升。
為此,本項目設(shè)計了一款基于STM32的便攜式定位器,通過整合高靈敏度GPS模塊、低功耗4G通信模組及物聯(lián)網(wǎng)云平臺,構(gòu)建端到端的實時定位系統(tǒng)。硬件上采用資源豐富且成本優(yōu)化的STM32G030F6P6作為核心,驅(qū)動EC800MCNGB模塊實現(xiàn)MQTT協(xié)議上云,并利用OneNet云端可視化工具生成跨平臺監(jiān)控界面。該方案旨在為單兵或野外工作者提供輕便可靠的定位裝備,實現(xiàn)位置信息的秒級同步與全局可視化,顯著提升指揮調(diào)度效能與人員安全保障水平。
二、設(shè)計實現(xiàn)的功能
(1)支持GPS定位。
(2)支持?jǐn)?shù)據(jù)上云。采用EC800MCNGB模塊,利用MQTT協(xié)議將GPS信息實時上傳到OneNet物聯(lián)網(wǎng)服務(wù)器。
(3)支持手機(jī)可視化顯示定位信息。利用OneNet物聯(lián)網(wǎng)服務(wù)器提供的web可視化組件,設(shè)計web可視化網(wǎng)頁,支持手機(jī)版本和電腦版本。發(fā)布后的鏈接,可以直接瀏覽器打開,查看定位信息,組件里有百度地圖組件可以直接顯示地圖信息,地圖定位。
三、項目硬件模塊組成
(2)聯(lián)網(wǎng)模塊:EC800MCNGB(支持MQTT協(xié)議)
(3)GPS定位模塊:ATGM336H-5N-GPS
四、設(shè)計意義
該設(shè)計有效解決了單兵或戶外作業(yè)人員在復(fù)雜環(huán)境中的實時位置追蹤與安全監(jiān)控需求。通過GPS模塊精準(zhǔn)獲取地理位置信息,結(jié)合低功耗STM32主控與EC800M通信模塊,實現(xiàn)了定位數(shù)據(jù)的可靠采集與即時傳輸。用戶位置信息可實時同步至云端,顯著提升了人員在外勤任務(wù)中的可調(diào)度性與安全保障能力,為緊急救援提供關(guān)鍵數(shù)據(jù)支撐。
利用OneNet物聯(lián)網(wǎng)云平臺與MQTT協(xié)議構(gòu)建數(shù)據(jù)傳輸通道,大幅降低了系統(tǒng)部署復(fù)雜度與運(yùn)維成本。數(shù)據(jù)直接上云的設(shè)計省去了本地服務(wù)器架設(shè)環(huán)節(jié),同時依托云端強(qiáng)大的存儲與計算能力,確保了海量定位信息的高效處理與長期可追溯性。這種云邊協(xié)同架構(gòu)為遠(yuǎn)程監(jiān)控管理提供了穩(wěn)定可靠的技術(shù)基礎(chǔ)。
通過OneNet可視化組件構(gòu)建的跨平臺Web界面,實現(xiàn)了位置信息的直觀動態(tài)呈現(xiàn)。用戶無需安裝專用軟件,在手機(jī)或電腦瀏覽器中即可實時查看人員在地圖上的運(yùn)動軌跡與精確坐標(biāo)。這種輕量化訪問方式極大提升了信息的可及性與決策效率,特別適合移動指揮場景,使管理人員能夠快速響應(yīng)現(xiàn)場變化。
五、設(shè)計思路
系統(tǒng)以STM32G030F6P6微控制器為核心處理單元,通過硬件串口連接ATGM336H-5N-GPS模塊獲取定位數(shù)據(jù)。單片機(jī)實時解析GPS模塊輸出的NMEA協(xié)議數(shù)據(jù),提取經(jīng)緯度、時間、速度等關(guān)鍵定位信息,并進(jìn)行數(shù)據(jù)校驗和格式化處理。
通過另一路硬件串口連接EC800MCNGB通信模塊,STM32采用AT指令集控制該模塊建立移動網(wǎng)絡(luò)連接。利用EC800MCNGB內(nèi)嵌的MQTT協(xié)議棧,將格式化后的GPS數(shù)據(jù)按照設(shè)定頻率上傳至OneNet物聯(lián)網(wǎng)云平臺。數(shù)據(jù)傳輸過程遵循JSON格式規(guī)范,包含設(shè)備ID、定位坐標(biāo)及時間戳等必要字段。
在OneNet云平臺側(cè),基于其可視化組件構(gòu)建多端適配的監(jiān)控界面。通過拖拽式配置百度地圖組件,實現(xiàn)定位坐標(biāo)的實時映射顯示。利用數(shù)據(jù)流組件動態(tài)展示歷史軌跡,并設(shè)置閾值告警功能。最終生成可通過瀏覽器直接訪問的響應(yīng)式網(wǎng)頁,確保在手機(jī)和PC端均可流暢查看定位信息。
設(shè)備采用低功耗設(shè)計策略:STM32在數(shù)據(jù)上傳間隙進(jìn)入休眠模式,GPS模塊根據(jù)定位需求動態(tài)切換工作狀態(tài)。通信模塊在網(wǎng)絡(luò)異常時自動執(zhí)行指數(shù)退避重連機(jī)制,確保定位數(shù)據(jù)的可靠傳輸。整個系統(tǒng)通過鋰電池供電,滿足便攜設(shè)備的續(xù)航要求。
六、框架圖
框架說明:
- 硬件層
- STM32G030F6P6 主控通過串口連接 GPS 和 4G 模塊
- ATGM336H-5N 提供經(jīng)緯度定位數(shù)據(jù)
- EC800MCNGB 通過 MQTT 協(xié)議上傳數(shù)據(jù)
- 云平臺層
- OneNet 接收/存儲 MQTT 數(shù)據(jù)
- 提供 Web 可視化組件和地圖服務(wù)
- 用戶層
- 跨平臺 Web 頁面(自適應(yīng)手機(jī)/電腦)
- 百度地圖組件實時顯示單兵位置軌跡
七、系統(tǒng)總體設(shè)計
系統(tǒng)總體設(shè)計以STM32G030F6P6微控制器為核心,負(fù)責(zé)協(xié)調(diào)各模塊工作并處理數(shù)據(jù)。該芯片通過UART串口與EC800MCNGB通信模塊連接,利用該模塊的蜂窩網(wǎng)絡(luò)能力接入互聯(lián)網(wǎng),同時通過另一路UART串口與ATGM336H-5N-GPS模塊通信,實時接收并解析NMEA格式的衛(wèi)星定位數(shù)據(jù),獲取經(jīng)緯度、時間等關(guān)鍵信息。
定位數(shù)據(jù)處理后,由STM32控制EC800MCNGB模塊通過MQTT協(xié)議將結(jié)構(gòu)化位置數(shù)據(jù)上傳至中國移動OneNet物聯(lián)網(wǎng)云平臺。數(shù)據(jù)上傳遵循平臺定義的Topic和JSON格式規(guī)范,確保信息準(zhǔn)確傳輸至云端數(shù)據(jù)庫進(jìn)行存儲和管理。
在云端,OneNet平臺提供的數(shù)據(jù)可視化引擎被用于構(gòu)建監(jiān)控界面。開發(fā)者使用平臺內(nèi)置的Web組件(如百度地圖控件、數(shù)據(jù)流圖表)設(shè)計適配手機(jī)與電腦瀏覽器的可視化頁面。該頁面動態(tài)接收并展示從設(shè)備上傳的GPS定位信息,在地圖上實時標(biāo)記設(shè)備位置軌跡,形成直觀的定位監(jiān)控視圖。
用戶通過瀏覽器訪問發(fā)布的網(wǎng)頁鏈接,即可跨平臺查看便攜式定位器的實時位置與歷史運(yùn)動路徑,無需額外安裝軟件。整個系統(tǒng)實現(xiàn)了從終端數(shù)據(jù)采集、無線傳輸、云端存儲到可視化展示的閉環(huán)功能。
八、系統(tǒng)功能總結(jié)
功能 | 描述 |
---|---|
GPS定位 | 使用ATGM336H-5N-GPS模塊接收衛(wèi)星定位信息,實現(xiàn)精準(zhǔn)位置檢測。 |
數(shù)據(jù)上傳 | 通過EC800MCNGB模塊,利用MQTT協(xié)議將GPS信息實時上傳至OneNet物聯(lián)網(wǎng)服務(wù)器,實現(xiàn)數(shù)據(jù)上云。 |
可視化顯示 | 利用OneNet物聯(lián)網(wǎng)服務(wù)器提供的web可視化組件設(shè)計網(wǎng)頁,支持手機(jī)和電腦瀏覽器訪問,集成百度地圖組件實時顯示地圖定位信息。 |
設(shè)計的各個功能模塊描述
該項目設(shè)計的各個功能模塊描述如下:
定位信息采集模塊
由ATGM336H-5N GPS模塊實時接收衛(wèi)星信號,通過串口向STM32G030F6P6主控芯片輸出NMEA格式的原始定位數(shù)據(jù)。主控芯片對數(shù)據(jù)進(jìn)行解析,提取經(jīng)緯度、時間、速度等關(guān)鍵定位信息,并進(jìn)行數(shù)據(jù)格式規(guī)范化處理。
無線通信與數(shù)據(jù)上傳模塊
采用EC800MCNGB蜂窩通信模塊,通過UART接口與STM32主控連接。主控通過AT指令控制該模塊接入移動網(wǎng)絡(luò),并基于MQTT協(xié)議與OneNet物聯(lián)網(wǎng)云平臺建立安全連接。解析后的GPS定位信息被封裝成JSON格式,通過EC800M模塊定時或觸發(fā)式上傳至OneNet指定的MQTT主題。
云端數(shù)據(jù)存儲與轉(zhuǎn)發(fā)模塊
OneNet物聯(lián)網(wǎng)云平臺作為核心服務(wù)器,接收并存儲來自設(shè)備的定位數(shù)據(jù)流。平臺提供MQTT broker服務(wù),負(fù)責(zé)設(shè)備認(rèn)證、數(shù)據(jù)持久化及消息路由,確保定位信息實時可靠地存儲于云端數(shù)據(jù)庫,并為后續(xù)可視化模塊提供數(shù)據(jù)接口。
可視化顯示模塊
利用OneNet內(nèi)置的可視化組件工具,構(gòu)建適配手機(jī)與電腦瀏覽器的Web監(jiān)控頁面。通過配置百度地圖組件,動態(tài)顯示設(shè)備上傳的經(jīng)緯度坐標(biāo),實現(xiàn)位置標(biāo)記、軌跡繪制及地圖聯(lián)動功能。用戶通過訪問發(fā)布的網(wǎng)頁鏈接,可實時查看設(shè)備移動路徑與當(dāng)前位置信息,形成端到端的定位監(jiān)控系統(tǒng)。
九、模塊代碼設(shè)計
以下為基于STM32G030F6P6的便攜式定位器完整代碼設(shè)計(寄存器開發(fā)方式):
#include "stm32g0xx.h"
// 硬件定義
#define EC800M_PWRKEY_PIN GPIO_ODR_OD0 // PC0控制模組電源
#define GPS_EN_PIN GPIO_ODR_OD1 // PC1控制GPS電源
// USART1 - EC800M通信
void USART1_Init(void) {
RCC->IOPENR |= RCC_IOPENR_GPIOAEN; // 開啟GPIOA時鐘
RCC->APBENR2 |= RCC_APBENR2_USART1EN; // 開啟USART1時鐘
// 配置PA9(TX), PA10(RX)
GPIOA->MODER &= ~(GPIO_MODER_MODE9_Msk | GPIO_MODER_MODE10_Msk);
GPIOA->MODER |= (2 << GPIO_MODER_MODE9_Pos) | (2 << GPIO_MODER_MODE10_Pos);
GPIOA->AFR[1] |= (1 << (4*(9-8))) | (1 << (4*(10-8))); // AF1
USART1->BRR = 64000000 / 115200; // 64MHz時鐘,115200波特率
USART1->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_UE; // 使能收發(fā)
}
// USART2 - GPS通信
void USART2_Init(void) {
RCC->IOPENR |= RCC_IOPENR_GPIOAEN; // 開啟GPIOA時鐘
RCC->APBENR1 |= RCC_APBENR1_USART2EN; // 開啟USART2時鐘
// 配置PA2(TX), PA3(RX)
GPIOA->MODER &= ~(GPIO_MODER_MODE2_Msk | GPIO_MODER_MODE3_Msk);
GPIOA->MODER |= (2 << GPIO_MODER_MODE2_Pos) | (2 << GPIO_MODER_MODE3_Pos);
GPIOA->AFR[0] |= (1 << (4*2)) | (1 << (4*3)); // AF1
USART2->BRR = 64000000 / 9600; // GPS默認(rèn)波特率9600
USART2->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_UE;
}
// 系統(tǒng)時鐘初始化(HSI 64MHz)
void SystemClock_Config(void) {
RCC->CR |= RCC_CR_HSION; // 開啟HSI
while(!(RCC->CR & RCC_CR_HSIRDY));// 等待HSI就緒
RCC->CR &= ~RCC_CR_PLLON; // 關(guān)閉PLL
while(RCC->CR & RCC_CR_PLLRDY); // 等待PLL停止
// 配置PLL (HSI/2 -> 8MHz, *16 = 128MHz, /2 = 64MHz)
RCC->PLLCFGR = (1 << RCC_PLLCFGR_PLLSRC_Pos) | (15 << RCC_PLLCFGR_PLLN_Pos) |
(0 << RCC_PLLCFGR_PLLM_Pos) | (1 << RCC_PLLCFGR_PLLR_Pos);
RCC->CR |= RCC_CR_PLLON; // 開啟PLL
while(!(RCC->CR & RCC_CR_PLLRDY));// 等待PLL鎖定
FLASH->ACR |= FLASH_ACR_LATENCY; // Flash等待狀態(tài)
RCC->CFGR |= RCC_CFGR_SW_PLL; // 切換系統(tǒng)時鐘到PLL
while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL); // 等待切換完成
SystemCoreClock = 64000000; // 更新系統(tǒng)時鐘變量
}
// 發(fā)送字符串(阻塞式)
void USART_SendString(USART_TypeDef* USARTx, const char* str) {
while(*str) {
while(!(USARTx->ISR & USART_ISR_TXE)); // 等待發(fā)送緩沖區(qū)空
USARTx->TDR = *str++;
}
}
// GPS數(shù)據(jù)解析
uint8_t GPS_Parse(char* gps_data, float* lat, float* lon) {
// 示例解析GPRMC語句:$GPRMC,085120.307,A,2234.8946,N,11354.3683,E,0.00,0.00,220413,,*1A
char* token = strtok(gps_data, ",");
if(strcmp(token, "$GPRMC") != 0) return 0;
for(int i=0; i<9; i++) token = strtok(NULL, ",");
if(token[0] != 'A') return 0; // 無效定位
token = strtok(NULL, ","); // 緯度
*lat = atof(token) / 100.0;
token = strtok(NULL, ","); // 北緯/南緯
if(*token == 'S') *lat = -*lat;
token = strtok(NULL, ","); // 經(jīng)度
*lon = atof(token) / 100.0;
token = strtok(NULL, ","); // 東經(jīng)/西經(jīng)
if(*token == 'W') *lon = -*lon;
return 1;
}
// MQTT上傳數(shù)據(jù)
void MQTT_Publish(float lat, float lon) {
char mqtt_msg[128];
sprintf(mqtt_msg, "AT+QMTPUB=0,0,0,0,"gps_data","{"lat":%.6f,"lon":%.6f}"rn", lat, lon);
USART_SendString(USART1, mqtt_msg);
// 等待響應(yīng)處理(簡化)
while(!(USART1->ISR & USART_ISR_RXNE));
}
int main(void) {
SystemClock_Config();
// GPIO初始化
RCC->IOPENR |= RCC_IOPENR_GPIOCEN;
GPIOC->MODER |= GPIO_MODER_MODE0_0 | GPIO_MODER_MODE1_0; // PC0,PC1輸出模式
// 啟動模塊
GPIOC->ODR |= EC800M_PWRKEY_PIN | GPS_EN_PIN;
for(volatile int i=0; i<1000000; i++); // 延時等待啟動
USART1_Init(); // EC800M模塊初始化
USART2_Init(); // GPS模塊初始化
// EC800M初始化序列
USART_SendString(USART1, "ATrn"); // 測試AT
USART_SendString(USART1, "AT+QMTCFG="aliauth",0,"設(shè)備ID","產(chǎn)品ID","鑒權(quán)信息"rn");
USART_SendString(USART1, "AT+QMTOPEN=0,"mqtt.heclouds.com",1883rn");
USART_SendString(USART1, "AT+QMTCONN=0,"設(shè)備名稱"rn");
char gps_buffer[256];
uint16_t idx = 0;
float latitude, longitude;
while(1) {
// 接收GPS數(shù)據(jù)
if(USART2->ISR & USART_ISR_RXNE) {
char c = USART2->RDR;
if(c == 'n') {
gps_buffer[idx] = '?';
if(GPS_Parse(gps_buffer, &latitude, &longitude)) {
MQTT_Publish(latitude, longitude); // 上傳有效定位
}
idx = 0;
} else if(c != 'r' && idx < 255) {
gps_buffer[idx++] = c;
}
}
// 10秒上傳周期
for(volatile int i=0; i<1000000; i++); // 簡單延時
}
}
代碼說明:
- 硬件接口:
- USART1:連接EC800M模塊(115200bps)
- USART2:連接ATGM336H GPS模塊(9600bps)
- PC0:控制EC800M電源
- PC1:控制GPS電源
- 關(guān)鍵功能:
- GPS數(shù)據(jù)解析:處理NMEA協(xié)議的GPRMC語句
- MQTT通信:通過AT指令連接OneNet云平臺
- 數(shù)據(jù)格式:JSON格式上傳經(jīng)緯度({“l(fā)at”:22.123456,“l(fā)on”:113.654321})
- OneNet對接參數(shù):
- 服務(wù)器:mqtt.heclouds.com:1883
- 需要替換參數(shù):設(shè)備ID、產(chǎn)品ID、鑒權(quán)信息
- 工作流程:
- 上電初始化各模塊
- 建立MQTT云連接
- 持續(xù)解析GPS數(shù)據(jù)
- 每10秒上傳有效定位信息
實際使用需根據(jù)OneNet平臺具體參數(shù)修改MQTT連接指令,并優(yōu)化錯誤處理機(jī)制。GPS解析需根據(jù)實際輸出語句調(diào)整處理邏輯。
十、項目核心代碼
以下是基于STM32G030F6P6的便攜式定位器main.c
完整代碼,采用寄存器方式開發(fā),整合了GPS數(shù)據(jù)解析和EC800M模塊的MQTT通信功能:
#include "stm32g0xx.h"
#include <string.h>
// 硬件定義
#define EC800M_USART USART1
#define GPS_USART USART2
#define LED_PIN (1 << 13) // PC13
#define EC800M_PWRKEY_PIN (1 << 0) // PB0
// 全局變量
volatile uint8_t gps_buffer[128];
volatile uint8_t gps_index = 0;
volatile uint8_t gps_data_ready = 0;
char mqtt_payload[100];
// 串口初始化
void USART_Init(USART_TypeDef *USARTx, uint32_t baudrate) {
if (USARTx == USART1) {
RCC->IOPENR |= RCC_IOPENR_GPIOAEN; // 使能GPIOA時鐘
RCC->APBENR2 |= RCC_APBENR2_USART1EN; // 使能USART1時鐘
GPIOA->MODER &= ~(GPIO_MODER_MODE9 | GPIO_MODER_MODE10); // 清除PA9/PA10模式
GPIOA->MODER |= (0x2 << (9 * 2)) | (0x2 << (10 * 2)); // 復(fù)用模式
GPIOA->AFR[1] |= (0x1 << ((9 - 8) * 4)) | (0x1 << ((10 - 8) * 4)); // AF1
} else if (USARTx == USART2) {
RCC->IOPENR |= RCC_IOPENR_GPIOAEN;
RCC->APBENR1 |= RCC_APBENR1_USART2EN;
GPIOA->MODER &= ~(GPIO_MODER_MODE2 | GPIO_MODER_MODE3);
GPIOA->MODER |= (0x2 << (2 * 2)) | (0x2 << (3 * 2));
GPIOA->AFR[0] |= (0x1 << (2 * 4)) | (0x1 << (3 * 4)); // AF1
}
USARTx->BRR = SystemCoreClock / baudrate; // 波特率設(shè)置
USARTx->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_UE | USART_CR1_RXNEIE;
USARTx->CR2 = 0;
USARTx->CR3 = 0;
if (USARTx == USART2) {
NVIC_EnableIRQ(USART2_IRQn);
NVIC_SetPriority(USART2_IRQn, 0);
}
}
// 發(fā)送字符串
void USART_SendString(USART_TypeDef *USARTx, const char *str) {
while (*str) {
while (!(USARTx->ISR & USART_ISR_TXE));
USARTx->TDR = *str++;
}
}
// GPS數(shù)據(jù)處理函數(shù)
void GPS_ProcessData(const char *data) {
if (strstr(data, "$GPGGA")) {
char *token = strtok((char*)data, ",");
int field = 0;
float latitude = 0.0, longitude = 0.0;
uint8_t valid = 0;
while (token != NULL) {
if (field == 2) latitude = atof(token);
if (field == 3 && *token == 'S') latitude = -latitude;
if (field == 4) longitude = atof(token);
if (field == 5 && *token == 'W') longitude = -longitude;
if (field == 6) valid = (*token > '0');
token = strtok(NULL, ",");
field++;
}
if (valid) {
sprintf(mqtt_payload, "{"lat":%.6f,"lon":%.6f}", latitude, longitude);
}
}
}
// EC800M模塊初始化
void EC800M_Init(void) {
RCC->IOPENR |= RCC_IOPENR_GPIOBEN; // 使能GPIOB時鐘
GPIOB->MODER &= ~GPIO_MODER_MODE0; // PB0輸出模式
GPIOB->MODER |= GPIO_MODER_MODE0_0;
// EC800M開機(jī)時序
GPIOB->ODR &= ~EC800M_PWRKEY_PIN; // 拉低PWRKEY
for (volatile int i = 0; i < 1000000; i++); // 延時1s
GPIOB->ODR |= EC800M_PWRKEY_PIN; // 釋放PWRKEY
for (volatile int i = 0; i < 2000000; i++); // 等待模塊啟動
// 發(fā)送AT指令配置模塊
USART_SendString(EC800M_USART, "AT+CGATT=1rn"); // 附著網(wǎng)絡(luò)
for (volatile int i = 0; i < 1000000; i++);
USART_SendString(EC800M_USART, "AT+QMTCONN="onenet","device_id","api_key"rn"); // MQTT連接
}
// LED初始化
void LED_Init(void) {
RCC->IOPENR |= RCC_IOPENR_GPIOCEN; // 使能GPIOC時鐘
GPIOC->MODER &= ~GPIO_MODER_MODE13; // PC13輸出模式
GPIOC->MODER |= GPIO_MODER_MODE13_0;
}
// USART2中斷服務(wù)函數(shù)
void USART2_IRQHandler(void) {
if (USART2->ISR & USART_ISR_RXNE) {
uint8_t data = USART2->RDR;
if (data == 'n') {
gps_buffer[gps_index] = '?';
gps_data_ready = 1;
gps_index = 0;
} else if (gps_index < sizeof(gps_buffer) - 1) {
gps_buffer[gps_index++] = data;
}
}
}
int main(void) {
// 系統(tǒng)時鐘初始化 (使用HSI 16MHz)
RCC->CR |= RCC_CR_HSION;
while (!(RCC->CR & RCC_CR_HSIRDY));
FLASH->ACR = FLASH_ACR_LATENCY_1; // Flash等待狀態(tài)
RCC->CFGR = RCC_CFGR_SW_HSI; // HSI作為系統(tǒng)時鐘
SystemCoreClock = 16000000;
LED_Init();
USART_Init(EC800M_USART, 115200); // EC800M串口
USART_Init(GPS_USART, 9600); // GPS串口
EC800M_Init();
while (1) {
if (gps_data_ready) {
GPS_ProcessData((const char*)gps_buffer);
// 發(fā)送MQTT數(shù)據(jù)
char cmd[150];
sprintf(cmd, "AT+QMTPUB=0,0,0,0,"gps_topic",%drn", strlen(mqtt_payload));
USART_SendString(EC800M_USART, cmd);
for (volatile int i = 0; i < 10000; i++);
USART_SendString(EC800M_USART, mqtt_payload);
GPIOC->ODR ^= LED_PIN; // 閃爍LED指示發(fā)送
gps_data_ready = 0;
}
// 心跳包每30秒發(fā)送一次
static uint32_t last_sent = 0;
if (SystemCoreClock / 1000 * 30 < (DWT->CYCCNT - last_sent)) {
USART_SendString(EC800M_USART, "AT+QMTPUB=0,0,0,0,"heartbeat",2rnOK");
last_sent = DWT->CYCCNT;
GPIOC->ODR ^= LED_PIN;
}
}
}
代碼說明:
- 硬件配置:
- USART1用于EC800M通信 (115200bps)
- USART2用于GPS模塊 (9600bps)
- PC13控制LED狀態(tài)指示
- PB0控制EC800M的電源鍵
- 關(guān)鍵功能:
- GPS數(shù)據(jù)通過中斷接收,解析GPGGA語句獲取經(jīng)緯度
- EC800M模塊通過AT指令連接OneNet MQTT服務(wù)器
- 定位數(shù)據(jù)打包為JSON格式通過MQTT發(fā)布
- LED閃爍指示數(shù)據(jù)發(fā)送和心跳包
- 通信協(xié)議:
- MQTT主題:
gps_topic
(定位數(shù)據(jù)) 和heartbeat
(心跳包) - 數(shù)據(jù)格式:
{"lat":22.123456,"lon":113.123456}
- MQTT主題:
- 配置注意:
- 替換
AT+QMTCONN
中的device_id
和api_key
為實際OneNet設(shè)備憑證 - 根據(jù)實際硬件調(diào)整GPIO引腳定義
- 替換
十一、總結(jié)
本項目成功設(shè)計并實現(xiàn)了一款基于STM32單片機(jī)的便攜式定位器,專為單兵定位應(yīng)用而開發(fā)。通過集成GPS定位技術(shù)和物聯(lián)網(wǎng)通信,系統(tǒng)能夠?qū)崟r采集位置信息并同步到遠(yuǎn)程平臺,滿足高效、可靠的戶外定位需求。
系統(tǒng)核心功能包括GPS定位、數(shù)據(jù)上云和可視化顯示。借助ATGM336H-5N-GPS模塊接收衛(wèi)星信號,實現(xiàn)精確位置檢測;利用EC800MCNGB模塊通過MQTT協(xié)議將數(shù)據(jù)實時上傳至OneNet物聯(lián)網(wǎng)服務(wù)器;用戶可通過OneNet提供的web可視化組件,在手機(jī)或電腦瀏覽器中直觀查看地圖定位信息,確保了定位數(shù)據(jù)的便捷訪問和實時監(jiān)控。
硬件選型以高性能和穩(wěn)定性為核心,主控芯片采用STM32G030F6P6處理核心數(shù)據(jù),聯(lián)網(wǎng)模塊EC800MCNGB保障了可靠的互聯(lián)網(wǎng)連接,OneNet服務(wù)器及其可視化組件簡化了后端管理。整體設(shè)計實現(xiàn)了便攜性、低功耗和用戶友好性,為單兵作戰(zhàn)或野外作業(yè)提供了實用的定位解決方案。