智能家居入门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. 整 ...
随机推荐
- String StringBuilder StringBuffer 对比 总结得非常好
转自:http://www.iteye.com/topic/522167 作者:每次上网冲杯Java时,都能看到关于String无休无止的争论.还是觉得有必要让这个讨厌又很可爱的String美眉,赤裸 ...
- POJ 3320 Jessica‘s Reading Problem(哈希、尺取法)
http://poj.org/problem?id=3320 题意:给出一串数字,要求包含所有数字的最短长度. 思路: 哈希一直不是很会用,这道题也是参考了别人的代码,想了很久. #include&l ...
- Codeforces Round #401 (Div. 2) A,B,C,D,E
A. Shell Game time limit per test 0.5 seconds memory limit per test 256 megabytes input standard inp ...
- spark 累加历史 + 统计全部 + 行转列
spark 累加历史主要用到了窗口函数,而进行全部统计,则需要用到rollup函数 1 应用场景: 1.我们需要统计用户的总使用时长(累加历史) 2.前台展现页面需要对多个维度进行查询,如:产品.地 ...
- Java IO流-字节流
2017-11-05 17:48:17 Java中的IO流按数据类型分类分为两种,一是字节流,二是字符流.字符流的出现是为了简化文本数据的读入和写出操作. 如果操作的文件是文本文件,那么使用字符流会大 ...
- js搜索算法——二分搜索
二分搜索算法就是折半查找,是一种效率较高的查找方法.前提条件是要查找的数组是有序的.算法的实现还是相对简单的: function binarySearch(arr,item){ var min = 0 ...
- oracle非空约束
ALTER TABLE TB_ZJGL_DWSB_GRMX_LOG MODIFY HJQX NULL;
- STM32知识点纪要
1.GPIO BSRR(端口位设置寄存器)是赋1相应IO拉高,赋0无影响 BRR(端口位清除寄存器)是是赋1相应IO拉低,赋0无影响 2.UART 连线TX—TX,RX—RX 3.JTAG和SWD接口 ...
- MongoDB学习(五)使用Java驱动程序3.3操作MongoDB快速入门
[引言] 毕竟现在MongoDB还是出于成长阶段,所以现在网上相关的资料很少,而且大部分还都是针对于MongoDB的老版本的.再加上MongoDB的频繁升级.重大更新等等,导致菜鸟学习的难度增大. 好 ...
- css之grid layout代码解释
.wrapper { display: grid; grid-template-columns: repeat(3, 1fr);/*grid-template-columns CSS属性定义了网格列的 ...