楼主: 驴友花雕
|
[MP动手做] MicroPython动手做(28)——物联网之Yeelight |
Yeelight 智能灯 (1)yeelight.discover_bulbs(timeout=2) 描述: 发现所有局域网内的Yeelight灯泡 返回值: 字典列表,包含网络中每个灯泡的IP,端口和功能 参数: timeout (int) - 等待回复需要多少秒。发现将总是要花这么长的时间, 因为它不知道当所有的灯泡都响应完毕时 (2)class yeelight.Bulb(ip, port=55443, effect=’smooth’, duration=300, auto_on=False) 描述: YeeLight的控制类 参数: ip (str) - 灯泡的IP port (int) - 连接灯泡的端口号,默认55443 effect (str) - 效果类型.”smooth” or “sudden” duration (int) - 效果的持续时间,以毫秒为单位.最小值为30.突然效果会忽略此值 auto_on (bool) - 是否 ensure_on() 在每次操作之前调用以自动打开灯泡,如果它已关闭。这会在每条消息之前更新灯泡的属性, 每个命令会花费一个额外的消息。 如果您担心速率限制,请将其关闭并自行检查。get_properties() 或运行 ensure_on() (3)Bulb.turn_on() 描述: 打开灯泡 (4)Bulb.turn_off() 描述: 关闭灯泡 (5)Bulb.toggle() 描述: 反转灯泡状态 (6)Bulb.set_rgb(red, green, blue) 描述: 设置灯泡的 RGB 值 参数: red (int) - 红色范围 (0-255) green (int) - 绿色范围 (0-255) blue (int) - 蓝色范围 (0-255) (7)Bulb.set_hsv(hue, saturation) 描述: 设置灯泡的 HSV 值 参数: hue (int) - 色调(0-359) saturation (int) - 饱和度(0-100) (8)Bulb.set_color_temp(degrees) 描述: 设置灯泡色温 参数: degrees (int) - 色温范围(1700-6500) (9)Bulb.set_brightness(brightness) 描述: YeeLight的控制类 参数: brightness (int) - 亮度范围 (1-100) |
9、RGB颜色模型 Yeelight使用"RGB" 和"HSV" 两种颜色模型来设置灯泡灯光的颜色。 RGB色彩模式由自然界中光的三原色的混合原理发展而来。RGB分别代表红色(Red)、绿色(Green)、蓝色(Blue)。它的每个象素在每种颜色上可以负载2的8次方(256)种亮度级别,这样三种颜色通道合在一起就可以产生256的3次方(1670多万)种颜色,它在理论上可以还原自然界中存在的任何颜色。 RGB模式的图像支持多个图层。据有R、G、B三个单色通道和一个由它们混合颜色的彩色通道。 在RGB色彩模式的图像中,某种颜色的含量越多,那么这种颜色的亮度也越高,由其产生的结果中这种颜色也就越亮。例如如果三种颜色的亮度级别都为0(亮度级别最低),则它们混合出来的颜色就是黑色;如果它们的亮度级别都为255(亮度级别最高),则其结果为白色。这和自然界中光的三原色的混合原理相同。 RGB色彩模式是运用最广泛的色彩模式之一,它能适应多种输出的需要,并能较完整地还原图像的颜色信息。如大多数的显示屏、RGB打印、多种写真输出设备都需要用RGB色彩模式的图像来输出。 |
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] |
11、随机颜色的RGB模型彩虹灯 命令消息配额限制为line 243(到限额会自动停止运行) [mw_shl_code=python,false]# MicroPython动手做(28)——物联网之Yeelight #随机颜色的RGB模型彩虹灯 from mpython import * import network from yeelight import * import time import music import random my_wifi = wifi() my_wifi.connectWiFi("zh", "zy1567") random.seed(time.ticks_cpu()) bulb = Bulb(discover_bulbs()[0]["ip"]) time.sleep_ms(500) bulb.turn_on() oled.fill(0) oled.DispChar("RGB彩虹灯", 33, 16, 1) oled.DispChar(discover_bulbs()[0]['ip'], 15, 28, 1) oled.show() music.play('G5:1') time.sleep_ms(500) bulb.set_rgb(0, 153, 0) rgb.fill((int(0), int(102), int(0))) rgb.write() time.sleep_ms(1) while True: time.sleep_ms(500) bulb.set_rgb(0, (random.randint(1, 255)),(random.randint(1, 255))) time.sleep_ms(500) bulb.set_rgb((random.randint(1, 255)), 0,(random.randint(1, 255))) time.sleep_ms(500) bulb.set_rgb((random.randint(1, 255)), (random.randint(1, 255)),0) [/mw_shl_code] |
12、HSV颜色模型 HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。这个模型中颜色的参数分别是:色调(H),饱和度(S),明度(V)。 色调H 用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,紫色为300°。 饱和度S 饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。 明度V 明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。 RGB和CMY颜色模型都是面向硬件的,而HSV(Hue Saturation Value)颜色模型是面向用户的。HSV模型的三维表示从RGB立方体演化而来。设想从RGB沿立方体对角线的白色顶点向黑色顶点观察,就可以看到立方体的六边形外形。六边形边界表示色彩,水平轴表示纯度,明度沿垂直轴测量。 |
HSV的六棱锥 H参数表示色彩信息,即所处的光谱颜色的位置。该参数用一角度量来表示,红、绿、蓝分别相隔120度。互补色分别相差180度。 纯度S为一比例值,范围从0到1,它表示成所选颜色的纯度和该颜色最大的纯度之间的比率。S=0时,只有灰度。 V表示色彩的明亮程度,范围从0到1。有一点要注意:它和光强度之间并没有直接的联系。 HSV对用户来说是一种直观的颜色模型。我们可以从一种纯色彩开始,即指定色彩角H,并让V=S=1,然后我们可以通过向其中加入黑色和白色来得到我们需要的颜色。增加黑色可以减小V而S不变,同样增加白色可以减小S而V不变。例如,要得到深蓝色,V=0.4 S=1 H=210度。要得到淡蓝色,V=1 S=0.4 H=210度。一般说来,人眼最大能区分128种不同的色彩,130种色饱和度,23种明暗度。如果我们用16Bit表示HSV的话,可以用7位存放H,4位存放S,5位存放V,即745或者655就可以满足我们的需要了。由于HSV是一种比较直观的颜色模型,所以在许多图像编辑工具中应用比较广泛,如Photoshop(在Photoshop中叫HSB)等等,但这也决定了它不适合使用在光照模型中,许多光线混合运算、光强运算等都无法直接使用HSV来实现。顺便提一下,另外一种直观颜色模型是HSL模型,该模型中前两个参数和HSV一样,而L表示亮度。它的三维表示为一双棱锥。 |
13、测试HSV颜色模型的hue色调变动(饱和度设为100) Yeelight灯泡的HSV(Hue Saturation Value)颜色模型: hue 色调,用角度度量,取值范围为0~359,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。 saturation 饱和度,表示颜色接近光谱色的程度。颜色的饱和度也就愈高。饱和度高,颜色则深而艳。范围0~100。 Value亮度参数,未提供支持。只需设置 hue 、saturation 参数即可。在做些彩虹效果,颜色过渡时,HSV更为自然。 |
# MicroPython动手做(28)——物联网之Yeelight #测试HSV颜色模型的hue 色调(饱和度设为100) [mw_shl_code=python,false]# MicroPython动手做(28)——物联网之Yeelight #测试HSV颜色模型的hue 色调(饱和度设为100) from mpython import * import network import music from yeelight import * import time my_wifi = wifi() my_wifi.connectWiFi("zh", "zy1567") music.play('G5:1') oled.fill(0) oled.DispChar("测试HSV色调", 35, 18, 1) oled.DispChar("0-359", 55, 29, 1) oled.show() bulb = Bulb(discover_bulbs()[0]["ip"]) time.sleep_ms(500) bulb.turn_on() time.sleep_ms(500) bulb.set_brightness(100) time.sleep_ms(500) bulb.set_rgb(51, 0, 0) rgb[1] = (int(0), int(102), int(0)) rgb.write() time.sleep_ms(1) while True: for i in range(0, 360, 22): time.sleep_ms(500) bulb.set_hsv(i, 100)[/mw_shl_code] |
14、测试Yeelight灯泡的色温变动(1700k-6500k) 可以使用 set_color_temp(degrees) 函数设置灯泡色温 degrees 色温参数,范围1700k~6500k。 知识点: 色温 是表示光线中包含颜色成分的一个计量单位。从理论上说,黑体温度指绝对黑体从绝对零度(-273℃)开始加温后所呈现的颜色。黑体在受热后,逐渐由黑变红,转黄,发白,最后发出蓝色光。当加热到一定的温度,黑体发出的光所含的光谱成分,就称为这一温度下的色温,计量单位为“K”(开尔文)。如果某一光源发出的光,与某一温度下黑体发出的光所含的光谱成分相同,就称为某K色温。如100W灯泡发出的光的颜色,与绝对黑体在2527℃时的颜色相同,那么这只灯泡发出的光的色温就是:(2527+273)K=2800K。 色温与亮度 高色温光源照射下,如亮度不高则给人们有一种阴冷的气氛;低色温光源照射下,亮度过高会给人们有一种闷热感觉。光色的对比:在同一空间使用两种光色差很大的光源,其对比将会出现层次效果,光色对比大时,在获得亮度层次的同时,又可获得光色的层次。 色温原理 开尔文认为,假定某一纯黑物体,能够将落在其上的所有热量吸收,而没有损失,同时又能够将热量生成的能量全部以“光”的形式释放出来的话,它产生辐射最大强度的波长随温度变化而变化。例如,当黑体受到的热力相当于500—550℃时,就会变成暗红色(某红色波长的辐射强度最大),达到1050—1150℃时,就变成黄色……因而,光源的颜色成分是与该黑体所受的温度相对应的。色温通常用开尔文温度(K)来表示,而不是用摄氏温度单位。打铁过程中,黑色的铁在炉温中逐渐变成红色,这便是黑体理论的最好例子。通常我们所用灯泡内的钨丝就相当于这个黑体。色温计算法就是根据以上原理,用K来对应表示物体在特定温度辐射时最大波长的颜色。根据这一原理,任何光线的色温是相当于上述黑体散发出同样颜色时所受到的“温度”。颜色实际上是一种心理物理上的作用,所有颜色印象的产生,是由于时断时续的光谱在眼睛上的反应,所以色温只是用来表示颜色的视觉印象。 |
# MicroPython动手做(28)——物联网之Yeelight # 测试Yeelight灯泡的色温变动(1700k-6500k) [mw_shl_code=python,false]# MicroPython动手做(28)——物联网之Yeelight # 测试Yeelight灯泡的色温变动(1700k-6500k) from mpython import * import network import music from yeelight import * import time my_wifi = wifi() my_wifi.connectWiFi("zh", "zy1567") music.play('G5:1') oled.fill(0) oled.DispChar("测试色温变动", 30, 18, 1) oled.DispChar("1700-6500", 33, 29, 1) oled.show() bulb = Bulb(discover_bulbs()[0]["ip"]) time.sleep_ms(500) bulb.turn_on() time.sleep_ms(500) bulb.set_rgb(51, 0, 0) rgb[1] = (int(0), int(102), int(0)) rgb.write() time.sleep_ms(1) while True: for i in range(1700, 6501, 80): time.sleep_ms(500) bulb.set_color_temp(i)[/mw_shl_code] |
© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed