基于ONENET物联网温湿度光强烟雾空气质量监测器(原理图+程序源码+教程)
11
拍明
原标题:基于ONENET物联网温湿度光强烟雾空气质量监测器(原理图+程序源码+教程)
一、项目背景与需求分析
随着物联网技术的快速发展,环境监测设备在智能家居、工业安全、农业大棚等领域的应用需求日益增长。本设计旨在构建一套基于ONENET云平台的物联网环境监测系统,实时采集温湿度、光照强度、烟雾浓度及空气质量参数,并通过无线通信模块将数据上传至云端,实现远程监控与数据分析。

核心需求:
多参数采集:支持温湿度、光照、烟雾、PM2.5等环境参数的实时监测。
无线传输:通过ESP8266或ESP32模块实现数据上传至ONENET平台。
低功耗设计:采用低功耗传感器与MCU,延长设备续航时间。
云端可视化:利用ONENET平台的数据展示与报警功能,实现远程管理。
扩展性:支持传感器模块的灵活扩展,适应不同场景需求。
二、系统架构设计
系统采用模块化设计,主要分为以下部分:
主控模块:STM32F103C8T6或STM32F407VET6(根据性能需求选择)。
传感器模块:温湿度传感器(DHT11/DHT22/SHT3X)、光照传感器(BH1750/GY-30)、烟雾传感器(MQ-2/MQ-135)、空气质量传感器(GP2Y1010AU0F粉尘传感器/SDS011 PM2.5传感器)。
通信模块:ESP8266(Wi-Fi)或ESP32(Wi-Fi+蓝牙)。
显示模块:OLED屏幕(0.96寸I2C接口)或LCD1602(可选)。
电源模块:锂电池供电(3.7V)或USB 5V输入,配合稳压电路输出3.3V。
2.1 主控模块选型与优势
推荐型号:STM32F103C8T6(基础版)或STM32F407VET6(高性能版)。
选型理由:
STM32F103C8T6:基于ARM Cortex-M3内核,主频72MHz,支持64KB Flash和20KB RAM,外设丰富(I2C、SPI、UART、ADC等),成本低,适合资源需求较低的场景。
STM32F407VET6:基于ARM Cortex-M4内核,主频168MHz,支持1MB Flash和192KB RAM,集成FPU(浮点运算单元),适合需要高速数据处理或多传感器协同的场景。
关键功能:
通过I2C接口读取温湿度、光照传感器数据。
通过ADC采集烟雾、粉尘传感器的模拟信号。
控制ESP8266/ESP32模块实现Wi-Fi通信。
驱动OLED屏幕显示实时数据。
三、元器件选型与功能详解
3.1 温湿度传感器
推荐型号:DHT22(数字输出)或SHT3X(I2C接口)。
选型理由:
DHT22:测量范围广(-40℃~80℃,0%RH~100%RH),精度高(温度±0.5℃,湿度±2%RH),数字输出免校准,适合低成本方案。
SHT3X:I2C接口,测量范围(-40℃~125℃,0%RH~100%RH),精度更高(温度±0.3℃,湿度±1.5%RH),支持多种分辨率设置,适合高精度需求。
电路设计:
DHT22:DATA引脚接MCU的GPIO,通过单总线协议通信。
SHT3X:SCL接MCU的I2C时钟线,SDA接数据线,需上拉电阻(4.7kΩ)。
3.2 光照传感器
推荐型号:BH1750(数字输出)或GY-30(模块化设计)。
选型理由:
BH1750:I2C接口,测量范围(1~65535 lux),分辨率可达0.5 lux,低功耗(0.12mA),内置A/D转换器,直接输出数字信号。
GY-30:基于BH1750的模块,集成稳压电路和上拉电阻,简化硬件设计。
电路设计:
SCL接MCU的I2C时钟线,SDA接数据线,ADDR引脚接地(默认地址0x23)。
3.3 烟雾传感器
推荐型号:MQ-2(通用型)或MQ-135(空气质量检测)。
选型理由:
MQ-2:对烟雾、甲烷、丙烷等可燃气体敏感,输出模拟电压信号,适合火灾预警场景。
MQ-135:对氨气、硫化物、苯系物等有害气体敏感,适合空气质量监测。
电路设计:
VCC接5V,GND接地,DOUT接MCU的ADC通道(如PA0),通过分压电阻(如10kΩ)将输出电压调整至MCU的ADC输入范围(0~3.3V)。
3.4 空气质量传感器
推荐型号:GP2Y1010AU0F(粉尘传感器)或SDS011(PM2.5激光传感器)。
选型理由:
GP2Y1010AU0F:基于红外散射原理,测量范围(0~700μg/m³),成本低,适合粉尘浓度监测。
SDS011:激光散射原理,测量范围(0~999μg/m³),精度高(±10%),支持串口通信,适合专业级空气质量监测。
电路设计:
GP2Y1010AU0F:VCC接5V,GND接地,VO接MCU的ADC通道,需配合5V转3.3V电路(如电阻分压或运放电路)。
SDS011:TX接MCU的UART_RX,RX接UART_TX,VCC接5V,GND接地。
3.5 通信模块
推荐型号:ESP8266-01S(基础版)或ESP32-DEVKITC(高性能版)。
选型理由:
ESP8266-01S:集成TCP/IP协议栈,支持STA/AP模式,成本低,适合简单Wi-Fi通信需求。
ESP32-DEVKITC:双核32位MCU,支持Wi-Fi+蓝牙,内存更大(520KB SRAM),适合复杂应用。
电路设计:
ESP8266:TX接MCU的UART_RX,RX接UART_TX,VCC接3.3V,GND接地,CH_PD接高电平(使能)。
ESP32:直接通过USB供电,UART接口与MCU通信。
3.6 显示模块
推荐型号:0.96寸OLED(I2C接口)或LCD1602(并行接口)。
选型理由:
OLED:自发光、高对比度、低功耗(约20mA),适合显示多参数数据。
LCD1602:成本低,但需较多GPIO引脚(8位数据总线+3位控制线),适合简单显示需求。
电路设计:
OLED:SCL接I2C时钟线,SDA接数据线,RES接高电平(复位),DC接高电平(数据/命令选择)。
LCD1602:VSS接地,VDD接5V,VO接电位器(对比度调节),RS接GPIO(数据/命令选择),RW接地(只写模式),E接GPIO(使能信号),D0~D7接MCU的GPIO。
3.7 电源模块
推荐方案:
锂电池供电:3.7V锂电池+AMS1117-3.3稳压芯片(输出3.3V)。
USB供电:5V输入+AMS1117-3.3稳压芯片。
电路设计:
锂电池正极接AMS1117的Vin,负极接地,Vout输出3.3V,需并联电容(10μF+0.1μF)滤波。
四、原理图设计
4.1 主控电路
STM32F103C8T6最小系统包括:
8MHz晶振(HSE) + 32.768kHz晶振(LSE)。
复位电路(按键复位)。
BOOT0接GND(正常启动模式)。
4.2 传感器接口电路
DHT22:DATA引脚接MCU的GPIO,通过上拉电阻(4.7kΩ)确保信号稳定。
BH1750:SCL接PB6,SDA接PB7,ADDR接地(地址0x23)。
MQ-2:VO接PA0(ADC通道0),通过分压电阻(10kΩ+22kΩ)将输出电压调整至0~3.3V。
ESP8266:TX接PA9(UART1_TX),RX接PA10(UART1_RX),CH_PD接3.3V。
4.3 OLED显示电路
SCL接PB6,SDA接PB7,RES接3.3V,DC接PB8。
五、程序源码与实现
5.1 开发环境配置
IDE:Keil MDK-ARM或STM32CubeIDE。
库文件:STM32标准外设库或HAL库。
ONENET平台配置:
注册ONENET账号,创建设备(产品类型选择“普通产品”)。
获取设备ID、APIKey、MasterKey。
配置数据流(如“Temperature”、“Humidity”、“Light”、“Smoke”、“PM25”)。
5.2 核心代码实现
5.2.1 传感器数据采集
// DHT22温湿度读取(基于单总线协议)
#include "dht22.h"
float temperature, humidity;
void DHT22_Read(void) {
uint8_t buf[5] = {0};
DHT22_Start(); // 发送起始信号
if (DHT22_Check_Response()) { // 检查响应
for (int i = 0; i < 5; i++) {
buf[i] = DHT22_Read_Byte(); // 读取5字节数据
}
}
// 校验数据
if (buf[0] + buf[1] + buf[2] + buf[3] == buf[4]) {
temperature = (buf[2] << 8) | buf[3]; // 温度(整数部分在小端序的buf[3])
humidity = (buf[0] << 8) | buf[1]; // 湿度
temperature /= 10; // 转换为实际温度(DHT22输出为整数倍0.1℃)
}
}
// BH1750光照读取(I2C接口)
#include "bh1750.h"
#define BH1750_ADDR 0x23
float Light_Intensity = 0;
void BH1750_Read(void) {
uint8_t data[2] = {0};
I2C_Start();
I2C_Send_Byte(BH1750_ADDR << 1 | 0x00); // 发送器件地址+写命令
I2C_Send_Byte(0x10); // 发送连续高分辨率模式命令
I2C_Stop();
Delay_ms(180); // 等待测量完成
I2C_Start();
I2C_Send_Byte(BH1750_ADDR << 1 | 0x01); // 发送器件地址+读命令
data[0] = I2C_Read_Byte(1); // 读取高字节(ACK)
data[1] = I2C_Read_Byte(0); // 读取低字节(NACK)
I2C_Stop();
Light_Intensity = (data[0] << 8 | data[1]) / 1.2; // 转换为实际光照强度(lux)
}
// MQ-2烟雾读取(ADC通道0)
#include "adc.h"
#define ADC_CHANNEL 0
float Smoke_Concentration = 0;
void MQ2_Read(void) {
uint16_t adc_val = ADC_Get_Value(ADC_CHANNEL);
float voltage = adc_val * 3.3 / 4095.0; // 转换为电压值
Smoke_Concentration = voltage * 1000 / 5.0; // 假设灵敏度为5V/1000ppm(需根据实际标定调整)
}
5.2.2 ESP8266通信与ONENET上传
// ESP8266初始化(AT指令模式)
#include "esp8266.h"
#define SSID "your_WiFi_SSID"
#define PASSWORD "your_WiFi_password"
#define DEVICE_ID "your_device_id"
#define API_KEY "your_api_key"
void ESP8266_Init(void) {
UART_Send_String("AT
"); // 测试模块
Delay_ms(1000);
UART_Send_String("AT+CWMODE=1
"); // 设置为STA模式
Delay_ms(1000);
UART_Send_String("AT+CWJAP=""SSID"",""PASSWORD""
"); // 连接Wi-Fi
Delay_ms(5000);
}
// 数据上传至ONENET(HTTP协议)
void ONENET_Upload(float temp, float humi, float light, float smoke) {
char cmd[256] = {0};
sprintf(cmd, "AT+HTTPINIT
");
UART_Send_String(cmd);
Delay_ms(1000);
sprintf(cmd, "AT+HTTPPARA="URL","http://api.onenet.com/devices/%s/datapoints?api_key=%s"
", DEVICE_ID, API_KEY);
UART_Send_String(cmd);
Delay_ms(1000);
sprintf(cmd, "AT+HTTPPARA="CONTENT-TYPE","application/json"
");
UART_Send_String(cmd);
Delay_ms(1000);
char data[128] = {0};
sprintf(data, "{"Temperature":%.2f,"Humidity":%.2f,"Light":%.2f,"Smoke":%.2f}", temp, humi, light, smoke);
sprintf(cmd, "AT+HTTPDATA=%d,10000
", strlen(data));
UART_Send_String(cmd);
Delay_ms(1000);
UART_Send_String(data); // 发送数据体
Delay_ms(1000);
UART_Send_String("AT+HTTPACTION=1
"); // POST请求
Delay_ms(5000);
UART_Send_String("AT+HTTPTERM
"); // 关闭HTTP连接
Delay_ms(1000);
}
5.2.3 主循环逻辑
int main(void) {
System_Init(); // 系统初始化(时钟、GPIO、ADC、I2C、UART等)
DHT22_Init();
BH1750_Init();
ESP8266_Init();
OLED_Init();
while (1) {
DHT22_Read(); // 读取温湿度
BH1750_Read(); // 读取光照
MQ2_Read(); // 读取烟雾
// 显示数据到OLED
OLED_Show_String(0, 0, "Temp: %.1f C", temperature);
OLED_Show_String(0, 1, "Humi: %.1f %%", humidity);
OLED_Show_String(0, 2, "Light: %.0f lux", Light_Intensity);
OLED_Show_String(0, 3, "Smoke: %.1f ppm", Smoke_Concentration);
// 上传数据至ONENET(每5秒一次)
static uint32_t last_upload_time = 0;
if (Get_System_Time() - last_upload_time > 5000) {
ONENET_Upload(temperature, humidity, Light_Intensity, Smoke_Concentration);
last_upload_time = Get_System_Time();
}
Delay_ms(100); // 主循环延时
}
}
六、元器件采购与替代方案
6.1 采购平台推荐
拍明芯城(https://www.iczoom.com/)提供以下服务:
型号查询:输入元器件型号(如“STM32F103C8T6”),快速获取品牌、价格、库存信息。
国产替代:推荐国产兼容型号(如“GD32F103C8T6”替代STM32F103C8T6)。
供应商查询:列出授权代理商(如“Arrow”、“Digi-Key”)及价格对比。
数据手册下载:提供英文/中文PDF资料(如“STM32F103C8T6数据手册”)。
6.2 关键元器件替代方案
| 元器件 | 推荐型号 | 替代型号 | 替代理由 |
|---|---|---|---|
| 主控MCU | STM32F103C8T6 | GD32F103C8T6 | 国产兼容,性能相同,价格更低 |
| 温湿度传感器 | DHT22 | SHT31 | I2C接口,精度更高(±0.3℃),支持多种分辨率 |
| 光照传感器 | BH1750 | GY-302(基于BH1750) | 模块化设计,集成稳压电路,简化硬件设计 |
| 烟雾传感器 | MQ-2 | MQ-7(CO专用) | 若需专门检测CO,可选择MQ-7;若需通用型,MQ-2更合适 |
| 通信模块 | ESP8266-01S | ESP32-WROOM-32 | ESP32支持蓝牙,内存更大,适合复杂应用 |
| 显示模块 | 0.96寸OLED(I2C) | LCD1602(并行) | 若GPIO资源紧张,可选择OLED;若成本敏感,LCD1602更便宜 |
七、调试与优化
7.1 硬件调试
电源检查:用万用表测量各模块电压(如3.3V、5V),确保无短路或过压。
传感器校准:
DHT22:与精准温湿度计对比,记录偏差并修正代码。
MQ-2:在纯净空气中读取基准值,在已知浓度气体中测试灵敏度。
通信测试:
ESP8266:通过串口助手发送“AT”命令,检查是否返回“OK”。
ONENET上传:用Postman模拟HTTP请求,验证API接口是否正常。
7.2 软件优化
低功耗设计:
在主循环中增加休眠模式(如STM32的STOP模式),通过定时器唤醒。
关闭未使用的外设时钟(如SPI、I2C若未使用)。
数据滤波:
对ADC采集的烟雾、粉尘数据采用移动平均滤波(如取最近5次采样的平均值)。
对温湿度数据采用中值滤波(如取最近3次采样的中间值)。
报警阈值动态调整:
根据历史数据自动调整烟雾、温度报警阈值(如夏季温度阈值提高5℃)。
八、总结与展望
本设计实现了一套基于ONENET的物联网环境监测系统,通过STM32主控采集温湿度、光照、烟雾等参数,并通过ESP8266上传至云端,支持远程监控与报警。系统具有以下优势:
模块化设计:传感器与通信模块独立,便于扩展与维护。
低成本:选用性价比高的元器件(如STM32F103C8T6、DHT22),适合批量部署。
高可靠性:通过硬件滤波与软件冗余设计,确保数据准确性。
未来改进方向:
支持更多传感器:集成PM2.5、CO2、TVOC等传感器,实现更全面的环境监测。
边缘计算:在MCU端实现简单数据分析(如异常检测),减少云端负载。
多平台兼容:支持阿里云、腾讯云等主流物联网平台,提升灵活性。
通过本设计,读者可快速掌握物联网环境监测系统的开发流程,为智能家居、工业安全等领域的应用提供参考。
责任编辑:David
【免责声明】
1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。
2、本文的引用仅供读者交流学习使用,不涉及商业目的。
3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。
4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。
拍明芯城拥有对此声明的最终解释权。

产品分类

2012- 2022 拍明芯城ICZOOM.com 版权所有 客服热线:400-693-8369 (9:00-18:00)