智能家居入门DIY——【四、组合】
前面几篇介绍了一些传感器和代码,这篇介绍一下把它们组合起来。之所以单独列出这部分,原因在于组合更多功能的时候发现使用软串口库驱动ESP8266时由于内存过小导致发送失败甚至整个系统无法工作的情况。所以,我只组合了DHT11、火焰传感、MQ-9这几个传感器。今天优化了ESP8266部分的代码之后,实际测试时还可以用起一个GP2Y10,再多就不行了,而且包括DHT11、GP2Y10都不是使用现成的库文件,而是自己写了一些代码。暂时确实没有更多精力去自己写软串口通讯的部分了。首先看一下DHT11的代码:
// DHT11SimpleRead.h #ifndef _DHT11SIMPLEREAD_h
#define _DHT11SIMPLEREAD_h #if defined(ARDUINO) && ARDUINO >= 100
#include "arduino.h"
#else
#include "WProgram.h"
#endif class DHT11SimpleRead
{
public:
DHT11SimpleRead(unsigned int p);
bool read();
float temperature=5.0;
float humidity=50.0; private:
unsigned int pin;
unsigned int bits[];
}; #endif
//
//
// #include "DHT11SimpleRead.h" DHT11SimpleRead::DHT11SimpleRead(unsigned int p)
{
pin = p;
} bool DHT11SimpleRead::read()
{
int cnt = ;
int idx = ; //发送命令开始工作
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW);
delay(); //至少18毫秒拉低
digitalWrite(pin, HIGH);
delayMicroseconds(); //20-40微秒拉高 //转换到主机接收
pinMode(pin, INPUT);
unsigned int loopCnt = ; //等待80微秒左右的拉高结束
while (digitalRead(pin) == LOW)
if (loopCnt-- == ) return; loopCnt = ; //等待80微秒左右的拉低结束
while (digitalRead(pin) == HIGH)
if (loopCnt-- == ) return; //开始接收40位数据
for (int i = ; i<; i++)
{
loopCnt = ;
while (digitalRead(pin) == LOW) //每一位都是从低开始,当低结束时,根据电平长短来确定是0还是1
if (loopCnt-- == ) return; unsigned long t = micros(); //开始计时 loopCnt = ;
while (digitalRead(pin) == HIGH) //等待新号变低的时间决定了位的高低
if (loopCnt-- == ) return; if ((micros() - t) > ) bits[idx] |= ( << cnt); //一般,26-28微秒是0,29-70微秒是1 //接收满8位开始下一字节
if (cnt == )
{
cnt = ;
idx++;
}
else cnt--;
}
//传输完成之后,DHT11会拉低单总线50微秒。不处理了。
//接收完成写入数据
temperature = bits[];
humidity= bits[];
//进行校验
return (unsigned int)bits[] + bits[] + bits[] + bits[] == (unsigned int)bits[];
}
根据时序写驱动并不是很麻烦。这样就得到了两个数值,今天在测试的时候发现有时读取的值并不正确,但是刚刚上电的时候是正确的,反复检查并优化了一些代码之后没有再出现这个问题,如果再出现可能就是电路设计有问题了。
然后针对ESP8266发送数据比较长进行了一点优化,当然这部分完全可以做的更好一些,但是感觉没有什么必要了,毕竟就是当一个玩意玩的,即使付出更多努力结果可能也只是多加一个传感器——而我并不打算得到温湿度、火焰、燃气以外的数据。包括颗粒物传感器,我也只是打算放到另一块Arduino上,与语音识别和红外发射放到一起做一个简单的语音控制器来控制一些红外遥控的设备,例如自动开关空气净化,语音控制电视、窗帘等。这个优化主要是针对POST部分的数据比较长,把它按行拆开透传;也可以限定每次透传的数据量。当然,无论如何,减少字符串占用的堆栈、尽早的回收它们是努力的方向:
bool ESP8266SoftwareSerialHTTPPOST::postString(String line)
{
if (doATCommand("AT+CIPSEND=" + (String)(line.length()+), ">", deffStr, )) {
if (doATCommand(line, "SEND OK", "FAIL", )) {
return true;
}
else {
Serial.println("Send:err");
Serial.println(resultLine);
}
}
else {
Serial.println("Post:ERROR" + Crlf + line + Crlf + line.length());
Serial.println(resultLine);
}
return false;
}
需要注意的是,长度的计算多2字节,因为我使用的是println,而line并没有加上\r\n。
另外,为了加速处理,除了原来对正确返回值"OK“等、超时处理之外,也对"ERROR"、"No AP"等进行了处理,这样可以快速从对串口的等待中返回。
最后,对这些功能进行组合,得到的结果还是比较令人满意的,它已经连续工作了12小时以上,并没有出现什么其他问题。

智能家居入门DIY——【四、组合】的更多相关文章
- 智能家居入门DIY——【一、ESP8266之软串口HTTP请求】
前段时间做了一个激光雕刻,玩的不亦乐乎.对Arduino大感兴趣,于是又入手一块20大洋版,配上买学习套件时的诸多零件——红外发射管.一体化红外接收头.DHT11温湿度传感器.ESP8266等,以及某 ...
- 智能家居入门DIY——【六、使用OneNet后台处理数据】
OneNet使用起来要比lewei50复杂一些,它没有前台需要自己开发.命令下发也和之前介绍的lewei50有一些区别,这里着重介绍一下使用MQTT协议来进行通讯. 一.准备 1.Esp8266开发板 ...
- 智能家居入门DIY——【七、添加一个LCD12864吧】
今天加了一个LCD12864,IC看说明上是ST7567,结果一顿U8g2,发现两个问题: 1.买的时候不知道是卖家写的我理解错了还是怎么了,反正是不出汉字的. 2.U8g2太大了…………占了uno的 ...
- 智能家居入门DIY——【五、执行命令】
前面几篇介绍了ESP8266使用AT命令来连接WIFI实现一系列功能.这一篇介绍一下使用Wemos D1 Wifi来进行开发,当然也可以用常见的8针ESP8266来完成(只是需要按网上的方法将Ardu ...
- 智能家居入门DIY——【三、GP2Y10之颗粒物传感器】
这个传感器接线算比较简单的,程序也不麻烦.不过这东西是颗粒物传感器吧,不是神马PM2.5(总悬浮颗粒物),不是神马PM10(可吸入颗粒物).插个螺丝刀进去度数也是变的,不是说的很清楚原理是反光嘛……… ...
- 智能家居入门DIY——【二、LD3320之语音识别】
前一篇说了一下只有RX,TX,VCC,GND的WIFI模块软串口通讯:在实现了远程观察数据,类似的就可以实现远程控制.接下来说一下近距离控制,很多情况下应用语音识别技术无疑比掏出手机操作要更人性化一些 ...
- DIY智能家居——零基础入门篇
概要 本文主要根据笔者从零开始接触硬件,以小白视角开启IoT探索,根据相关资料DIY一个温湿度传感器.后经过探索发现新大陆--Home Assistant&Homebridge,最终实现了一个 ...
- 智能家居DIY
近期智能家居比較火,将房子简单改造下,也算体验智能家居. 本文解说的是用无线的方式,长处是:不用改造现有线路,直接安装模块就可以实现想要的功能,花的钱也较少,共六百左右 =============== ...
- 入门智能家居,从 IFTTT 到 HomeKit 自动化(二)
入门智能家居,从 IFTTT 到 HomeKit 自动化(二) 目录 0. HomeKit.HomeBridge.HomeAssistant 分别是什么?关系是什么? 1. 开始前的准备 2. 整 ...
随机推荐
- 20145326 《Java程序设计》第4周学习总结
20145326 <Java程序设计>第4周学习总结 教材学习内容总结 第六章 一.何谓继承 1.继承共同行为 面向对象中,子类继承父类,避免重复的行为定义.不过并非为了避免重复定义行为就 ...
- 关于Drupal中使用hook_schema建立数据库报错PDOException: SQLSTATE[42000]的解决办法
报错信息如下:PDOException: SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too l ...
- CONFLICT (modify delete)冲突修复
Demo git:(test) git merge feature CONFLICT (modify/delete): path/to/path/config.inc.php deleted in H ...
- Web漏洞挖掘之网络信息探测
我们在搜集目标系统信息的时候主要需要搜集的是:目标服务器系统信息(IP,服务器所用系统等):目标网站子域名:目标网站(服务器)的开放端口:目标域名信息.目标网站内容管理系统(CMS)等. 一.子域名搜 ...
- ubuntu18.04系统安装+基本环境配置【原创】
平台信息:PC:ubuntu18.04.i5.七彩虹GTX1060显卡.固态硬盘.机械硬盘 作者:庄泽彬(欢迎转载,请注明作者) 说明:在原本的电脑买一个独立显卡,装上去之后,出了各种问题,虽然后面勉 ...
- POJ 2443 Set Operation(压位加速)
http://poj.org/problem?id=2443 题意: 有1000个集合,每个集合有至多10000个数,之后输入多个询问,判断询问的两个数是否位于同一个集合. 思路: 位运算...很强大 ...
- classloader的演进
classloader从1.6到1.7整体分成了两个版本.重点区别就是并行类加载. 1.6版本 protected synchronized Class loadClass(String name, ...
- angular的 表单
一般来讲表单可能遇到的问题:1.如何数据绑定.2.验证表单.3.显示出错信息.4.整个form的验证.5.避免提交没有验证通过的表单.6.防止多系提交. input属性:nameng-modelng- ...
- arcgis api for silverlight开发系列之二:缓存图层与动态图层及图层总结 .
本文摘自:http://blog.csdn.net/leesmn/article/details/6916458(很优秀的博客) 作为ESRI的平台的一份子arcgis api for silve ...
- HTML5-canvas实例:2D折线数据图与2D扇形图
基础知识: <canvas id="demo" width="400" height="400"></canvas> ...