STM32F103C8T6采集DHT11温湿度数据上传阿里云

硬件清单

单片机: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

  • 6
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吱迷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值