摘要:寻思着实现个自动化控制玩玩。自从穹顶之下的信息被普及,不仅要出门带口罩,还要家里开空气净化器。效果图代码家庭空气质量管家为传感器口为继电器控制口引脚初始化网络串口监听颗粒温湿度烟雾继电器源码
背景
前阵子树莓派由于没外壳不小心短路烧掉了。最近得手nodeMCU的板子,不仅便宜还支持串口交互式调试,很是方便。寻思着实现个自动化控制玩玩。自从“穹顶之下”的信息被普及,不仅要出门带口罩,还要家里开空气净化器。于是照着知乎也DIY了一个。但作为一个程序员,不捣鼓一点硬件软件怎么可以,于是花了两三天捣鼓了lua,顺便配了个web端的语音播报,软硬件组合达到了期望的效果。(顺便吐槽一下tinyOS的组件式编程,文档也少得可怜)
实现思路硬件:
MQ烟雾/可燃气体传感器
dth温湿度传感器
空气颗粒物(pm1.0,pm2.5,pm10)传感器
继电器*4(用来控制 取暖器,加湿器,净化器,烟雾报警装置)
软件:
万能的web(html js jq)
php(负责爬天气预报和空气质量,以及和nodeMCU通讯)
坑用socket拼接http去获取天气,结果写完发现它的socket接受发送最大1440字节,本来想直接写进MCU做个lua server。可惜了,于是控制规则干脆写到前端,php做大量的数据获取支持。
用的空气颗粒物传感器接TX口,init.lua加载前会根据D3 D4 TX 来判断是否进入烧写模式,之前接继电器总是上电乱跳,最终把data out 的2口放到D3 D4,解决了这个问题。
效果图 nodeMCU代码(init.lua)--家庭空气质量管家 --sensor为传感器data口 --power为继电器控制口 --D0 CH1 0 --D1 CH2 0 --D2 CH4 0 --D3 MQ-DATA 1 --D4 DHT-DATA 0 --D5 CH3 0 --D6 DHT-VCC 1 --RX PM-TX Air={ pm010=0,pm025=0,pm100=0, temp=0,humi=0,smoke=1, gpio_pm=0,gpio_temp=0,gpio_humi=0,gpio_smoke=0, humi_power=0, pm_power=1, smoke_power=2, mq_sensor=3, dht_sensor=4, temp_power=5 } --引脚初始化 for pi=0,6,1 do gpio.mode(pi, gpio.OUTPUT,(pi==6)and gpio.PULLUP or gpio.FLOAT) gpio.write(pi,(pi==3 or pi==6)and gpio.HIGH or gpio.LOW) end --网络 wifi.setmode(wifi.STATION) wifi.sta.config("SSID","PASSWORD") --串口监听 uart.setup( 0, 9600, 8, 0, 1, 0 ) uart.on("data", function(data) if(string.len(data)==32 and string.byte(data)==66) then --颗粒 Air.pm010=tonumber(string.byte(data,11))*256+tonumber(string.byte(data,12)) Air.pm025=tonumber(string.byte(data,13))*256+tonumber(string.byte(data,14)) Air.pm100=tonumber(string.byte(data,15))*256+tonumber(string.byte(data,16)) --温湿度 _,Air.temp,Air.humi, _, _ =dht.read(Air.dht_sensor) --烟雾 Air.smoke=gpio.read(Air.mq_sensor) --继电器 Air.gpio_pm,Air.gpio_temp,Air.gpio_humi,Air.gpio_smoke=gpio.read(Air.pm_power),gpio.read(Air.temp_power),gpio.read(Air.humi_power),gpio.read(Air.smoke_power) end end, 0) --http srv=net.createServer(net.TCP) srv:listen(80,function(conn) conn:on("receive", function(client,request) local buf = "{" local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP") if(method == nil)then _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP") end local _GET = {} if (vars ~= nil)then for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do _GET[k] = v end end if(_GET.action == "read")then for key,value in pairs(Air) do buf=buf..key..":"..value.."," end elseif(_GET.action == "write")then gpio.write(_GET.pin,_GET.level) elseif(_GET.action == "debug")then node.input(_GET.data) end client:send(buf.."error:0}") client:close() collectgarbage() end) end)源码
https://github.com/Seasonley/...
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/22364.html
摘要:寻思着实现个自动化控制玩玩。自从穹顶之下的信息被普及,不仅要出门带口罩,还要家里开空气净化器。效果图代码家庭空气质量管家为传感器口为继电器控制口引脚初始化网络串口监听颗粒温湿度烟雾继电器源码 背景 前阵子树莓派由于没外壳不小心短路烧掉了。最近得手nodeMCU的板子,不仅便宜还支持串口交互式调试,很是方便。寻思着实现个自动化控制玩玩。自从穹顶之下的信息被普及,不仅要出门带口罩,还要家里...
摘要:对比操作前后的来定位内存泄露的根因所在。手机管家内存泄露每日监控方案目前手机管家的内存泄露每日监控会自动运行并输出是否存在疑似泄露的报告邮件,不论泄露对象的大小。 腾讯Bugly特约作者: 姚潮生 最原始的内存泄露测试 重复多次操作关键的可疑的路径,从内存监控工具中观察内存曲线,是否存在不断上升的趋势且不会在程序返回时明显回落。这种方式可以发现最基本,也是最明显的内存泄露问题,对用户价...
摘要:对比操作前后的来定位内存泄露的根因所在。手机管家内存泄露每日监控方案目前手机管家的内存泄露每日监控会自动运行并输出是否存在疑似泄露的报告邮件,不论泄露对象的大小。 腾讯Bugly特约作者: 姚潮生 最原始的内存泄露测试 重复多次操作关键的可疑的路径,从内存监控工具中观察内存曲线,是否存在不断上升的趋势且不会在程序返回时明显回落。这种方式可以发现最基本,也是最明显的内存泄露问题,对用户价...
摘要:虽然说数据包是手机之间传输,但是我们仍然需要依靠基站传输信令,运营商的钱还是要给的与人工智能小西原来技术包含了这么多黑科技呀那这些黑科技有什么应用呢,它跟人工智能又有什么关系呢小迪这可就多了。 showImg(https://segmentfault.com/img/remote/1460000019373664); 又是一个周末,小西与小迪坐在沙发上看新闻。 小西:小迪小迪,新闻里总...
摘要:供需对接提供中小微企业供需发布平台,降低中小微企业投入成本资源库建设质量基础设施相关的机构人才设备政策法规业务知识库,为企业提供一站式查询服务。 质量基础设施NQI一站式线上公共服务平台建设方案质量基础设施NQI一站式线上公共服务平台,本着基础业务在线办结,要素资源高效协同,特色服务培育品牌的平台产品思维,确立...
阅读 1336·2021-11-15 18:11
阅读 2485·2021-08-19 10:56
阅读 656·2021-08-09 13:42
阅读 756·2019-08-30 15:53
阅读 2051·2019-08-30 10:55
阅读 3104·2019-08-29 17:18
阅读 1364·2019-08-29 13:45
阅读 522·2019-08-29 13:15