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、资料下载

  • 点击扫描下方二维码
Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐