硬件清单
单片机:STM32F103C8T6
温湿度传感器:DHT11温湿度传感器
WiFi模块:ESP-01s
代码程序
main.c
/*
WiFi 模块 接串口2 PA2 PA3
DHT11 接PB9
串口打印 接串口1
LED灯 接PC13
*/
#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_usart.h"
#include "usart.h"
#include "usart2.h"
#include "delay.h"
#include "esp8266.h"
#include "DHT11.h"
int main(void)
{
u8 wd=0;
u8 sd=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Delay_Init();
LED_GPIO_Config(); //初始化LED灯
USART1_Init(115200);//串口1初始化(打印数据使用)
uart2_init(115200);//串口6初始化(WIFI使用)
printf("正在联网中...\r\n");
WIFI_Init();
printf("所有模块初始化完毕!!!\r\n");
printf( "串口printf函数测试\n" );
DHT11_Init();
while (1)
{
// wait_SUB(); //控制继电器和指示灯下行命令处理
DHT11_Read_Data(&wd,&sd);//读取温湿度值
Client_Pub("temperature",wd); //上报温度数据 //对应自己的标识符
Client_Pub("humidity",sd); //上报湿度数据
printf("当前环境温度: %d ℃\r\n",wd); //串口1打印验证
printf("当前环境湿度: %d %\r\n",sd);
delay_ms(1000);
}
}
DHT11.C
#include "stm32f10x.h"
#include "DHT11.h"
void DHT11_IO_IN(void)//温湿度模块输入函数
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Pin = IO_DHT11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIO_DHT11, &GPIO_InitStructure);
}
void DHT11_IO_OUT(void)//温湿度模块输出函数
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = IO_DHT11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIO_DHT11, &GPIO_InitStructure);
}
//复位DHT11
void DHT11_Rst(void)
{
DHT11_IO_OUT(); //SET OUTPUT
DHT11_DQ_Low; //DQ=0
DelayXms(20); //拉低至少18ms
DHT11_DQ_High; //DQ=1
DelayUs(30); //主机拉高20~40us
}
//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
u8 DHT11_Check(void)
{
u8 retry = 0; //定义临时变量
DHT11_IO_IN();//SET INPUT
while ((GPIO_ReadInputDataBit(GPIO_DHT11, IO_DHT11) == 1) && retry < 100) //DHT11会拉低40~80us
{
retry++;
DelayUs(1);
};
if(retry >= 100)return 1;
else retry = 0;
while ((GPIO_ReadInputDataBit(GPIO_DHT11, IO_DHT11) == 0) && retry < 100) //DHT11拉低后会再次拉高40~80us
{
retry++;
DelayUs(1);
};
if(retry >= 100)return 1;
return 0;
}
//从DHT11读取一个位
//返回值:1/0
u8 DHT11_Read_Bit(void)
{
u8 retry = 0;
while((GPIO_ReadInputDataBit(GPIO_DHT11, IO_DHT11) == 1) && retry < 100) //等待变为低电平
{
retry++;
DelayUs(1);
}
retry = 0;
while((GPIO_ReadInputDataBit(GPIO_DHT11, IO_DHT11) == 0) && retry < 100) //等待变高电平
{
retry++;
DelayUs(1);
}
DelayUs(40);//等待40us
if(GPIO_ReadInputDataBit(GPIO_DHT11, IO_DHT11) == 1)
return 1;
else
return 0;
}
//从DHT11读取一个字节
//返回值:读到的数据
u8 DHT11_Read_Byte(void)
{
u8 i, dat;
dat = 0;
for (i = 0; i < 8; i++)
{
dat <<= 1;
dat |= DHT11_Read_Bit();
}
return dat;
}
//从DHT11读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败
u8 DHT11_Read_Data(u8 *temp, u8 *humi)
{
u8 buf[5];
u8 i;
DHT11_Rst();
if(DHT11_Check() == 0)
{
for(i = 0; i < 5; i++) //读取40位数据
{
buf[i] = DHT11_Read_Byte();
}
if((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4])
{
*humi = buf[0];
*temp = buf[2];
}
}
else return 1;
return 0;
}
//初始化DHT11的IO口 DQ 同时检测DHT11的存在
//返回1:不存在
//返回0:存在
void DHT11_Init(void)
{
DHT11_Rst(); //复位DHT11
DHT11_Check();//等待DHT11的回应
}
esp8266.c 部分代码
void wait_SUB(void)
{
int len;
char *sp = NULL;
len=strlen(USART2_RX_BUF);
if(len>10)
{
USART_Send_Bytes( USART2_RX_BUF);//"123456"
if((sp=strstr((char *)USART2_RX_BUF, "allPowerstate")) != NULL) //这里要对应自己的按键控件标识符
{
sp = strstr(sp, ":") + 1;
if(*sp == '1') //bool 0关闭 1打开
{
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
printf("阿里云指令——>开灯\r\n");
}
else
{
GPIO_SetBits(GPIOC,GPIO_Pin_13);
GPIO_SetBits(GPIOB,GPIO_Pin_12);
printf("阿里云指令——>关灯\r\n");
}
}
CLR_Buf2(); //清除串口2接收缓存
}
}
/*********************等待返回“OK”*************************/
void wait_OK(void)
{
while(!Flag_usart2_receive_OK);//等待接收到OK字符串
Flag_usart2_receive_OK = 0;
CLR_Buf2(); //清除串口2接收缓存
}
/*********************串口2接收缓存清除*************************/
void CLR_Buf2(void)
{
memset(USART2_RX_BUF, '\0', sizeof(USART2_RX_BUF));
USART2_RX_STA=0;
}
功能显示
手机APP界面显示温湿度值
视频讲解
https://www.bilibili.com/video/BV1VY4y1i7ov?spm_id_from=333.999.0.0