全屋智能家居灯控系统体验 (从零开始智能家居app)

从零开始全屋智能家装,从零开始智能家具

视频加载中...

前两次我们通过ESPEasy和ESPHome两个固件制作了温湿度计接入homeassistant。对于homeassistant来说,这只是数据获取。作为智能家居的另一大应用-远程控制并没有体现。这次我们就来接入一个可以远程控制的台灯,体验一下homeassistant的远程控制。

如果仅仅只是用homeassistant远程控制台灯的开关,ESPEasy和ESPHome都可以做到,但是作为一个台灯,每次开关灯还要登陆homeassistant再点击开关,这就比较纠结了。所以我准备加上一个触摸开关,实现远程和触摸双控开关。首先要确定固件,要实现远程和触摸双控,ESPEasy我是不知道怎么办了,好在ESPHome支持自定义插件写入固件。不过ESPHome的自定义插件是用C++写的,对于我这种业余选手的C++连皮毛都算不上。不过官方文档中倒是说了,不会C++也可以照这示例修改。官方支持了的传感器倒是可以修改示例,也确实简单,但是自定义的说明就说得不清不楚了,自定义内容怎么写倒是知道,但是我折腾了半天也没搞清楚自定义的代码怎么刷进去。而且ESPHome的自定义固件也就是利用了arduino的相关内容,等研究清楚了还不如直接用arduino写esp8266的代码,还简单些。所以最后我也放弃了用ESPHome做台灯的想法。

作为一个业余选手,C++是我心中永远的痛。平时做点简单的东西,C就已经足够应付了,但是为了更高级一点的应用,我学习了一下python。用过python后再用C那简直就是折磨,但是为了硬件编程没办法,C也必须会点。直到有一天我发现了MicroPython,这个东西简直就是为我等业余选手量身打造的神器呀。MicroPython是什么就大家自己百度了,最大的好处就是可以用python控制硬件,其中一个主要的分支就是esp系列芯片,而且esp8266-01这种低配版模块居然也能用,但是512k的老版esp8266-01就不行了。

MicroPython的使用

  • 要使用MicroPython,首先要把固件写入芯片,固件可以到官网*载下**最新的,写入固件的软件也有很多种,我今天给大家介绍一个我觉得最简单的办法。首先要*载下**一个uPyCraft,这是一个国产的IDE,支持编辑代码和上传固件,个人感觉相当的好用,*载下**地址:https://gitee.com/dfrobot/upycraft/。*载下**后不用安装,直接打开,第一次会提示升级软件、固件、板卡等。升级完成后如下图,Tools中的Serial是选择esp8266连接到电脑的串口,board是你使用的板卡的类型,看得出来,支持的种类不少,而且还可以自己修改固件来支持列表中没有的板卡。

从零开始全屋智能家装,从零开始智能家具

uPyCraft

  • 没写入过MicroPython的板卡,选择串口后,会自动弹出刷写固件的窗口。board选择你的板卡,erase_flash选择yes会擦除固件的flash,com就是你连接的串口。Firmware Choose中的uPyCraft就是软件自带的固件版本,更新比官方滞后,并且进行了一定的修改,Users就是你自定义的固件了。我的esp8266-01用自带的固件会有点问题,所以我用的官方最新版的固件。

从零开始全屋智能家装,从零开始智能家具

固件写入界面

  • 选好后点击ok开始写入固件。第一个是到网上*载下**对应的固件,第二个是擦除flash,第三个就是写入固件了,等三个都100%后就完成固件的写入了。

从零开始全屋智能家装,从零开始智能家具

写入固件

  • 固件写入完成后就可以进入正题了,Tools中选好板卡类型和串口后可以看到uPyCraft的界面。左边是目录树,device是板卡的存储空间,用来存放你编写的代码,连接成功后可以看到左边出现一个小三角。sd不用管,esp系列用不上。uPy_lib是软件自带的库,MicroPython的库和Python的库还是有点区别的,所以MicroPython中常用的库都会有一个MicroPython专用版,一般是在原版库的名字前加一个u。workSpace是你的工作空间,就是一个你用来保存代码的文件夹,第一次点击会让你选一个文件夹。中间那块大的区域就是代码编辑区域,中间下方那块区域立即执行代码和显示一些调试信息的地方,连接板卡成功后会出现>>>。最右边是一些常用的快捷按钮,看图标就知道是干什么的,就不一一介绍了。

从零开始全屋智能家装,从零开始智能家具

软件界面

  • 下面来传入代码,先点击FileNew新建一个空白文档,将代码复制进去保存。代码我就不解释了,注释写的很详细,会Python的一看就懂,不会Python就直接复制就行了。

从零开始全屋智能家装,从零开始智能家具

代码编辑

from simple import MQTTClient
from machine import Pin
import network
import time
 
SSID = "" #wifi的名字
PASSWORD = "" #WiFi的密码
 
led = Pin(0, Pin.OUT, value=1)
sw = Pin(2, Pin.IN)
light_state = 0
 
SERVER = "192.168.." #mqtt服务器的IP
CLIENT_ID = "esp_light" #设备ID
state_topic = "/ESP_light/switch" #设备订阅的主题,接收设备状态
command_topic = "/ESP_light/GPIO/0" #客户端订阅的主题,控制设备
c = None
def connectWifi(ssid, passwd): #WiFi连接模块
 global wlan
 wlan = network.WLAN(network.STA_IF) #创建网络接口
 wlan.active(True) #允许网络接口
 wlan.disconnect() #断开连接
 wlan.connect(ssid, passwd) #连接到热点
 while(wlan.ifconfig()[0]==’0.0.0.0’):#判断是否连接到热点
 time.sleep(1)
 
def publish_msg(topic, msg): #回调函数,接收到消息后执行
 if msg == b’1’: #接收mqtt服务器命令主题的内容
 led.value(0)
 c.publish(state_topic, "1", retain=True) #发布设备状态主题内容
 light_state = 1
 print(’led on’)
 elif msg == b’0’:
 led.value(1)
 c.publish(state_topic, "0", retain=True)
 light_state = 0
 print(’led off’)
try:
 connectWifi(SSID, PASSWORD)
 server = SERVER
 c = MQTTClient(CLIENT_ID, server, 0) #连接mqtt服务器
 c.set_callback(publish_msg)
 c.connect()
 c.subscribe(command_topic) #订阅主题
 i = 0
 while True:
 #c.wait_msg() #阻塞模式
 c.check_msg() #非阻塞模式
 if sw.value() == 0: #手动开关控制
 light_state = ~light_state
 led.value(light_state)
 if light_state == 0:
 c.publish(state_topic, "1", retain=True)
 else:
 c.publish(state_topic, "0", retain=True)
 i = i + 1
 time.sleep(0.3)
except:
 machine.reset() #出现异常后自动重启
finally:
 #print(i)
 if(c is not None):
 c.disconnect()
 wlan.disconnect()
 wlan.active(False)
  • 在左边的文件树workSpace中选中你刚才保存的文件,拖到device上放开,中间下方的区域会显示上传进度,出现download ok后表示上传成功,现在可以在device中看到你上传的那个文件了。应为这次用到了mqtt协议,所以还需要把uPy_libumqtt下的simple.py库文件也传到板卡存储空间里,同样的把simple.py拖到device后放开。

从零开始全屋智能家装,从零开始智能家具

上传文件

  • 现在代码都上传到了板卡中了,但是它是不会自动执行代码的,我们需要设置一个开机自动运行的文件。选中device中我们编写的文件点击鼠标右键,在弹出的菜单中选择Default Run,这时我们要开机自动执行的文件名会变成红色,说明开机自动运行设置好了。到此,固件已经成功写板卡了,下面我们来连接电路。

从零开始全屋智能家装,从零开始智能家具

设置开机自动运行

电路制作

  • 先画出电路图。最上面的ASM117是将5V电压转换成3.3V的电压供ESP8266使用,这已经是ESP8266的标配部分了,我是自己焊接的,也可以用现成的降压模块。中间就是ESP8266,GPIO0和GPIO2开机的时候如果是低电平,会无法正常进入工作模式,所以需要接一个上拉电阻。GPIO2用低电平来控制一个S8550开关LED。GPIO0用来接收触摸开关传入的低电平触发信号。

从零开始全屋智能家装,从零开始智能家具

电路图

  • 最下面的TTP223是一个触摸检查IC,支持点动和自锁模式的高低电平触发。我们需要传入一个点动的低电平,按照表中连接方法,需要将AHLB接入高电平。电容CS用来调节触摸的灵敏度,越小越灵敏,但也和触摸板的面积和覆盖介质的厚度有关。具体怎么算的我也不清楚,只好多试几个电容了,我用的一个20pF的电容,感觉大小刚刚好。

从零开始全屋智能家装,从零开始智能家具

TTP223使用说明

  • TTP223是个好东西,就是太小了,所以我用了一片转接板,下图右面中间那个小东西就是TTP223,实在是太小了。TTP223的具体资料可自行百度,如果不用远程控制,直接用TTP223做一个触摸开关也是极好的。这个东西有做好了的模块卖,闲麻烦的可以直接使用模块。

从零开始全屋智能家装,从零开始智能家具

左边是MICROUSB转DIP,右边是TTP223芯片

  • 电源输入我用了一个microUSB母头的转接板,毕竟现在谁家还没个几根手机数据线(苹果除外),正好废物利用了。
  • LED我是从一个气球上拆下来的像线一样的led灯带,就是图中这个玩意,盘起来装到玻璃瓶里非常好看。

从零开始全屋智能家装,从零开始智能家具

LED

  • 电路如图连接好,我就用铜丝直接连的,简单粗暴,实用就好。先上电测试一下,远程和触摸能正常控制LED开关后进行下一步。

从零开始全屋智能家装,从零开始智能家具

电路实物

  • 至于触摸电极,我用直径1mm的漆包线盘了一个,就像图中这个样子,注意多留一截用来连接TTP223模块。

从零开始全屋智能家装,从零开始智能家具

触摸电极

灯座

  • 灯座大家可以自由发挥了,只要自己觉得好看就行。我是用水泥做的,配比我用的水泥:沙=1:2,网上说1:3效果不错。做完后我才发现,做这些小玩意最好不要沙,光水泥最合适。先用纸板做好模板,中间放上玻璃瓶的盖子固定好,倒入水泥,震出气泡,这是灯座的顶部。

从零开始全屋智能家装,从零开始智能家具

灯座顶部

  • 等灯座顶部稍微干一点后,再用纸板做一个边框固定在干了的水泥上,如下图。可以用铁丝做一个边框骨架,再倒入水泥,等水泥凝固。

从零开始全屋智能家装,从零开始智能家具

灯座边框

  • 等水泥完全凝固后,可以稍微把各个面打磨一下。中间的瓶盖钻一个小孔用来走线。用纸板多围几层作为底座下缓冲层。

从零开始全屋智能家装,从零开始智能家具

纸板底座

  • 在纸板底座上开一个小口作为microUSB的出口,用螺丝和胶水把microUSB转DIP模块固定在纸板做的底座缓冲层上,把microUSB模块和AMS117电源模块连接起来,把触摸电极留出来的那截线连接到TTP223上。整个台灯就完成了,现在可以通过触摸控制台灯了。

从零开始全屋智能家装,从零开始智能家具

成品

homeassistant设置

  • 要想远程控制台灯,还需要把台灯添加到homeassistant中去。按照从零开始智能家居-零编程接入第一个自制温湿度传感器中修改配置文件的办法,打开homeassistant的配置文件configuration.yaml,添加以下内容后保存,重启homeassistant。
light:
 - platform: mqtt
 name: "灯开关" # 在homeassistant中的实体名字,可以自己修改
 state_topic: "/ESP_light/switch" # 状态主题
 command_topic: "/ESP_light/GPIO/0" # 控制主题
 payload_on: "1" # 控制开关的关键字,也可以用on/off等,固件中要用同样的关键字
 payload_off: "0"
 qos: 0
 retain: true

从零开始全屋智能家装,从零开始智能家具

修改配置文件

  • 登陆homeassistant,点击右上角的三点,选择配置UI,选择LIGHT

从零开始全屋智能家装,从零开始智能家具

添加卡片

  • name那里可以不填,也可以自己给卡片取个名字。实体选择灯开关,就是homeassistant配置文件中添加的name,可以自己随便命名。选好后记得保存配置

从零开始全屋智能家装,从零开始智能家具

添加卡片

  • 默认的light卡片有亮度调节,需要在MicroPython中发布的状态主题中添加亮度参数。我比较懒,就没有添加亮度调节的参数,所以卡片上的亮度调节是不能控制亮度的。

从零开始全屋智能家装,从零开始智能家具

添加卡片

至此,一个简单的远程触摸双控台灯就完成,其实都不能叫台灯,充其量就是一个小夜灯,如果是吊灯之类的不用触摸开关的话,用ESPEasy和ESPHome就可以实现了,简单不少,至少不用写代码。但对于比较复杂一点的逻辑判断,还是需要编程的。C对于硬件编程来说有着不可替代的优势,但有了MicroPython过后,使用esp系列芯片那真是方便了不少。正好这次把我最后一个esp8266-01也用完了,下次可以用esp8266-12做点更复杂的东西了。一直对小米那个全彩的台灯比较感兴趣,正好试一下。