数码之家

 找回密码
 立即注册
搜索
查看: 1700|回复: 7

[ARM] 8266家庭空气检测

[复制链接]
发表于 2020-4-16 14:19:11 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
基于Arduino NANO 和 8266
项目实现框架
其中8266也采用Arduino进行编程主要工作为:
1.连接贝壳物联网站
2.保持设备在线
3.将NANO串口送来的数据进行转发
NANO部分
nano部分需要完成的工作比较简单,主要就是通过analogic函数读出引脚的模拟电压值,然后保存。同时负责PM2.5模块的驱动工作。这里有一篇CSDN的范文讲的很不错,贴出原帖地址:
读出以上数据后,我们需要将这个数据封包成一个我没所确定的格式来进行与8266的通信。这里我自定义了一种数据格式如:!data,形如这种格式。我们在接收到数据后即可通过检测来进行中间段的字符串的截取工作
。同时NANO也需要负责驱动一块OLED显示器实时的显示本地的数值。这里采用了0.96inch OLED显示屏。通过IIC总线和NANO进行数据通信。调用的是u8g2库。在此之中我们也很不幸的遇到了一个很令人迷惑的事情。不知道是由于u8g2库中变量过多的原因还是什么。竟然提示动态内存占用了83%。非常罕见值得一提。还有一个就是可能买的NANO开发板质量不行。下载容易受到干扰。这时候需要重新插拔。并且不能接别的外围器件才能下载成功。烧录的时候需选用(old bootloader)这一选项。在此备注以防忘记。
8266部分
8266没有采用常规的AT模式,因为我觉得8266本来的性能就很强悍。只把它当作一个wifi网卡莫名的有点大材小用。而且把wifi联网部分和传感器部分分离开有助于增强代码的可读性。同时也有利于培养模块化编程的思想。开头调用wifimanager库来实现网页配置连接wifi的功能。之后负责TCP连接贝壳物联客户端并保持设备在线。然后的部分就是数据处理部分。
由于我们所定义的数据格式是形如这种:!45,!32,!56,。所以我们只需检测出所有的位置并以此切割即可得到字符串。代码如下:
     int datStart1 = 0, datEnd1 = 0,datStart2 = 0, datEnd2 = 0,datStart3 = 0, datEnd3 = 0;
     String datstr1,datstr2,datstr3;
     datStart1 = comdata.indexOf("!");
     datEnd1 = comdata.indexOf(",", datStart1);
     datstr1 = comdata.substring(datStart1+1, datEnd1);
     mq_2 = datstr1.toInt();
     
     datStart2 = comdata.indexOf("!",datStart1+1);
     datEnd2 = comdata.indexOf(",", datEnd1+1);
     datstr2 = comdata.substring(datStart2+1, datEnd2);
     mq_135 = datstr2.toInt();
     
     datStart3 = comdata.indexOf("!",datStart2+1);
     datEnd3 = comdata.indexOf(",", datEnd2+1);
     datstr3 = comdata.substring(datStart3+1, datEnd3);
     pm2_5 = datstr3.toInt();
之后我们就得到了由NANO采集的数据。我们所需要的就是将其上传至bigiot。这边采用了贝壳物联的update函数接口。方便网页读取数据。由于还需配套开发手机APP来检测数据。所以我们还需要一个向手机客户端发送数据的部分。说到这我就很迷惑了。原本打算是通过把获得的数据封装成json格式的字符串进行发送。再在手机APP开发中用Json.prase就可以很方便的解析出我们所需要的。但是这网站貌似对content内容为json格式的字符串不兼容。调试了很久都连接不上。最后只能简单的封装成“12-52-12”这种格式然后在app中通过split以“-”为分隔符进行分割。导致有点多此一举的感觉。其实在这里是推荐传输数据尽量使用json格式的字符串的。因为这样代码可移植性会得到大大的增强。
APP部分
APP部分比较简单,采用了HXBUILER开发软件。将一个HTML网页封装为APP。负责登录并接收数据就可以。需要一丢丢JS基础。自己对着教程看看就懂了。直接贴上代码。
<!DOCTYPE html>
<html>
<head>
   <meta charset="utf-8">
   <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
   <title></title>
   <script src="js/mui.min.js"></script>
   <link href="css/mui.min.css" rel="stylesheet"/>
   <script type="text/javascript" charset="utf-8">
    mui.init();
   </script>
</head>
<body>
<!-- <button id="btn1" type="button">打开</button>
<button id="btn2" type="button">关闭</button> -->
<br>
<div align="center">
<label id="lb1">连接结果</label>
</div>
<br>
<br>
<label id="text1">MQ_2: </label>
<label id="lb_2">0</label>
<br>
<br>
<label id="text2">MQ_135: </label>
<label id="lb_135">0</label>
<br>
<br>
<label id="text3">PM2.5: </label>
<label id="lb_25">0</label>
<br>
<br>
<br>
<br>
<script type="text/javascript">
var storage = window.localStorage;
var ws = new WebSocket("ws://www.bigiot.net:8383");
var lb = document.getElementById("lb1");
var lb_2 = document.getElementById("lb_2");
var lb_135 = document.getElementById("lb_135");
var lb_25 = document.getElementById("lb_25");
var a=storage.sw1;
ws.onopen = function()
{
lb.innerText = "连接中。。。"
};
   
ws.onmessage = function (evt)
{
var received_msg = evt.data;
var obj = JSON.parse(received_msg);
if(obj.C != undefined)
{
var envir = obj.C;
var strs = new Array();
strs = envir.split("-");
lb_2.innerText = strs[0];
lb_135.innerText = strs[1];
lb_25.innerText = strs[2];
}
if(obj.M == "WELCOME TO BIGIOT")
{
ws.send('{"M":"checkin","ID":"17295","K":"0c7e4e0af"}')
lb.innerText = "连接成功"
}
if(obj.M == "ping")
{
ws.send('{"M":"checkin","ID":"17295","K":"0c7e4e0af"}')
}
};
</script>
</body>
</html>系统的联合调试
将8266通过串口于NANO连接,配置好互联网。通电,打开手机APP观察数据变化。其中8266成功启动后。灯会变成蓝色。实物图如下:
正常情况下:
打火机释放可燃气体:
手机APP截图:
配网检测界面:
引脚接线和后话
开发8266物联网这一块可谓是轻车熟路了但还是遇到了一些问题。例如:8266不能和nano共用一个电源否则会由问题。。。。其实我感觉这是nano太垃圾的问题不关我事。还有个设备喊话记得加D这样才表示是你自己第三方设备登录。再后面的通信内容不能包含json格式也是迷惑的很。接下来说一说接线:
mq_2--------->A0
mq_135------->A1
pm2_5-------->D2,A3
oled sda----->D4
oled scl----->D3
   
TX,RX接8266。
PM2.5模块具体接线:
所有项目打包合集:放在服务器/root/项目备份 下做备份啦。
补充 PCB的绘制和实物的焊接
后台贝壳的截图:
PCB实物图(忽略那根飞线,有可能是DC部分没接好反正只能走Arduino取电了。。)
还剩几块板子出邮费免费送也不知有没有人要嘿嘿,毕竟打板比邮费便宜。
项目随后打包上传github。容我整理整理。
PS:
整篇内容是以MD格式编辑,貌似数码之家直接支持MD来着?实时预览很正常。妙啊!

打赏

参与人数 2家元 +31 收起 理由
qingkong + 21 優秀文章
人艰不拆了 + 10

查看全部打赏

发表于 2020-4-16 16:58:49 | 显示全部楼层
8266可以拓展的应用还挺丰富的,楼主会玩。
回复 支持 反对

使用道具 举报

发表于 2020-4-16 17:06:31 | 显示全部楼层
ESP8266不是ARM架构哦,是Tensilica 的处理器。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-16 19:11:40 | 显示全部楼层
la45088d1 发表于 2020-4-16 17:06
ESP8266不是ARM架构哦,是Tensilica 的处理器。

a ha 这样得吗
回复 支持 反对

使用道具 举报

发表于 2020-4-17 08:38:32 | 显示全部楼层

是这样的
在这坛子里的分类 最多只能去arduino,要是跑lua javascript micropython 都没地方去了:lol:
回复 支持 反对

使用道具 举报

发表于 2020-4-17 17:00:58 | 显示全部楼层
用8266的一块Nodemcu或者ESP12就行了,完全不用NANO。你用的8266是ESP01,IO可用的太少。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-17 18:46:46 | 显示全部楼层
kindzhon 发表于 2020-4-17 17:00
用8266的一块Nodemcu或者ESP12就行了,完全不用NANO。你用的8266是ESP01,IO可用的太少。 ...

不行,ADC不够
回复 支持 反对

使用道具 举报

发表于 2020-4-17 20:45:06 | 显示全部楼层

ADC (analog to digital conversion)
On the ESP32 ADC functionality is available on Pins 32-39. Note that, when using the default configuration, input voltages on the ADC pin must be between 0.0v and 1.0v (anything above 1.0v will just read as 4095). Attenuation must be applied in order to increase this usable voltage range.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-8 04:01 , Processed in 0.234001 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表