智能家居入门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. 整 ...
随机推荐
- luogu p1101 单词方阵
https://www.luogu.org/problem/show?pid=1101 很恶心的代码 就是八个方向都搜索 #include<bits/stdc++.h> using na ...
- Redis之hash数据结构实现
参考 https://www.cnblogs.com/ourroad/p/4891648.html https://blog.csdn.net/hjkl950217/article/details/7 ...
- VS2012 QT程序打包部署详解
1.设置安装程序集 InstallShield安装完成后,执行以下步骤右键解决方案-->添加-->新建项目-->其他项目类型-->安装和部署,具体操作如下图: 2.发布程序 在 ...
- css3 导入字体
在CSS中导入字体或是字体ICON @font-face{ src: url("具体的字体地址"), url("具体的字体地址"); }
- shell 判断文件是否是可执行文件
测试变量指定的文件是否存在且是可执行文件.如果存在且是可执行文件,则执行该文件,否则通过chmod命令赋予该文件可执行权限. //test.sh #!/bin/bash echo "ente ...
- java 替换字符串中的中括号
正确方式:"[adbdesf]".replaceAll("\\[", "").replaceAll("\\]", &qu ...
- qt忙等与非忙等
非忙等: void delay(int msec) { QTime end = QTime::currentTime().addMSecs(msec); while( QTime::currentTi ...
- Python3 循环语句(十)
Python中的循环语句有 for 和 while. Python循环语句的控制结构图如下所示: while 循环 Python中while语句的一般形式: while 判断条件: 语句 同样需要注意 ...
- java-IO-基本输出输入流
/ 标准输入输出流: 直接类名调用 一经创建无法改变 public static final PrintStream err “标准”错误输出流. public static final InputS ...
- kvm虚拟机添加网卡
前几篇文章介绍了有关KVM安装虚拟机以及如何给虚拟机添加硬盘,今天我们再来介绍下有关如何给KVM虚拟机添加网卡. 给KVM虚拟机添加网卡,可以分为两种形式:图形界面的和virsh attach-int ...