4261浏览
查看: 4261|回复: 40

[MP动手做] MicroPython动手做(28)——物联网之Yeelight

[复制链接]
Yeelight
是全球领先的智能照明品牌,2014年加入小米智能家居生态链,在物联网、智能交互、工业设计和灯光体验等方面不断打磨,持续定义照明行业的最高标准。Yeelight拥有完整的智能家居照明产品线,产品系列辐射家装照明、台上照明、氛围照明以及智能照明控制,全球累计出货1100余万件,用户辐射100多个国家和地区,致力于通过高品质光环境的打造,让更多人享受到智能照明的便捷和乐趣。

MicroPython动手做(28)——物联网之Yeelight图1

驴友花雕  中级技神
 楼主|

发表于 2020-6-6 16:12:04

10、六个触摸键控制的RGB颜色灯

[mw_shl_code=python,false]# MicroPython动手做(28)——物联网之Yeelight
#六个触摸键控制的RGB颜色灯

from mpython import *
import network
import time
import music
from yeelight import *
from machine import Timer

my_wifi = wifi()

my_wifi.connectWiFi("zh", "zy1567")

_status_p = _status_y = _status_t = _status_h = _status_o = _status_n = 0
def on_touchpad_P_pressed():pass
def on_touchpad_P_unpressed():pass
def on_touchpad_Y_pressed():pass
def on_touchpad_Y_unpressed():pass
def on_touchpad_T_pressed():pass
def on_touchpad_T_unpressed():pass
def on_touchpad_H_pressed():pass
def on_touchpad_H_unpressed():pass
def on_touchpad_O_pressed():pass
def on_touchpad_O_unpressed():pass
def on_touchpad_N_pressed():pass
def on_touchpad_N_unpressed():pass

tim12 = Timer(12)

def timer12_tick(_):
    global _status_p, _status_y, _status_t, _status_h, _status_o, _status_n
    try:
        touchPad_P.read();pass
    except:
        return
    if touchPad_P.read() < 400:
        if 1 != _status_p:_status_p = 1;on_touchpad_P_pressed()
    elif 0 != _status_p:_status_p = 0;on_touchpad_P_unpressed()
    if touchPad_Y.read() < 400:
        if 1 != _status_y:_status_y = 1;on_touchpad_Y_pressed()
    elif 0 != _status_y:_status_y = 0;on_touchpad_Y_unpressed()
    if touchPad_T.read() < 400:
        if 1 != _status_t:_status_t = 1;on_touchpad_T_pressed()
    elif 0 != _status_t:_status_t = 0;on_touchpad_T_unpressed()
    if touchPad_H.read() < 400:
        if 1 != _status_h:_status_h = 1;on_touchpad_H_pressed()
    elif 0 != _status_h:_status_h = 0;on_touchpad_H_unpressed()
    if touchPad_O.read() < 400:
        if 1 != _status_o:_status_o = 1;on_touchpad_O_pressed()
    elif 0 != _status_o:_status_o = 0;on_touchpad_O_unpressed()
    if touchPad_N.read() < 400:
        if 1 != _status_n:_status_n = 1;on_touchpad_N_pressed()
    elif 0 != _status_n:_status_n = 0;on_touchpad_N_unpressed()

tim12.init(period=100, mode=Timer.PERIODIC, callback=timer12_tick)

def on_touchpad_P_pressed():
    global i
    time.sleep_ms(500)
    bulb.set_rgb(153, 0, 0)
    oled.DispChar("P键  红色", 38, 32, 1)
    oled.show()
    rgb.fill((int(153), int(0), int(0)))
    rgb.write()
    time.sleep_ms(1)

def on_touchpad_Y_pressed():
    global i
    time.sleep_ms(500)
    bulb.set_rgb(0, 153, 0)
    oled.DispChar("Y键  绿色", 38, 32, 1)
    oled.show()
    rgb.fill((int(0), int(153), int(0)))
    rgb.write()
    time.sleep_ms(1)

def on_touchpad_T_pressed():
    global i
    time.sleep_ms(500)
    bulb.set_rgb(51, 51, 255)
    oled.DispChar("T键  蓝色", 38, 32, 1)
    oled.show()
    rgb.fill((int(51), int(51), int(255)))
    rgb.write()
    time.sleep_ms(1)

def on_touchpad_H_pressed():
    global i
    time.sleep_ms(500)
    bulb.set_rgb(255, 102, 0)
    oled.DispChar("H键  橙色", 38, 32, 1)
    oled.show()
    rgb.fill((int(153), int(51), int(0)))
    rgb.write()
    time.sleep_ms(1)

def on_touchpad_O_pressed():
    global i
    time.sleep_ms(500)
    bulb.set_rgb(204, 51, 204)
    oled.DispChar("O键  紫色", 38, 32, 1)
    oled.show()
    rgb.fill((int(102), int(51), int(102)))
    rgb.write()
    time.sleep_ms(1)

def on_touchpad_N_pressed():
    global i
    time.sleep_ms(500)
    bulb.set_rgb(255, 204, 51)
    oled.DispChar("N键  黄色", 38, 32, 1)
    oled.show()
    rgb.fill((int(153), int(102), int(51)))
    rgb.write()
    time.sleep_ms(1)


rgb[1] = (int(51), int(51), int(51))
rgb.write()
time.sleep_ms(1)
music.play('G5:1')
bulb = Bulb(discover_bulbs()[0]["ip"])
time.sleep_ms(500)
bulb.turn_on()
oled.fill(0)
oled.DispChar("触摸键控制RGB灯", 18, 16, 1)
oled.show()[/mw_shl_code]
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-5 19:36:51

8、MicroPython编程

(1)发现灯泡

掌控板和Yeelight灯泡在同局域网内后,我们要控制灯泡,首先需要知道该灯泡的IP地址,我们可以使用 discover_bulbs() 函数:

[mw_shl_code=python,false]from mpython import *                   # 导入mpython模块
from yeelight import *                  # 导入yeelight模块

my_wifi = wifi()                        # 连接到与YeeLight相同的局域网内
my_wifi.connectWiFi("ssid","password")


discover_bulbs()                        # 发现局域网内YeeLight的设备信息[/mw_shl_code]

网内的Yeelight灯泡响应并返回包含bulbs属性的字典:


[mw_shl_code=python,false]>>> discover_bulbs()
[{'ip': '192.168.0.8', 'capabilities': {'rgb': '16711680', 'bright': '100', 'support': 'get_prop set_default set_power toggle set_bright start_cf stop_cf set_scene cron_add cron_get cron_del set_ct_abx set_rgb set_hsv set_adjust adjust_bright adjust_ct adjust_color set_music set', 'sat': '100', 'power': 'off', 'id': '0x0000000007e7544d', 'name': '', 'fw_ver': '26', 'color_mode': '2', 'hue': '359', 'ct': '3500', 'model': 'color'}, 'port': '55443'}][/mw_shl_code]

discover_bulbs() 函数,可获取网内Yeelight设备的属性。从上述返回的来看,该灯泡的IP地址为 192.168.0.8 。

(2)开关控制

知道IP地址后,我们构建 Bulb 对象,对灯泡开关控制:

[mw_shl_code=python,false]bulb=Bulb("192.168.0.8")    # 构建对象
bulb.turn_on()              # 开灯指令
bulb.turn_off()             # 关灯指令[/mw_shl_code]

除了 turn_on() 、turn_off() 还可使用 toggle() 反转状态。



回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-6 21:09:58

14、测试Yeelight灯泡的色温变动(1700k-6500k)

可以使用 set_color_temp(degrees) 函数设置灯泡色温
degrees 色温参数,范围1700k~6500k。

知识点:

色温
是表示光线中包含颜色成分的一个计量单位。从理论上说,黑体温度指绝对黑体从绝对零度(-273℃)开始加温后所呈现的颜色。黑体在受热后,逐渐由黑变红,转黄,发白,最后发出蓝色光。当加热到一定的温度,黑体发出的光所含的光谱成分,就称为这一温度下的色温,计量单位为“K”(开尔文)。如果某一光源发出的光,与某一温度下黑体发出的光所含的光谱成分相同,就称为某K色温。如100W灯泡发出的光的颜色,与绝对黑体在2527℃时的颜色相同,那么这只灯泡发出的光的色温就是:(2527+273)K=2800K。

MicroPython动手做(28)——物联网之Yeelight图1

色温与亮度
高色温光源照射下,如亮度不高则给人们有一种阴冷的气氛;低色温光源照射下,亮度过高会给人们有一种闷热感觉。光色的对比:在同一空间使用两种光色差很大的光源,其对比将会出现层次效果,光色对比大时,在获得亮度层次的同时,又可获得光色的层次。

色温原理
开尔文认为,假定某一纯黑物体,能够将落在其上的所有热量吸收,而没有损失,同时又能够将热量生成的能量全部以“光”的形式释放出来的话,它产生辐射最大强度的波长随温度变化而变化。例如,当黑体受到的热力相当于500—550℃时,就会变成暗红色(某红色波长的辐射强度最大),达到1050—1150℃时,就变成黄色……因而,光源的颜色成分是与该黑体所受的温度相对应的。色温通常用开尔文温度(K)来表示,而不是用摄氏温度单位。打铁过程中,黑色的铁在炉温中逐渐变成红色,这便是黑体理论的最好例子。通常我们所用灯泡内的钨丝就相当于这个黑体。色温计算法就是根据以上原理,用K来对应表示物体在特定温度辐射时最大波长的颜色。根据这一原理,任何光线的色温是相当于上述黑体散发出同样颜色时所受到的“温度”。颜色实际上是一种心理物理上的作用,所有颜色印象的产生,是由于时断时续的光谱在眼睛上的反应,所以色温只是用来表示颜色的视觉印象。

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-4 15:26:09

Yeelight发展历程

MicroPython动手做(28)——物联网之Yeelight图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-4 15:48:09

1、Yeelight智能照明设备
支持通过无线网络远程控制。当用户收到智能发光二极管设备第一次,他/她需要完成一个配置过程来向设备提供路由器的SSID和密码。这个过程通常被称为智能配置或快速连接。出于安全考虑,协议用于智能配置是专有的,这意味着没有第三方可以知道或使用它。但是,在设备连接到路由器后,它可以被下面的所有设备看到同样的网络,因此也可以由理解的第三方设备控制互操作控制协议。

Yeelight智能设备是通过云来控制的。该命令将被发送到云,然后转发到设备。如图所示,所有的无线指示灯都与云服务器保持联系。如果云服务器关闭或广域网出现问题,用户将失去对的控制设备。因此,我们认为本地控制是非常必要的,并开始在本地工作控制机制。本地控制可以进一步分为两部分:发现过程和控制程序。对于本地发现,我们使用了类似SSDP的协议,但它被大大简化了。

MicroPython动手做(28)——物联网之Yeelight图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-4 15:52:03

2、Yeelight服务的发现过程


MicroPython动手做(28)——物联网之Yeelight图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-4 16:03:03

3、快递刚送到的Yeelight灯泡
准备尝试用MicroPython来控制它

MicroPython动手做(28)——物联网之Yeelight图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-4 16:28:25

Yeelight灯泡

MicroPython动手做(28)——物联网之Yeelight图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-4 16:33:27

基本参数

MicroPython动手做(28)——物联网之Yeelight图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-4 16:50:12

4、使用A\B按键来开关Yeelight灯泡



[mw_shl_code=python,false]# MicroPython动手做(28)——物联网之Yeelight
#使用A\B按键来开关Yeelight灯泡

from mpython import *
import network
import time
from yeelight import *

my_wifi = wifi()

my_wifi.connectWiFi("zh", "zy1567")

def on_button_a_down(_):
    global i
    time.sleep_ms(10)
    if button_a.value() == 1: return
    rgb.fill((int(153), int(153), int(153)))
    rgb.write()
    time.sleep_ms(1)
    time.sleep_ms(500)
    LED.turn_on()
    time.sleep_ms(500)
    LED.set_rgb(255, 255, 255)

def on_button_b_down(_):
    global i
    time.sleep_ms(10)
    if button_b.value() == 1: return
    rgb.fill( (0, 0, 0) )
    rgb.write()
    time.sleep_ms(1)
    time.sleep_ms(500)
    LED.turn_off()

button_a.irq(trigger=Pin.IRQ_FALLING, handler=on_button_a_down)

button_b.irq(trigger=Pin.IRQ_FALLING, handler=on_button_b_down)


rgb[1] = (int(51), int(51), int(255))
rgb.write()
time.sleep_ms(1)
if len(discover_bulbs()) > 0:
    LED = Bulb(discover_bulbs()[0]["ip"])[/mw_shl_code]
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-4 17:44:06

实验场景


MicroPython动手做(28)——物联网之Yeelight图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-4 18:00:46

mPyehon X 实验图形编程

MicroPython动手做(28)——物联网之Yeelight图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-4 18:42:58

5、AB键控制Yeelight灯泡升级版(绿色光)


[mw_shl_code=python,false]# MicroPython动手做(28)——物联网之Yeelight
#AB键控制Yeelight灯泡升级版

from mpython import *
import network
import music
import time
from yeelight import *

my_wifi = wifi()

my_wifi.connectWiFi("zh", "zy1567")

def on_button_a_down(_):
    global i
    time.sleep_ms(10)
    if button_a.value() == 1: return
    music.play('F4:1')
    time.sleep_ms(500)
    LED.turn_on()
    time.sleep_ms(500)
    LED.set_rgb(153, 255, 153)
    rgb.fill((int(0), int(102), int(0)))
    rgb.write()
    time.sleep_ms(1)
    oled.fill(0)
    oled.DispChar("打开电灯", 43, 22, 1)
    oled.show()

def on_button_b_down(_):
    global i
    time.sleep_ms(10)
    if button_b.value() == 1: return
    music.play('D4:1')
    time.sleep_ms(500)
    LED.turn_off()
    rgb.fill( (0, 0, 0) )
    rgb.write()
    time.sleep_ms(1)
    oled.fill(0)
    oled.DispChar("关闭电灯", 43, 22, 1)
    oled.show()

button_a.irq(trigger=Pin.IRQ_FALLING, handler=on_button_a_down)

button_b.irq(trigger=Pin.IRQ_FALLING, handler=on_button_b_down)


music.play('A4:1')
rgb[1] = (int(51), int(51), int(255))
rgb.write()
time.sleep_ms(1)
if len(discover_bulbs()) > 0:
    LED = Bulb(discover_bulbs()[0]["ip"])[/mw_shl_code]
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-4 19:05:13

MicroPython动手做(28)——物联网之Yeelight图1
回复

使用道具 举报

rzyzzxw  版主

发表于 2020-6-4 19:32:33

老师这个系列的内容越来越丰富啦。
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-4 20:30:42

mPyehon X 实验图形编程

MicroPython动手做(28)——物联网之Yeelight图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-4 20:35:37

rzyzzxw 发表于 2020-6-4 19:32
老师这个系列的内容越来越丰富啦。

谢谢版主的鼓励
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-4 20:39:01


6、自动变色循环流光灯


[mw_shl_code=python,false]# MicroPython动手做(28)——物联网之Yeelight
#自动变色循环流光灯

from mpython import *
import network
import time
from yeelight import *

my_wifi = wifi()

my_wifi.connectWiFi("zh", "zy1567")


rgb[1] = (int(0), int(102), int(0))
rgb.write()
time.sleep_ms(1)
while True:
    if len(discover_bulbs()) > 0:
        D = Bulb(discover_bulbs()[0]["ip"])
        time.sleep_ms(500)
        D.turn_on()
        time.sleep_ms(500)
        D.set_rgb(32, 178, 170)
        for i in range(10, 101, 5):
            time.sleep_ms(500)
            D.set_brightness(i)
            time.sleep_ms(500)
            D.set_hsv(359, i)
        time.sleep_ms(500)
        D.turn_off()[/mw_shl_code]
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-4 20:59:38

mPyehon X 实验图形编程

MicroPython动手做(28)——物联网之Yeelight图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-4 21:05:03

MicroPython动手做(28)——物联网之Yeelight图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-5 19:25:39

7、局域网控制
Yeelight 支持Google Assistant 和 Amazon Alexa 智能语音控制。还支持国内少有支持的IFTTT。它可以社交媒体、智能硬件等各类网络服务更好的联动。后续我们会讲解IFTTT的有关应用。 除此外,Yeelight还针对技术爱好者推出,第三方控制协议,可实现局域网内的个性化的控制。本文讲解的掌控板控制Yeelight智能照明设备就是用到该协议。

Yeelight第三方控制协议:https://www.yeelight.com/downloa ... -Operation_Spec.pdf

Yeelight 拥有完整的智能家居照明产品线,产品系列辐射家居照明系列、台上照明系列、氛围照明系列以及智能控制系列。集前沿技术和至美设计于一体是Yeelight一贯的追求。 AI技术、BLE MESH技术、全屋智能照明技术均旗下产品进行广泛应用,全线WiFi产品支持智能语音控制,灯光变化,尽在言语之间。

掌控板提供 yeelight 驱动库,该库可在 awesome-mpython/libary/yeelight 获取。里面有更详细的 yeelight 模块的API说明。 yeelight.py 下载至掌控板的文件系统。掌控板连接到Yeelight相同的局域网内。

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2020-6-5 19:53:02

(3)亮度调节


[mw_shl_code=applescript,false]bulb.set_brightness(100)[/mw_shl_code]


set_brightness(brightness) , brightness 参数为亮度值,可调范围0~100 。



(4)设置颜色


[mw_shl_code=python,false]bulb.set_rgb(255,0,0)           # 通过RGB设置灯泡颜色
bulb.set_hsv(180,100)           # 通过HSV设置灯泡颜色
bulb.set_color_temp(1700)       # 设置灯泡色温[/mw_shl_code]


yeelight 模块提供 set_rgb(red, green, blue) 和 set_hsv(hue, saturation) 两个函数。"RGB" 和"HSV" 两种颜色模型来设置灯泡灯光颜色。RGB颜色模型比较常用,相信大家并不陌生。通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色。 HSV(Hue Saturation Value)颜色模型:hue 色调,用角度度量,取值范围为0~359,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。saturation 饱和度,表示颜色接近光谱色的程度。颜色的饱和度也就愈高。饱和度高,颜色则深而艳。范围0~100。 Value亮度参数,未提供支持。只需设置 hue 、saturation 参数即可。在做些彩虹效果,颜色过渡时,HSV更为自然。


还可以使用 set_color_temp(degrees) 函数设置灯泡色温, degrees 色温参数,范围1700~6500。


MicroPython动手做(28)——物联网之Yeelight图1


注意

Yeelight, 目前WiFi智能设备最多支持4个同时TCP连接。超过的连接尝试将被拒绝。对于每个连接,都有一个命令消息配额限制, 也就是每分钟60个指令。所有LAN也有一个总配额限制,144。


回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail