ESP8266学习——DHT11

内容

原理图

在这里插入图片描述

添加dht11.c等文件

完整的读取DHT11数据

// 完整的读取DHT11数据
//-----------------------------------------------
// 返回值:		0		DHT11数据读取成功
//				1		结束信号的低电平时长超时
//				2		启动DHT11传输_失败
//				3		校验错误
//==============================================================================
u8 ICACHE_FLASH_ATTR DHT11_Read_Data_Complete(void)
{
	u8 C_delay_time = 0;	// 延时计时

	// 启动DHT11传输_成功
	//------------------------------------------------------------------------
	if(DHT11_Start_Signal_JX() == 0)	// DHT11:输出起始信号->接收响应信号
	{
		DHT11_Data_Array[0] = DHT11_Read_Byte();	// 湿度_整数_部分
		DHT11_Data_Array[1] = DHT11_Read_Byte();	// 湿度_小数_部分
		DHT11_Data_Array[2] = DHT11_Read_Byte();	// 温度_整数_部分
		DHT11_Data_Array[3] = DHT11_Read_Byte();	// 温度_小数_部分
		DHT11_Data_Array[4] = DHT11_Read_Byte();	// 校验字节


		// 如果此时是最后一位数据的高电平,则等待它结束
		//-----------------------------------------------------------
		while(GPIO_INPUT_GET(GPIO_ID_PIN(5))==1 && C_delay_time<100)
		{
			os_delay_us(1);		// 1us计时
			C_delay_time++;
		}

		C_delay_time = 0 ;		// 低电平计时开始


		// 结束信号的低电平时长计时
		//-----------------------------------------------------------
		while(GPIO_INPUT_GET(GPIO_ID_PIN(5))==0 && C_delay_time<100)
		{
			os_delay_us(1);		// 1us计时
			C_delay_time++;
		}

		//-----------------------------------------------------------
		if(C_delay_time >= 100)
			return 1;		// 返回1,表示:结束信号的低电平时长超时


		// 数据校验
		//-----------------------------------------------
		if(	DHT11_Data_Array[4] ==
			DHT11_Data_Array[0] + DHT11_Data_Array[1] +
			DHT11_Data_Array[2] + DHT11_Data_Array[3] )
		{

			// 读取DHT11数据结束,ESP8266接管DHT11信号线
			//-----------------------------------------------------------
			//os_delay_us(10);
			//DHT11_Signal_Output(1);	// DHT11信号线输出高(ESP8266驱动)


			// 判断温度是否为 0℃以上
			//----------------------------------------------
			if((DHT11_Data_Array[3]&0x80) == 0)
			{
				DHT11_Data_Array[5] = 1;		// >=0℃
			}
			else
			{
				DHT11_Data_Array[5] = 0;		// <0℃

				DHT11_Data_Array[3] &= 0x7F;	// 更正温度小数部分
			}


			return 0;	// 返回0,表示:温湿度读取成功
		}

		else return 3;		// 返回3,表示:校验错误
	}

	//-----------------------------------------------------
	else return 2;		// 返回2,表示:启动DHT11传输,失败
}

主要记住:

  • DHT11_Data_Array[0] == 湿度_整数_部分
  • DHT11_Data_Array[1] == 湿度_小数_部分
  • DHT11_Data_Array[2] == 温度_整数_部分
  • DHT11_Data_Array[3] == 温度_小数_部分
  • DHT11_Data_Array[4] == 校验字节
  • DHT11_Data_Array[5] == 【1:温度>=0】【0:温度<0】

代码

头文件

#include "user_interface.h"
#include "driver/uart.h"  		// 串口
#include "driver/oled.h"  		// OLED
#include "driver/dht11.h"		// DHT11头文件


//#include "at_custom.h"
#include "c_types.h"			// 变量类型
#include "eagle_soc.h"			// GPIO函数、宏定义
//#include "espconn.h"
//#include "espnow.h"
#include "ets_sys.h"			// 回调函数
//#include "gpio.h"				//
//#include "ip_addr.h"
//#include "mem.h"
#include "os_type.h"			// os_XXX
#include "osapi.h"  			// os_XXX、软件定时器
//#include "ping.h"
//#include "pwm.h"
//#include "queue.h"
//#include "smartconfig.h"
//#include "sntp.h"
//#include "spi_flash.h"
//#include "upgrade.h"
#include "user_interface.h" 	// 系统接口、system_param_xxx接口、WIFI、RateContro

宏定义

#define		ProjectName			"DHT11"			// 工程名宏定义

全局变量

u8 F_LED = 0;				// LED状态标志位
os_timer_t OS_Timer_1;		//使用os_timer_t型结构体,定义一个os_timer_t型变量

涉及的功能函数

  • 延时函数
  • 软件定时器初始化函数,及回调函数
  • LED初始化函数

在软件定时器回调函数中,执行主要功能

void ICACHE_FLASH_ATTR OS_Timer_1_cb(void)
{
	//温度超过30°C,LED亮
	if(DHT11_Read_Data_Complete() == 0)
	{
		if(DHT11_Data_Array[5]==1 && DHT11_Data_Array[2]>=30)
			GPIO_OUTPUT_SET(GPIO_ID_PIN(4),0);		//LED亮
		else
			GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);		//LED灭
	}

	//串口输出温湿度
	if(DHT11_Data_Array[5] == 1)
	{
		os_printf("\r\n湿度 == %d.%dRH\r\n",DHT11_Data_Array[0],DHT11_Data_Array[1]);
		os_printf("\r\n温度 == %d.%d°C\r\n",DHT11_Data_Array[2],DHT11_Data_Array[3]);
	}
	else
	{
		os_printf("\r\n湿度 == %d.%dRH\r\n",DHT11_Data_Array[0],DHT11_Data_Array[1]);
		os_printf("\r\n温度 == -%d.%d°C\r\n",DHT11_Data_Array[2],DHT11_Data_Array[3]);
	}

	//OLED显示温湿度
	DHT11_NUM_Char();							//DHT11数据值转成字符串
	OLED_ShowString(0,2,DHT11_Data_Char[0]);	//DHT11_Data_Char[0] == 【湿度字符串】
	OLED_ShowString(1,6,DHT11_Data_Char[1]);	// DHT11_Data_Char[1] == 【温度字符串】
}

user_init

void ICACHE_FLASH_ATTR
user_init(void)
{
	uart_init(115200,115200);	// 初始化串口波特率
	os_delay_us(10000);			// 等待串口稳定
	os_printf("\r\n=================================================\r\n");
	os_printf("\t Project:\t%s\r\n", ProjectName);
	os_printf("\t SDK version:\t%s", system_get_sdk_version());
	os_printf("\r\n=================================================\r\n");

	//OLED显示初始化
	OLED_Init();
	OLED_ShowString(0,0,"Humidity:");		//湿度
	OLED_ShowString(0,4,"Temperature:");	//温度

	LED_init();

	OS_Timer_1_init(3000,1);				//3秒定时(重复)
}

整体代码

#include "user_interface.h"
#include "driver/uart.h"  		// 串口
#include "driver/oled.h"  		// OLED
#include "driver/dht11.h"		// DHT11头文件


//#include "at_custom.h"
#include "c_types.h"			// 变量类型
#include "eagle_soc.h"			// GPIO函数、宏定义
//#include "espconn.h"
//#include "espnow.h"
#include "ets_sys.h"			// 回调函数
//#include "gpio.h"				//
//#include "ip_addr.h"
//#include "mem.h"
#include "os_type.h"			// os_XXX
#include "osapi.h"  			// os_XXX、软件定时器
//#include "ping.h"
//#include "pwm.h"
//#include "queue.h"
//#include "smartconfig.h"
//#include "sntp.h"
//#include "spi_flash.h"
//#include "upgrade.h"
#include "user_interface.h" 	// 系统接口、system_param_xxx接口、WIFI、RateContro

// 宏定义
//==================================================================================
#define		ProjectName			"DHT11"			// 工程名宏定义
//==================================================================================


// 全局变量
//==================================================================================
u8 F_LED = 0;				// LED状态标志位

void ICACHE_FLASH_ATTR delay_ms(u32 C_time)
{	for(;C_time>0;C_time--)
		os_delay_us(1000);
}

os_timer_t OS_Timer_1;		//使用os_timer_t型结构体,定义一个os_timer_t型变量

void ICACHE_FLASH_ATTR OS_Timer_1_cb(void)
{
	//温度超过30°C,LED亮
	if(DHT11_Read_Data_Complete() == 0)
	{
		if(DHT11_Data_Array[5]==1 && DHT11_Data_Array[2]>=30)
			GPIO_OUTPUT_SET(GPIO_ID_PIN(4),0);		//LED亮
		else
			GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);		//LED灭
	}

	//串口输出温湿度
	if(DHT11_Data_Array[5] == 1)
	{
		os_printf("\r\n湿度 == %d.%dRH\r\n",DHT11_Data_Array[0],DHT11_Data_Array[1]);
		os_printf("\r\n温度 == %d.%d°C\r\n",DHT11_Data_Array[2],DHT11_Data_Array[3]);
	}
	else
	{
		os_printf("\r\n湿度 == %d.%dRH\r\n",DHT11_Data_Array[0],DHT11_Data_Array[1]);
		os_printf("\r\n温度 == -%d.%d°C\r\n",DHT11_Data_Array[2],DHT11_Data_Array[3]);
	}

	//OLED显示温湿度
	DHT11_NUM_Char();							//DHT11数据值转成字符串
	OLED_ShowString(0,2,DHT11_Data_Char[0]);	//DHT11_Data_Char[0] == 【湿度字符串】
	OLED_ShowString(1,6,DHT11_Data_Char[1]);	// DHT11_Data_Char[1] == 【温度字符串】
}

//参数1:【定时时间】;参数2:【重复模式】
void ICACHE_FLASH_ATTR OS_Timer_1_init(u32 time_ms, u8 time_repetitive)
{
	//关闭定时器
	//参数一:要关闭的定时器
	os_timer_disarm(&OS_Timer_1);	//关闭软件定时器

	//设置定时器
	//参数一:要设置的定时器;参数二:回调函数(需类型转换);参数三:回到函数的参数
	//注:os_timer_setfn必须在软件定时器未使能的情况下调用
	os_timer_setfn(&OS_Timer_1,(os_timer_func_t*)OS_Timer_1_cb, NULL);	//设置回调函数

	//使能(启动)ms定时器
	//参数一:要失能的定时器;参数二:定时时间(单位:ms);参数三:1=重复/0=只一次
	os_timer_arm(&OS_Timer_1,time_ms,time_repetitive);

}

void ICACHE_FLASH_ATTR LED_init(void)
{
	//选择GPIO4的功能
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4);
	//设置GPIO4的电平
	GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);

}

void ICACHE_FLASH_ATTR
user_init(void)
{
	uart_init(115200,115200);	// 初始化串口波特率
	os_delay_us(10000);			// 等待串口稳定
	os_printf("\r\n=================================================\r\n");
	os_printf("\t Project:\t%s\r\n", ProjectName);
	os_printf("\t SDK version:\t%s", system_get_sdk_version());
	os_printf("\r\n=================================================\r\n");

	//OLED显示初始化
	OLED_Init();
	OLED_ShowString(0,0,"Humidity:");		//湿度
	OLED_ShowString(0,4,"Temperature:");	//温度

	LED_init();

	OS_Timer_1_init(3000,1);				//3秒定时(重复)
}


/******************************************************************************
 * FunctionName : user_rf_cal_sector_set
 * Description  : SDK just reversed 4 sectors, used for rf init data and paramters.
 *                We add this function to force users to set rf cal sector, since
 *                we don't know which sector is free in user's application.
 *                sector map for last several sectors : ABCCC
 *                A : rf cal
 *                B : rf init data
 *                C : sdk parameters
 * Parameters   : none
 * Returns      : rf cal sector
*******************************************************************************/
uint32 ICACHE_FLASH_ATTR
user_rf_cal_sector_set(void)
{
    enum flash_size_map size_map = system_get_flash_size_map();
    uint32 rf_cal_sec = 0;

    switch (size_map) {
        case FLASH_SIZE_4M_MAP_256_256:
            rf_cal_sec = 128 - 5;
            break;

        case FLASH_SIZE_8M_MAP_512_512:
            rf_cal_sec = 256 - 5;
            break;

        case FLASH_SIZE_16M_MAP_512_512:
            rf_cal_sec = 512 - 5;
            break;
        case FLASH_SIZE_16M_MAP_1024_1024:
            rf_cal_sec = 512 - 5;
            break;

        case FLASH_SIZE_32M_MAP_512_512:
            rf_cal_sec = 1024 - 5;
            break;
        case FLASH_SIZE_32M_MAP_1024_1024:
            rf_cal_sec = 1024 - 5;
            break;

        case FLASH_SIZE_64M_MAP_1024_1024:
            rf_cal_sec = 2048 - 5;
            break;
        case FLASH_SIZE_128M_MAP_1024_1024:
            rf_cal_sec = 4096 - 5;
            break;
        default:
            rf_cal_sec = 0;
            break;
    }

    return rf_cal_sec;
}



void ICACHE_FLASH_ATTR
user_rf_pre_init(void)
{
}

整体框架

  • DHT11_Data_Array[0] == 湿度_整数_部分
  • DHT11_Data_Array[1] == 湿度_小数_部分
  • DHT11_Data_Array[2] == 温度_整数_部分
  • DHT11_Data_Array[3] == 温度_小数_部分
  • DHT11_Data_Array[4] == 校验字节
  • DHT11_Data_Array[5] == 【1:温度>=0】【0:温度<0】
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值