• 方案介紹
  • 附件下載
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

基于STM32設(shè)計的便攜式定位器

4小時前
67
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

更多詳細(xì)資料請聯(lián)系.docx

共1個文件

一、項目開發(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ā)布后的鏈接,可以直接瀏覽器打開,查看定位信息,組件里有百度地圖組件可以直接顯示地圖信息,地圖定位。

三、項目硬件模塊組成

(1)主控芯片:STM32G030F6P6單片機(jī)

(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ù)航要求。

六、框架圖

框架說明:

  1. 硬件層
    • STM32G030F6P6 主控通過串口連接 GPS 和 4G 模塊
    • ATGM336H-5N 提供經(jīng)緯度定位數(shù)據(jù)
    • EC800MCNGB 通過 MQTT 協(xié)議上傳數(shù)據(jù)
  2. 云平臺層
    • OneNet 接收/存儲 MQTT 數(shù)據(jù)
    • 提供 Web 可視化組件和地圖服務(wù)
  3. 用戶層
    • 跨平臺 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++);  // 簡單延時
    }
}

代碼說明:

  1. 硬件接口
    • USART1:連接EC800M模塊(115200bps)
    • USART2:連接ATGM336H GPS模塊(9600bps)
    • PC0:控制EC800M電源
    • PC1:控制GPS電源
  2. 關(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})
  3. OneNet對接參數(shù)
    • 服務(wù)器:mqtt.heclouds.com:1883
    • 需要替換參數(shù):設(shè)備ID、產(chǎn)品ID、鑒權(quán)信息
  4. 工作流程
    • 上電初始化各模塊
    • 建立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;
        }
    }
}

代碼說明:

  1. 硬件配置
    • USART1用于EC800M通信 (115200bps)
    • USART2用于GPS模塊 (9600bps)
    • PC13控制LED狀態(tài)指示
    • PB0控制EC800M的電源鍵
  2. 關(guān)鍵功能
    • GPS數(shù)據(jù)通過中斷接收,解析GPGGA語句獲取經(jīng)緯度
    • EC800M模塊通過AT指令連接OneNet MQTT服務(wù)器
    • 定位數(shù)據(jù)打包為JSON格式通過MQTT發(fā)布
    • LED閃爍指示數(shù)據(jù)發(fā)送和心跳包
  3. 通信協(xié)議
    • MQTT主題:gps_topic (定位數(shù)據(jù)) 和 heartbeat (心跳包)
    • 數(shù)據(jù)格式:{"lat":22.123456,"lon":113.123456}
  4. 配置注意
    • 替換AT+QMTCONN中的device_idapi_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è)提供了實用的定位解決方案。

  • 更多詳細(xì)資料請聯(lián)系.docx
    下載
意法半導(dǎo)體

意法半導(dǎo)體

意法半導(dǎo)體(ST)集團(tuán)于1987年6月成立,是由意大利的SGS微電子公司和法國Thomson半導(dǎo)體公司合并而成。1998年5月,SGS-THOMSON Microelectronics將公司名稱改為意法半導(dǎo)體有限公司。意法半導(dǎo)體是世界最大的半導(dǎo)體公司之一,公司銷售收入在半導(dǎo)體工業(yè)五大高速增長市場之間分布均衡(五大市場占2007年銷售收入的百分比):通信(35%),消費(fèi)(17%),計算機(jī)(16%),汽車(16%),工業(yè)(16%)。 據(jù)最新的工業(yè)統(tǒng)計數(shù)據(jù),意法半導(dǎo)體是全球第五大半導(dǎo)體廠商,在很多市場居世界領(lǐng)先水平。例如,意法半導(dǎo)體是世界第一大專用模擬芯片和電源轉(zhuǎn)換芯片制造商,世界第一大工業(yè)半導(dǎo)體和機(jī)頂盒芯片供應(yīng)商,而且在分立器件、手機(jī)相機(jī)模塊和車用集成電路領(lǐng)域居世界前列.

意法半導(dǎo)體(ST)集團(tuán)于1987年6月成立,是由意大利的SGS微電子公司和法國Thomson半導(dǎo)體公司合并而成。1998年5月,SGS-THOMSON Microelectronics將公司名稱改為意法半導(dǎo)體有限公司。意法半導(dǎo)體是世界最大的半導(dǎo)體公司之一,公司銷售收入在半導(dǎo)體工業(yè)五大高速增長市場之間分布均衡(五大市場占2007年銷售收入的百分比):通信(35%),消費(fèi)(17%),計算機(jī)(16%),汽車(16%),工業(yè)(16%)。 據(jù)最新的工業(yè)統(tǒng)計數(shù)據(jù),意法半導(dǎo)體是全球第五大半導(dǎo)體廠商,在很多市場居世界領(lǐng)先水平。例如,意法半導(dǎo)體是世界第一大專用模擬芯片和電源轉(zhuǎn)換芯片制造商,世界第一大工業(yè)半導(dǎo)體和機(jī)頂盒芯片供應(yīng)商,而且在分立器件、手機(jī)相機(jī)模塊和車用集成電路領(lǐng)域居世界前列.收起

查看更多

相關(guān)推薦