基于STM32单片机的OneNet物联网环境检测系统
本文介绍了一种基于STM32的OneNet物联网环境检测系统设计。该系统通过STM32单片机实时采集温湿度、光照强度和烟雾浓度数据,并利用ESP8266 WiFi模块将数据上传至OneNet物联网云平台进行远程监测。文章详细阐述了硬件电路设计,包括ESP8266 WiFi模块、MQ-2烟雾传感器和BH1750光照传感器的工作原理及电路连接,并提供了关键程序代码,如BH1750数据采集和OneNet
·
基于STM32单片机的OneNet物联网环境检测系统
1、系统功能介绍
-
1、通过stm32单片机,实时采集温湿度、光照强度、烟雾浓度数据
-
2、使用ESP8266 WIFI模块将数据实时上传至OneNet物联网云平台
-
3、可通过物联网云平台显示数据
-
根据本篇文章完成毕业设计的开题报告、任务书、设计、毕业论文等
2、演示视频
3、系统电路介绍
3.1、ESP8266 WIFI电路设计
- ESP‑01S 模块基于流行的 ESP8266EX 芯片,其内置 32 位 Tensilica L106 RISC CPU,默认 80 MHz(可超频至160 MHz),提供 32 KB 指令 RAM、80 KB 用户数据 RAM,以及 1 MB 外部 QSPI 闪存(部分版本为 4 MB),并支持802.11 b/g/n Wi‑Fi 协议,可用于 STA、AP 或桥接模式,无需外部 Wi‑Fi 模块即可实现联网功能。
- 该模块封装为 2×4 排针,包含 VCC(3.3 V)、GND、RST、CH_PD、TX、RX、GPIO0 和 GPIO2 8 个引脚,其中 GPIO0/2 既可用于布置 IO,又在启动时用于进入程序下载模式或正常运行模式。设计时需要注意模块供电和逻辑电平都必须是 3.3 V,不能直接接入 5 V,否则会损坏模块。
- ESP‑01S 的 Wi‑Fi 部件高度集成,包括功率放大器(PA)、低噪声放大器(LNA)、 balun 和 PCB 天线,提供良好 RF 性能。具备低功耗设计,浅睡眠功耗约为 15 mA,深度睡眠可低至 10 µA,适合用于电池供电或物联网终端应用。
ESP8266电路原理图
实物图:
3.2、MQ-2烟雾浓度采集电路设计
- MQ‑2 烟雾/可燃气体传感器是一款常用的半导体气体探测模块,内部采用锡基金属氧化物(SnO₂)感应器,当周围存在丁烷、丙烷、甲烷、氢气、酒精或烟雾等可燃蒸气时,其电阻会随气体浓度升高而减小,此电阻变化经外接电路(通常为可调负载电阻 RL)转换为电压信号,可被 MCU 的 ADC 或比较器识别。
电路原理图:
实物图:
3.3、BH1750光照采集电路设计
- BH1750 是一款通过 I²C 总线输出光照强度值(以 lx 为单位)的数字环境光照传感器,测量范围为 1~65 535 lux,精度接近人眼感知并可用于调节显示器背光、自动灯控等应用。它内置 A/D 转换器,无需外部校准,模块板还配备稳压电路和 I²C 上拉,使其同时兼容 3.3 V 和 5 V 系统
- BH1750 支持多种测量模式:包括连续与单次模式,每种模式下还能选择高、低和高精度两档分辨率(高精度可达 0.5 lx);浅睡眠功耗仅约 0.12 mA,可兼容低功耗设计。
电路原理图:
实物图:
4、程序设计
4.1、BH1750程序
/****从BH1750单次读Lux****/
/****
模式选择:H-Resolution Mode,分辨率1lux
单次读Opecode:0010 0000 ,即0x20
器件地址:0100011,ADDR接GND
****/
void bh1750_ReadOneTime(void)
{
bh1750_iic_start();
bh1750_send_byte(0x46); //发送器件地址0100 0110 最后一位0,表示写
bh1750_recv_ack();
bh1750_send_byte(0x20); //发送One time H-Resolution Mode的Opecode 0010 0000,分辨率为1lux
bh1750_recv_ack();
bh1750_iic_stop();
delay_ms(200);
bh1750_iic_start();
bh1750_send_byte(0x47); //
bh1750_recv_ack();
BUF[0]=bh1750_recv_byte(1);
//IIC_Ack(); //主机应答
//temp1=temp<<8;
BUF[1]=bh1750_recv_byte(0);
//IIC_NAck(); //主机不应答
bh1750_iic_stop();
// temp2=BUF[0];
// temp2=(temp2<<8)+BUF[1];
// lux=(float)temp2/1.2; //lux是float型
//return lux;
//delay_ms(200);
}
/****从BH1750连续读Lux****/
/****
模式选择:H-Resolution Mode,分辨率1lux
连续读Opecode:0001 0000
器件地址:0100011,ADDR接GND
****/
void bh1750_ReadContinuous1(void)
{
// u16 temp=0,temp1=0;
bh1750_iic_start();
bh1750_send_byte(0x46); //发送器件地址0100 0110 最后一位0,表示写
bh1750_recv_ack();
bh1750_send_byte(0x10); //发送Continuous H-Resolution Mode的Opecode 0001 0000,分辨率为1lux
bh1750_recv_ack();
bh1750_iic_stop();
delay_ms(200);
bh1750_iic_start();
bh1750_send_byte(0x47);
bh1750_recv_ack();
BUF[0]=bh1750_recv_byte(1);
BUF[1]=bh1750_recv_byte(0);
//temp=bh1750_recv_byte(1);
//temp1=bh1750_recv_byte(0);
bh1750_iic_stop();
//temp2=temp1+(temp<<8);
//lux=(float)temp2/1.2; //lux是float型
}
void Conversion(void)
{
temp2=BUF[0];
temp2=(temp2<<8)+BUF[1];
lux=(float)temp2/1.2; //lux是float型
}
4.2、连接onenet程序
//==========================================================
// 函数名称: ESP8266_Init
//
// 函数功能: 初始化ESP8266
//
// 入口参数: 无
//
// 返回参数: 无
//
// 说明:
//==========================================================
void ESP8266_Init(void)
{
GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET);
delay_ms(250);
GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET);
delay_ms(500);
ESP8266_Clear();
UsartPrintf(USART_DEBUG, "1. AT\r\n");
while(ESP8266_SendCmd("AT\r\n", "OK"))
delay_ms(500);
UsartPrintf(USART_DEBUG, "2. CWMODE\r\n");
while(ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK"))
delay_ms(500);
UsartPrintf(USART_DEBUG, "3. CWJAP\r\n");
while(ESP8266_SendCmd(ESP8266_WIFI_INFO, "GOT IP"))
delay_ms(500);
UsartPrintf(USART_DEBUG, "4. CIPSTART\r\n");
while(ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT"))
delay_ms(500);
UsartPrintf(USART_DEBUG, "5. ESP8266 Init OK\r\n");
}
//==========================================================
// 函数名称: OneNet_DevLink
//
// 函数功能: 与onenet创建连接
//
// 入口参数: 无
//
// 返回参数: 1-成功 0-失败
//
// 说明: 与onenet平台建立连接
//==========================================================
_Bool OneNet_DevLink(void)
{
MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0}; //协议包
unsigned char *dataPtr;
_Bool status = 1;
UsartPrintf(USART_DEBUG, "OneNet_DevLink\r\n"
"PROID: %s, AUIF: %s, DEVID:%s\r\n"
, PROID, AUTH_INFO, DEVID);
if(MQTT_PacketConnect(PROID, AUTH_INFO, DEVID, 256, 0, MQTT_QOS_LEVEL0, NULL, NULL, 0, &mqttPacket) == 0)
{
ESP8266_SendData(mqttPacket._data, mqttPacket._len); //上传平台
dataPtr = ESP8266_GetIPD(250); //等待平台响应
if(dataPtr != NULL)
{
if(MQTT_UnPacketRecv(dataPtr) == MQTT_PKT_CONNACK)
{
switch(MQTT_UnPacketConnectAck(dataPtr))
{
case 0:UsartPrintf(USART_DEBUG, "Tips: 连接成功\r\n");status = 0;break;
case 1:UsartPrintf(USART_DEBUG, "WARN: 连接失败:协议错误\r\n");break;
case 2:UsartPrintf(USART_DEBUG, "WARN: 连接失败:非法的clientid\r\n");break;
case 3:UsartPrintf(USART_DEBUG, "WARN: 连接失败:服务器失败\r\n");break;
case 4:UsartPrintf(USART_DEBUG, "WARN: 连接失败:用户名或密码错误\r\n");break;
case 5:UsartPrintf(USART_DEBUG, "WARN: 连接失败:非法链接(比如token非法)\r\n");break;
default:UsartPrintf(USART_DEBUG, "ERR: 连接失败:未知错误\r\n");break;
}
}
}
MQTT_DeleteBuffer(&mqttPacket); //删包
}
else
UsartPrintf(USART_DEBUG, "WARN: MQTT_PacketConnect Failed\r\n");
return status;
}
5、资料下载
- 点击扫描下方二维码
更多推荐
所有评论(0)