内容
原理图
添加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】