|
本帖最后由 LomoSnap 于 2017-12-26 21:36 编辑
前几天夜市上地摊看到个五块钱的闹钟,感觉外壳不错可以DIY一下,然后这两天花了点闲时间做了个hass的桌面状态显示,可以显示室内室外温湿度,天气,空气质量;注意 由于这只是一个显示状态的表,所以所有数据都是来自hass发送的mqtt信息,不直接进行采集数据。 因为一开始搞全屏刷新速度实在惨不忍睹,所以后来改成了分块刷新,只刷新有更改的地方。
关于快递追踪显示,需要在树莓派或其他设备上跑一个用node写的js,数据库使用了sqlite,由于还没开发前端(懒),所以目前往数据库里面添加单号需直接操作数据库,我是用了SIDUDatabase Web GUI进行的数据库操作,使用了node的xto的库,无需自己申请快递API,由于这么小的屏显示中文效果会比较坑爹(还是懒),直接把返回的数据用了Google的翻译接口翻译成英文进行显示。程序每五分钟请求一次数据,与数据库中保存的上次最后一条数据更新时间进行比对,如果不一致就会给设备发送mqtt消息并显示最新的跟踪信息,这时设备会哔的响一下,并且会有呼吸灯闪烁四下。十秒钟后自动返回正常显示状态界面。
至于代码嘛 各位大佬就表吐槽了,俺node和Arduino初学者,代码应该可能有些情况会有一些bug,而且代码里面用了N多的if套着if,写的js运行多天后有概率会莫名会崩溃,所以建议用pm2做一下守护进程崩溃自动重启。
先上效果图。
所需材料:
NodeMCU一片(其他esp8266可能对应接线所有不同,请自行更改)
st7735 1.8'' spi屏幕一块
有源蜂鸣器一个
ws2812八位全彩灯环一只
如何向设备发送信息: 向home/notify/1这个mqtt发送json,格式如下
{'backlight':'','clean':'','weather':'','aqi':'','bedroomtmp':'','outhuy':'','outtmp':'','bedroomhuy':'','light':'','notify':'','head':'','r':'','g':'','b':''}
含义解释
backlight: on/off 设备屏幕的背光控制,可以在hass里面通过自动化进行设定当夜晚所有灯关闭后也关闭设备的屏幕背光。
clean: 1 清屏控制,设定强制清屏,在快递显示完毕后设备会向hass请求整个屏幕的信息以便回到正常状态显示界面,此时应为1 清屏刷新。 平时局部刷新时无需填写任何信息。
weather:来自hass的信息,使用雅虎天气传感器作为信息源。由于这个信息源有时会反馈为文字状态例如”sunny“,有时又会反馈为数字状态信息源例如”13“,所以Arduino代码里面把文字状态和数字状态均进行了判断,由于天气状态之多,所以这段代码占据了好长,,,,,
aqi:空气质量,可以是来自天气信息的数据,也可以是来自你的空气质量传感器的信息。
bedroomtmp: 卧室温度,信息来自你的传感器。
outhuy:室外湿度,可来自天气信息或你的传感器信息。
outtmp:室外温度,同上。
bedroomhuy: 卧室湿度,来自你的传感器信息。
light:效果图中“Bedroom Lamp is on."位置的信息,你可以传送灯的信息,或者其他你需要的信息。
notify: 快递跟踪或其他提醒正文,如需换行可以在信息中插入\n换行符。
head: 快递跟踪或其他提醒标题,最长可发送16个字符,大于16会自动换行侵占正文显示位置导致字符重叠
r,g,b, 显示提醒时呼吸灯的颜色,可以进行自定义,例如圆通橙色,申通绿色,中通蓝色,韵达红色等等(代码里面没写这个功能,默认都是一个颜色红色,有兴趣的小伙伴并且能看懂我写的shit一样的代码的话可以自己开发一下)
注意:
重要提示!!!!!!
重要提示!!!!!!!
重要提示!!!!!!!!
不管是全局刷新clean为1,还是clean无任何信息进行局部刷新,json信息必须完整的发送,不需要更新的信息对应项目不填写任何信息即可。
例如 我开机首次请求完所有数据后,需要单独更新卧室温度到25.0度,那么发送的消息就是这样的:
{'backlight':'','clean':'','weather':'','aqi':'','bedroomtmp':'25.0','outhuy':'','outtmp':'','bedroomhuy':'','light':'','notify':'','head':'','r':'','g':'','b':''}
不能这样单独发送:
{'bedroomtmp':'25.0'}
这样单独发送会导致nodeMCU崩溃重启,,,,(还是代码写的渣,,,)
如何使用:
ST7725连接到NodeMCU的硬SPI接口,RST GPIO3 ,DC GPIO5。背光 GPIO4
有源蜂鸣器 GPIO10
ws2812 GPIO1
下载Arduino代码和库,打开Arduino工程文件,把你的Wi-Fi名和密码,mqtt地址,用户名密码填好刷写到NodeMCU上,注意要用我打包libraries里面的库。
hass添加雅虎天气(entity_id为 weather.yweather)
在hass的automations.yaml里面添加我打包的内automations.txt的内容,记得把对应的entity_id改成你自己传感器的entity_id,小心空格缩进和符号。reload一下automations,然后把NodeMCU上电,如果一切正确的话 你应该能看到正确的显示。
快递追踪:
npm安装sqlite3,xto,mqtt,node-google-translate-skidz这几个库,根据需要可能需要-g 或者--save参数,请尝试,,,
编辑package.js 把里面你的mqtt服务器地址(本机话就是127.0.0.1),账户密码更改对应。然后运行node package.js
如何添加单号:用sqlite3数据库读写工具,随便什么都行,可以跑一个Apache2服务器上面运行SIDU Database Web GUI进行操作,往数据库里面number字段添加行填写单号,
目前已知bug: id字段要手动填写并保证连续,如果中间某一条的话后面条目的id也要更改,
比如共有4条单号,
id:1,number:123456
id:2,number:2345
id:3,number:098776
id:4,number:56789
假如我要删除id:2,numbe:2345这条,那么id:2下面的条目,要重新更改id
id:1,number:123456
id:2,number:098776
id:3,number:56789
否则程序会出错,崩溃,或者无法识别正确的条目数。(还是程序写的渣,,,)
进行数据库操作后无需重启package.js,程序会在下一个循环请求周期(每5分钟一次)更新。
另:固件改编自老高sonoff固件,再次感谢。
|
评分
-
查看全部评分
|