前面几篇介绍了一些传感器和代码,这篇介绍一下把它们组合起来。之所以单独列出这部分,原因在于组合更多功能的时候发现使用软串口库驱动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——【四、组合】的更多相关文章

  1. 智能家居入门DIY——【一、ESP8266之软串口HTTP请求】

    前段时间做了一个激光雕刻,玩的不亦乐乎.对Arduino大感兴趣,于是又入手一块20大洋版,配上买学习套件时的诸多零件——红外发射管.一体化红外接收头.DHT11温湿度传感器.ESP8266等,以及某 ...

  2. 智能家居入门DIY——【六、使用OneNet后台处理数据】

    OneNet使用起来要比lewei50复杂一些,它没有前台需要自己开发.命令下发也和之前介绍的lewei50有一些区别,这里着重介绍一下使用MQTT协议来进行通讯. 一.准备 1.Esp8266开发板 ...

  3. 智能家居入门DIY——【七、添加一个LCD12864吧】

    今天加了一个LCD12864,IC看说明上是ST7567,结果一顿U8g2,发现两个问题: 1.买的时候不知道是卖家写的我理解错了还是怎么了,反正是不出汉字的. 2.U8g2太大了…………占了uno的 ...

  4. 智能家居入门DIY——【五、执行命令】

    前面几篇介绍了ESP8266使用AT命令来连接WIFI实现一系列功能.这一篇介绍一下使用Wemos D1 Wifi来进行开发,当然也可以用常见的8针ESP8266来完成(只是需要按网上的方法将Ardu ...

  5. 智能家居入门DIY——【三、GP2Y10之颗粒物传感器】

    这个传感器接线算比较简单的,程序也不麻烦.不过这东西是颗粒物传感器吧,不是神马PM2.5(总悬浮颗粒物),不是神马PM10(可吸入颗粒物).插个螺丝刀进去度数也是变的,不是说的很清楚原理是反光嘛……… ...

  6. 智能家居入门DIY——【二、LD3320之语音识别】

    前一篇说了一下只有RX,TX,VCC,GND的WIFI模块软串口通讯:在实现了远程观察数据,类似的就可以实现远程控制.接下来说一下近距离控制,很多情况下应用语音识别技术无疑比掏出手机操作要更人性化一些 ...

  7. DIY智能家居——零基础入门篇

    概要 本文主要根据笔者从零开始接触硬件,以小白视角开启IoT探索,根据相关资料DIY一个温湿度传感器.后经过探索发现新大陆--Home Assistant&Homebridge,最终实现了一个 ...

  8. 智能家居DIY

    近期智能家居比較火,将房子简单改造下,也算体验智能家居. 本文解说的是用无线的方式,长处是:不用改造现有线路,直接安装模块就可以实现想要的功能,花的钱也较少,共六百左右 =============== ...

  9. 入门智能家居,从 IFTTT 到 HomeKit 自动化(二)

    入门智能家居,从 IFTTT 到 HomeKit 自动化(二)   目录 0. HomeKit.HomeBridge.HomeAssistant 分别是什么?关系是什么? 1. 开始前的准备 2. 整 ...

随机推荐

  1. #ZLYD团队第二周项目总结

    ZLYD团队第二周项目总结 项目进展 确定项目内容.目标.实现计划 首先确定游戏界面的游戏区域中墙的位置,绘制其图形,并通过其中的方法,返回墙壁的位置等属性. 根据豆子的位置,绘制其图形. 初始化吃豆 ...

  2. Linux服务器使用tar加密压缩文件

    使用tar命令进行加密压缩时需要和OpenSSL进行结合 加密压缩命令如下: tar -zcf - filename |openssl des3 -salt -k passwd | dd of=fil ...

  3. AngularJs 控制台

    在控制台查看$scope对象 html: 通过控制器里面的一个元素来获取这个控制器的$scope var node=document.getElementById("NewsVote&quo ...

  4. hbase(三)coprocessor

    介绍 coprocessor这个单词看起来很神秘,直译为协处理器,其实可以理解成依赖于regionserver进程的辅助处理接口. hbae在0.92版本之后提供了coprocessor接口.目前hb ...

  5. Learning Ansible with Vagrant

    介绍 Vagrant介绍 Vagrant是一款构建虚拟开发环境的工具,Vagrant的使用依赖于VirtualBox,VMware等一些虚拟机,通过Vagrant能更加方便的管理虚拟机,同时还能够通过 ...

  6. eclipse下maven springMVC 整合 mybatis

    参考文档:http://blog.csdn.net/zhshulin/article/details/37956105   1.搭建maven工程,具体参见我另一篇博客:http://www.cnbl ...

  7. Java如何用一行代码初始化ArrayList

    参考链接: 1.Initialization of an ArrayList in one line 2.java怎么用一行代码初始化ArrayList

  8. C#皮肤之IrisSkin4.dll

    1. 将IrisSkin4.dll动态文件导入当前项目引用中.具体操作为:解决方案资源管理器->当前项目->引用->右键->添加引用,找到IrisSkin4.dll文件,然后加 ...

  9. 为了更好更方便地活着——爱上private

    刚开始接触OOP的时候,打心底里我不喜欢private与protected.我声明一个public然后不直接用它,不就跟private一样吗?在某些场合下,我还能偷偷地用一下public变量,这不是更 ...

  10. CF 160D Edges in MST 最小生成树的性质,寻桥,缩点,批量处理 难度:3

    http://codeforces.com/problemset/problem/160/D 这道题要求哪条边存在于某个最小生成树中,哪条边不存在于最小生成树中,哪条边绝对存在于最小生成树中 明显桥边 ...