目錄
項目概述
硬件平臺
目錄結構
傳感器模塊詳解
線程架構
構建與燒錄
配置說明
數據流說明
注意事項
文件依賴關系
代碼倉庫
申請試用開發板
1 項目概述
本項目基于NXP FRDM-MCXA156開發板,運行RT-Thread實時操作系統,實現多傳感器數據采集并通過ESP01S WiFi模塊上報至華為云IoT平臺。文末掃碼申請試用開發板。

1.1 主要功能

1.2 系統架構
+------------------+ +------------------+ +------------------+| 傳感器層 | | 應用層 | | 通信層 |+------------------+ +------------------+ +------------------+|drv_mq2.c |--> | MQ2_app.c | | ||drv_dht11.c |--> | dht11_app.c | --> | esp_app.c | --> 華為云IoT|drv_max30102.c |--> | max30102_app.c | | (MQTT上報) ||(UART接收) |--> | ATGM336H_app.c | | |+------------------+ +------------------+ +------------------+
2 硬件平臺
2.1 主控芯片
型號: NXP MCXA156
內核: ARM Cortex-M33
主頻: 96 MHz
Flash: 1 MB
RAM: 128 KB
2.2 引腳分配

3 目錄結構
frdm-mcxa156/├── applications/ # 應用層代碼│ ├── main.c # 主函數入口│ ├── mydefine.h # 通用頭文件定義│ ││ ├── drv_dht11.c/h # DHT11 驅動層│ ├── dht11_app.c/h # DHT11 應用層│ ││ ├── drv_mq2.c/h # MQ2 驅動層│ ├── MQ2_app.c/h # MQ2 應用層│ ││ ├── drv_max30102.c/h # MAX30102 驅動層│ ├── max30102_app.c/h # MAX30102 應用層│ ││ ├── ATGM336H_app.c/h # GPS模塊應用層│ ││ ├── esp_app.c/h # ESP01S WiFi/MQTT通信│ ││ ├── adc_app.c/h # ADC采集封裝│ └── uart_app.c/h # 串口工具函數│├── board/ # 板級支持包│ ├── board.c/h # 板級初始化│ ├── Kconfig # 硬件配置菜單│ ├── MCUX_Config/ # NXP MCUXpresso配置│ │ └── board/│ │ ├── clock_config.c/h # 時鐘配置│ │ └── pin_mux.c/h # 引腳復用配置│ └── linker_scripts/ # 鏈接腳本│├── packages/ # RT-Thread軟件包│ ├── nxp-mcx-cmsis-latest/ # NXP CMSIS支持│ └── nxp-mcx-series-latest/ # NXP MCX系列驅動│├── .config # RT-Thread配置文件├── rtconfig.h # RT-Thread配置頭文件├── Kconfig # 頂層配置菜單├── SConstruct # SCons構建主文件├── project.uvprojx # Keil MDK工程文件└── rtthread.elf/bin # 編譯輸出文件
4 傳感器模塊詳解
4.1 MQ2 氣體傳感器
文件:drv_mq2.c/h,MQ2_app.c/h
功能:檢測甲烷(CH4)等可燃氣體濃度
數據結構:
typedefstruct { rt_base_tdopin; // 數字輸出引腳 floatadc_val; // ADC原始值 floatch4ppm; // 甲烷濃度 (ppm)}mq2_device_t;
API接口:
// 初始化MQ2設備rt_err_tmq2_init(mq2_device_t*dev,rt_base_tdopin);// 讀取氣體濃度mq2_result_tMQ2_GetPmm(mq2_device_t*dev);// 獲取當前甲烷濃度 (應用層接口)floatmq2_get_ch4ppm(void);
全局變量:g_mq2_dev- MQ2設備對象
4.2 DHT11 溫濕度傳感器
文件:drv_dht11.c/h,dht11_app.c/h
功能:檢測環境溫度和濕度
數據結構:
typedefstruct { rt_base_tpin; // 數據引腳 rt_uint8_thumidity; // 濕度整數部分 rt_uint8_ttemperature;// 溫度整數部分}dht11_device_t;
API接口:
// 初始化DHT11設備rt_err_tdht11_init(dht11_device_t*dev,rt_base_tpin);// 讀取溫濕度數據dht11_result_tdht11_read(dht11_device_t*dev,rt_uint8_t*temp,rt_uint8_t*humi);// 獲取當前溫度 (應用層接口)rt_uint8_tdht11_get_temperature(void);// 獲取當前濕度 (應用層接口)rt_uint8_tdht11_get_humidity(void);
全局變量:
g_dht11_dev- DHT11設備對象
g_dht11_temperature- 最新溫度值
g_dht11_humidity- 最新濕度值
4.3 MAX30102 心率血氧傳感器
文件:drv_max30102.c/h,max30102_app.c/h
功能:通過紅光和紅外光檢測心率和血氧
數據結構:
typedefstruct { structrt_i2c_bus_device *i2c_bus; // I2C總線句柄 rt_mutex_tlock; // 互斥鎖 rt_uint8_taddr; // I2C地址 rt_bool_tinitialized; // 初始化標志}max30102_device_t;
API接口:
// 初始化MAX30102設備max30102_device_t*max30102_init(constchar *i2c_bus_name);// 從FIFO讀取LED數據rt_err_tmax30102_read_fifo(max30102_device_t*dev, rt_uint32_t*red_led, rt_uint32_t*ir_led);// 獲取心率 (應用層接口)rt_uint32_tmax30102_get_heart_rate(void);
全局變量:
g_max30102_red_led- 紅光LED原始值
g_max30102_ir_led- 紅外LED原始值
g_max30102_heart_rate- 心率估算值
工作模式: 支持中斷模式和輪詢模式 (通過USE_INTERRUPT_MODE宏切換)
4.4 ATGM336H GPS模塊
文件:ATGM336H_app.c/h
功能: 獲取GPS定位信息 (經度、緯度)
通信接口: UART2 (波特率: 9600)
數據結構:
typedefstruct { charGPS_Buffer[80]; // GPS原始數據緩沖 charisGetData; // 數據接收標志 charisParseData; // 數據解析標志 charUTCTime[11]; // UTC時間 charlatitude[11]; // 緯度字符串 charN_S[2]; // 南北半球 charlongitude[12]; // 經度字符串 charE_W[2]; // 東西半球 charisUsefull; // 定位有效標志} _SaveData;typedefstruct { floatlatitude; // 緯度 (十進制度) floatlongitude; // 經度 (十進制度) charN_S; // 南北半球標識 charE_W; // 東西半球標識} LatitudeAndLongitude_s;
全局變量:
Save_Data- GPS原始數據結構
g_LatAndLongData- 解析后的經緯度數據
latitude, longitude- 全局經緯度變量
4.5 ESP01S WiFi模塊
文件:esp_app.c/h
功能:通過MQTT協議將傳感器數據上報至華為云IoT平臺
通信接口:UART1
云平臺配置(定義在esp_app.h):
#defineWIFI_NAME "LP11"#defineWIFI_PWD "123456aa"#defineHUAWEI_MQTT_ADDRESS "e8b7ac5772.st1.iotda-device.cn-east-3.myhuaweicloud.com"#defineHUAWEI_MQTT_PORT 1883
API接口:
// 發送AT指令voidesp_send(constchar *data);// 上報傳感器數據到云端intesp_report(floatdensity,inthr,inttemp,inthumi);
數據上報格式 (MQTT JSON):
{ "services":[{ "service_id":"BasedData", "properties":{ "density":100.5, "heart_rate":75, "temperature":25, "humidity":60 } }]}
5 線程架構
系統采用多線程架構,各傳感器獨立采集:

6 構建與燒錄
6.1 使用Keil MDK
打開project.uvprojx工程文件
編譯:Project -> Build Target或F7
燒錄:Flash -> Download或F8
6.2 使用SCons (命令行)
# 配置scons--menuconfig# 編譯scons# 清理scons -c
7 配置說明
7.1 RT-Thread配置
通過menuconfig或直接編輯.config文件配置:
# 串口配置CONFIG_BSP_USING_UART0=y # 調試串口CONFIG_BSP_USING_UART1=y # ESP01SCONFIG_BSP_USING_UART2=y # GPS模塊# I2C配置CONFIG_BSP_USING_I2C0=y # MAX30102# ADC配置CONFIG_BSP_USING_ADC0_CH0=y# MQ2模擬輸出
7.2 傳感器引腳配置
在各應用文件中修改引腳定義:
// MQ2_app.c#defineMQ2_DATA_PIN ((3*32)+7) // P3_7// dht11_app.c#defineDHT11_DATA_PIN ((3*32)+6) // P3_6// max30102_app.c#defineMAX30102_INT_PIN ((1*32)+13) // P1_13
8 數據流說明
[傳感器采集]-->[全局變量更新]-->[esp_thread_entry讀取]-->[esp_report上報]-->[華為云]時序:1. 各傳感器線程周期性采集數據,更新全局變量2. ESP線程在主循環中讀取全局變量3. 調用esp_report() 構造MQTT消息并發送4. 華為云IoT平臺接收并存儲數據
9 注意事項
DHT11: 兩次讀取間隔至少2秒
MQ2: 上電后需預熱穩定期
MAX30102: I2C通信需要較大棧空間
GPS: 首次定位需要較長時間,室內可能無法定位
ESP01S: WiFi連接需要5秒等待,MQTT連接需要3秒等待
10 文件依賴關系
mydefine.h (基礎定義) ├── drv_dht11.h ├── drv_mq2.h ├── drv_max30102.h │ ├── dht11_app.h --> dht11_app.c ├── MQ2_app.h --> MQ2_app.c ├── max30102_app.h--> max30102_app.c ├── ATGM336H_app.h--> ATGM336H_app.c │ └── esp_app.h --> esp_app.c (引用所有傳感器數據)
11 代碼倉庫
倉庫地址:https://github.com/drifting-cloudlet/smart_helmet
演示視頻已放在對應倉庫的github releases上,為對應的zip文件。
-
傳感器
+關注
關注
2576文章
55108瀏覽量
791716 -
操作系統
+關注
關注
37文章
7405瀏覽量
129373 -
RT-Thread
+關注
關注
32文章
1618瀏覽量
44930 -
FRDM
+關注
關注
1文章
22瀏覽量
5466
發布評論請先 登錄
恩智浦FRDM-MCXA153 RT-Thread開發實戰(六):I2C總線開發與應用
風洞懸浮球:基于RT-Thread與MCXA156的簡單控制實踐 | 技術集結
智能門鎖:基于RT-Thread與FRDM-MCXA156的多外設嵌入式實踐 | 技術集結
基于RT-Thread與MCXA156的USB HID游戲手柄設計與實現 | 技術集結
FRDM-MCXA156 LPUART1不工作是哪里出了問題?
【RT-Thread作品秀】精選作品集,來看看大佬是怎么玩轉RT-Thread的
RT-Thread發布IoT傳感器徽標計劃
RT-Thread全球技術大會:RT-Thread構建配置系統
基于恩智浦FRDM-MCXA153開發板實現RT-Thread的ADC驅動
免費申請 | FRDM-MCXA156評測活動發布!
《恩智浦FRDM-MCXA156開發實踐指南》上線啦
NXP新品FRDM-MCXA346 RT-Thread 評測活動開放,下周四新品直播預約!| 社區活動
基于RT-Thread和FRDM-MCXA156的智能頭盔傳感器數據采集系統 | 技術集結
評論