*
本系列博客学习由非官方人员 半颗心脏 <http://blog.csdn.net/xh870189248>
潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途。如有不对之处,请留言,本人及时更改。

* 1、 Esp8266之 搭建开发环境,开始一个“hellow world”串口打印。
<http://blog.csdn.net/xh870189248/article/details/77985541>
* 2、 Esp8266之 利用GPIO开始使用按钮点亮你的“第一盏灯”。
<http://blog.csdn.net/xh870189248/article/details/78126689>
* 3、 Esp8266之 利用 "软件定时器 " 定时0.5秒闪烁点亮一盏LED。
<http://blog.csdn.net/xh870189248/article/details/78155357>
* 4 、Esp8266之 了解PWM,更为深入地用PWM控制一盏LED的亮度变化。
<http://blog.csdn.net/xh870189248/article/details/78202224>
* 5 、Esp8266之 原生乐鑫SDK高级使用之封装Post与Get请求云端,拿到“天气预报信息”。
<http://blog.csdn.net/xh870189248/article/details/78656563>
* 6 、Esp8266之 了解 SmartConfig与Airkiss一键配网,给8266配网上云端。无需把wifi名字密码写在固件里。
<http://blog.csdn.net/xh870189248/article/details/78677952>
* 7 、Esp8266之 了解 softAP热点配网模式原理,仿“机智云”定义自己的热点配网模式协议。
<http://blog.csdn.net/xh870189248/article/details/78703905>
* 8、 Esp8266之 你要找的8266作为UDP、TCP客户端或服务端的角色通讯,都在这了。
<http://blog.csdn.net/xh870189248/article/details/78739311>
* 9、 Esp8266进阶之路第一篇: [小实战上篇]Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。
<http://blog.csdn.net/xh870189248/article/details/78761948>
* 10、 Esp8266进阶之路第二篇: [小实战下篇]Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。
<http://blog.csdn.net/xh870189248/article/details/78777371>
* 11、 Esp8266进阶之路第三篇: 8266接入阿里智能,点亮一盏LED灯,期待天猫精灵语音控制的不约而至!
<http://blog.csdn.net/xh870189248/article/details/78807018>
*
12、 Esp8266进阶之路第四篇: 图文并茂学习阿里云主机搭建8266MQTT服务器,实现移动网络远程控制一盏LED。
<http://blog.csdn.net/xh870189248/article/details/78867173>

*
13、 Esp8266进阶之路第五篇: 动手做个8266毕设小案例,smartConfig + MQTT协议轻松实现远程控制一盏LED。
<http://blog.csdn.net/xh870189248/article/details/79052347>

*
14、 Esp8266进阶之路第六篇: esp8266的 FreeRtos系统学习的正确姿势 ------ 环境搭建、烧录。
<http://blog.csdn.net/xh870189248/article/details/79103373>

*
15、 Esp8266进阶之路第七篇: esp8266的 物联网又一股清流,8266接入阿里云平台非阿里智能的SDS服务,点亮一盏LED灯。
<http://blog.csdn.net/xh870189248/article/details/79197459>

*
16、 Esp8266进阶之路第八篇: esp8266的 基于Nonos移植红外线H1838,实现红外遥控器配网,远程控制一盏灯。
<http://blog.csdn.net/xh870189248/article/details/79486075>

*
17、 Esp8266进阶之路第九篇: esp8266自研的快速上电开关五次 (开-关为一次) ,无需按键触发则8266进去一键配网模式。
<https://blog.csdn.net/xh870189248/article/details/80027961>

*
18、 Esp8266进阶之路第十篇: esp8266 基于NONOS 实现 OTA 远程升级,实现无线“ 热修复 ”升级固件程序。
<https://blog.csdn.net/xh870189248/article/details/80095139>

*
19、 Esp8266进阶之路第十一篇【外设篇】: esp8266驱动 ds18b20、dht11 温湿度传感器,采集温湿度传感器到服务器。
<https://blog.csdn.net/xh870189248/article/details/80284827>

*
20、 Esp8266进阶之路第十一篇【高级篇】: 深入学习esp8266的esp now模式,仿机智云做一个小网关,实现无需网络下轻松彼此连接通讯交互数据。
<https://blog.csdn.net/xh870189248/article/details/80631739>

*
21、 Esp8266进阶之路第十二篇【高级篇】: 浅谈 esp8266 如何在本地局域网网络情况下实现最大效率地和前端实现数据交互。
<https://blog.csdn.net/xh870189248/article/details/80859347>

*
22、 Esp8266进阶之路第十三篇【混杂篇】: esp8266的工程如何添加第三方静态库文件以及如何自定义文件夹,聊聊那些makeFile的事。。
<https://blog.csdn.net/xh870189248/article/details/80909216>

*
23、 Esp8266进阶之路第十四篇【高级篇】: 再来一波 esp8266 基于 freeRtos系统连接自己私有的服务器实现OTA远程升级,接触下
lwip的基本知识。。 <https://blog.csdn.net/xh870189248/article/details/80924538>

*
24、 Esp8266进阶之路第十五篇【高级篇】:
渗透学习回顾下esp8266的外置spi芯片25q系列,熟悉8266代码块在其的分布,得心应手放置图片或其他资料。
<https://blog.csdn.net/xh870189248/article/details/81017735>

*
25、 Esp8266进阶之路第十六篇【高级篇】: 深聊下esp8266的串口 Uart 通讯中断编程,为您准备好了 NONOS 版本 和 RTOS
系统的串口驱动文件。 <https://blog.csdn.net/xh870189248/article/details/81017735>

*
26、 Esp8266进阶之路第十七篇【高级篇】: RTOS分析 MQTT 实现过程,实现移植 MQTT协议在 esp8266 rtos实时系统,可断线重连。
<https://blog.csdn.net/xh870189248/article/details/81181707>

*
27、 Esp8266进阶之路第十八篇【高级篇】: 跟紧脚步,用VisualStudio Code开发 esp8266 rtos SDK
v3.0版本,全新的 idf 框架,节省内存模块化开发。
<https://blog.csdn.net/xh870189248/article/details/81382279>

*
28、 Esp8266进阶之路第十九篇【高级篇】:
百万条消息免费之乐鑫esp8266使用TCP直连模式MQTT协议接入阿里云物联网平台,支持私家服务器对接,支持阿里云规则引擎。(附带Demo)
<https://blog.csdn.net/xh870189248/article/details/83149619>

<>目录:

<>
文章目录

* 目录: <https://blog.csdn.net/xh870189248/article/details/80284827#_34>
* @[toc] <https://blog.csdn.net/xh870189248/article/details/80284827#toc_36>
* 一、前言; <https://blog.csdn.net/xh870189248/article/details/80284827#_38>
* 二、效果图和设备连线; <https://blog.csdn.net/xh870189248/article/details/80284827#_49>
* 三、DHT11的时序解读;
<https://blog.csdn.net/xh870189248/article/details/80284827#DHT11_63>
* 四 、DHT11的代码解读;
<https://blog.csdn.net/xh870189248/article/details/80284827#_DHT11_101>
* 五 、DS18B20的代码解读;
<https://blog.csdn.net/xh870189248/article/details/80284827#_DS18B20_193>

<>一、前言;

话说在群看到蛮多人不知道8266有很多强大的地方,比如独立驱动传感器比如 DS18B20
,强大之处,无所不在的,可以省去我们很多其他资源,比如现在很多人都是通过89C52来串口通讯8266的AT 指令来操作上报温湿度传感器,这样的想法有点看小了
8266 ,8266可以单独采集温湿度传感器进而上传到服务器哦!

*
驱动经典的温度传感器 DS18B20 ,串口打印出温度;

*
驱动经典的温湿度传感器 DHT11 ,串口打印出温度和湿度;

<>二、效果图和设备连线;

* ds8b20和dht11采集的温度误差一度,原因在于ds18b20的采集精度12Bit比dht11的8Bit高!

* 本博文的实物接线图;


<>三、DHT11的时序解读;

设备的信息,我相信网上很多大神都讲述的非常清楚,我这里都不再过多详细说了;

* 产品测量范围:湿度:20-90%RH; 温度: 0-50℃ ;
* 测量精度:8Bit;
* 通讯协议:单向双线通讯,DATA 用于微处理器与
DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零;
通讯的过程,我相信网上很多大神都讲述的非常清楚,同样的,我这里都不再过多详细说了;

* ①:8266拉低总线,下降沿触发dht11,低电平持续至少 18ms , 再拉高电平,等待dht11是否有回复拉低电平;
* ②:此刻dht11会拉低电平响应信号,持续80us,表示正确开始通讯,此刻开始拉高电平持续80us, 准备传送数据!
* ③:此刻传来的数据是0或者1,注意0的高电平持续时间为26us~28us,而1的高电平持续时间为80us(这个各有说法,总的来说是80us) ,
这个是不是和红外线的通讯很相似啊?
* ④: 通讯完毕之后,需要8266主动拉高电平,因为dht11只有MCU主动请求,才会读取温湿度,如果不主动拉高,否则一直在读取温湿度!
通讯流程总图:



当发出数据0的时序图:



当发出数据1的时序图:



<>四 、DHT11的代码解读;

* 初始化端脚GPIO5: //注意修改此端脚。需要修改对应的GPIO寄存器
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U, FUNC_GPIO5);
* 读数据之前的时序: //禁止端口中断操作 ets_intr_lock(); // 设置连接DHT11的引脚输出为高,持续20毫秒
GPIO_OUTPUT_SET(DHT_PIN, 1); delay_ms(20); // 设置连接DHT11的引脚输出为低,持续20毫秒
GPIO_OUTPUT_SET(DHT_PIN, 0); delay_ms(20); // 设置连接DHT11的引脚设置为输入,并延时40微秒,准备读写
GPIO_DIS_OUTPUT(DHT_PIN); os_delay_us(40); //
限时等待连接DHT11的引脚输入状态变成0,即等待获取DHT响应,如长时间未变为0则转为读取失败状态 while
(GPIO_INPUT_GET(DHT_PIN) == 1 && i < DHT_MAXCOUNT) { if (i >= DHT_MAXCOUNT) {
goto fail; } i++; }
* 核心代码: // 通过循环读取DHT返回的40位0、1数据 for (i = 0; i < MAXTIMINGS; i++) { //
每次循环计数归零 counter = 0;
//如果输入引脚状态没有改变,则计数加1并延时1微妙,如果计数超过1000,也就是说同一输入状态持续1000微妙以上,或者输入状态改变,则结束while循环
while (GPIO_INPUT_GET(DHT_PIN) == laststate) { counter++; os_delay_us(1); if
(counter == 1000) break; } //记录最新的输入状态 laststate = GPIO_INPUT_GET(DHT_PIN);
//如果计数超过1000,结束for循环 if (counter == 1000) break; //
根据读取时序,DHT相应开始后,第三次脉冲跳变后的高电平时间长短则为0或者1的值,尔后每次先一个50微妙的开始发送数据信号后为具体数据,据此规律进行脉冲读取
//如果为代表0、1数据的脉冲,则读取值,少于模块定义的时长为0,大于为1,通过位操作将收到的5组8位数据分别存入data0至4中,分别代表湿度整数、湿度小数、温度整数、温度小数及校验和的值
if ((i > 3) && (i % 2 == 0)) { //默认为0,则左移动一位,最低一位补0 data[bits_in / 8] <<= 1;
//如果大于32us,则数据为1,和1相与,最低位为1 if (counter > BREAKTIME) { data[bits_in / 8] |= 1;
} bits_in++; } }
*
注意事项:

*
此时序将收到DHT11的 5组8位数据,也就是 int byte[4], 提示1Byte=8bit , 分别是
湿度整数、湿度小数、温度整数、温度小数及校验和的值。

*
收到5组8位数据后,则计算校验和为:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位;
//根据data前4位计算校验和,保留低八位 int checksum = (data[0] + data[1] + data[2] + data[3])
& 0xFF; //如果计算得到的校验和与读取到的不一致,则表示读取失败 if (data[4] != checksum) { goto fail; }
<>五 、DS18B20的代码解读;

*
第一次接触ds18b20是在大二2015年时候,老师说个什么ds, 印象不深刻,记得就是一个传感器,想着应该是很复杂吧。现在再来复习一遍,温故而知新!

*
ds18b20的操作比上面的dht11逻辑稍微复杂些,其实我觉得也差不多;

*
大家可参考此视频讲解:点我观看
<http://www.le.com/ptv/vplay/30520797.html?ch=sogou_sv&fromvsogou=1>

/*******************************************************************************
* 函 数 名 : Ds18b20Init * 函数功能 : 初始化 * 输 入 : 无 * 输 出 : 初始化成功返回1,失败返回0
*******************************************************************************/
uint8 Ds18b20Init() { int i; PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U,
FUNC_GPIO14); GPIO_OUTPUT_SET(DSPORT, 0); //将总线拉低480us~960us os_delay_us(642);
//延时642us GPIO_OUTPUT_SET(DSPORT, 1); //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
while (GPIO_INPUT_GET(DSPORT)) //等待DS18B20拉低总线 { Delay1ms(1); i++; if (i > 5)
//等待>5MS { return 0; //初始化失败 } } return 1; //初始化成功 }
/*******************************************************************************
* 函 数 名 : Ds18b20WriteByte * 函数功能 : 向18B20写入一个字节 * 输 入 : com * 输 出 : 无
*******************************************************************************/
void Ds18b20WriteByte(uint8 dat) { int i, j; for (j = 0; j < 8; j++) {
GPIO_OUTPUT_SET(DSPORT, 0); //每写入一位数据之前先把总线拉低1us i++; GPIO_OUTPUT_SET(DSPORT,
dat & 0x01); //然后写入一个数据,从最低位开始 os_delay_us(70); //延时68us,持续时间最少60us
GPIO_OUTPUT_SET(DSPORT, 1); //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值 dat >>= 1; } }
/*******************************************************************************
* 函 数 名 : Ds18b20ReadByte * 函数功能 : 读取一个字节 * 输 入 : com * 输 出 : 无
*******************************************************************************/
uint8 Ds18b20ReadByte() { uint8 byte, bi; int i, j; for (j = 8; j > 0; j--) {
GPIO_OUTPUT_SET(DSPORT, 0); //先将总线拉低1us i++; GPIO_OUTPUT_SET(DSPORT, 1);
//然后释放总线 i++; i++; //延时6us等待数据稳定 bi = GPIO_INPUT_GET(DSPORT); //读取数据,从最低位开始读取
/*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/ byte = (byte >> 1) | (bi << 7);
os_delay_us(48); //读取完之后等待48us再接着读取下一个数 } return byte; }
/*******************************************************************************
* 函 数 名 : Ds18b20ChangTemp * 函数功能 : 让18b20开始转换温度 * 输 入 : com * 输 出 : 无
*******************************************************************************/
void Ds18b20ChangTemp() { Ds18b20Init(); Delay1ms(1); Ds18b20WriteByte(0xcc);
//跳过ROM操作命令 Ds18b20WriteByte(0x44); //温度转换命令 // Delay1ms(100);
//等待转换成功,而如果你是一直刷着的话,就不用这个延时了 }
/*******************************************************************************
* 函 数 名 : Ds18b20ReadTempCom * 函数功能 : 发送读取温度命令 * 输 入 : com * 输 出 : 无
*******************************************************************************/
void Ds18b20ReadTempCom() { Ds18b20Init(); Delay1ms(1); Ds18b20WriteByte(0xcc);
//跳过ROM操作命令 Ds18b20WriteByte(0xbe); //发送读取温度命令 }
/*******************************************************************************
* 函 数 名 : Ds18b20ReadTemp * 函数功能 : 读取温度 * 输 入 : com * 输 出 : 无
*******************************************************************************/
int Ds18b20ReadTemp() { int temp = 0; uint8 tmh, tml; Ds18b20ChangTemp();
//先写入转换命令 Ds18b20ReadTempCom(); //然后等待转换完后发送读取温度命令 tml = Ds18b20ReadByte();
//读取温度值共16位,先读低字节 tmh = Ds18b20ReadByte(); //再读高字节 temp = tmh; temp <<= 8; temp
|= tml; return temp; }
* 本博文硬件下载:https://download.csdn.net/download/xh870189248/10410259
<https://download.csdn.net/download/xh870189248/10410259>
* 欢迎上车QQ群:434878850

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信