### 第7课 氛围灯

#### 7.1 项目介绍

智能家居的氛围灯是4个SK6812RGB LED，RGB LED属于简单的发光模块，可以通过调节色彩调出不同颜色的灯效，可广泛应用于建筑物、桥梁、道路、花园、庭院、地板等领域的装饰照明与会场布置、圣诞节、万圣节、情人节、复活节、国庆节等节日期间烘托气氛等场景。在本实验中，实现各种灯光效果。

#### 7.2 模块相关资料

**SK6812RGB：** 从原理图中可以看出，这4个RGBLED都是串联起来的，在电压电流充足的情况下可以接几百个RGB LED，都可以用一根信号线控制任意一个RGB LED，并且让它显示任意一种颜色。每一颗RGBLED都是一个独立的像素点，每个像素点都是由R、G、B三基色颜色组成，可实现256级亮度显示，完成16777216种颜色的全真色彩显示，同时像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路，还内置信号整形电路，有效保证了像素点光的颜色高度一致。

数据协议采用单线归零码的通讯方式，像素点在上电复位以后，S端接受从控制器传输过来的数据，首先送过来的24bit数据被第一个像素点提取后，送到像素点内部的数据锁存器。这个6812RGB通讯协议与驱动已经在底层封装好了，我们直接调用函数的接口就可以使用，简单方便，LED具有低电压驱动，环保节能，亮度高，散射角度大，一致性好，超低功率，超长寿命等优点。

![](media/rgb1.png)

#### 7.3 实验组件

|![](media/esp32.png)|![](media/button.png)|![](media/SK6812RGB.png)|![](media/3p.png)|![](media/usb.png)|
|-|-|-|-|-|
|ESP32 Plus主板 *1|按键 *2|SK6812RGB灯 *1|3P线 *3|USB线 *1|

#### 7.4 模块接线图

木板房子⑦处(左侧)按键1，木板房子⑨处(右侧)按键2和SK6812RGB灯模块的控制引脚：

|SK6812RGB灯（S引脚）|io26|
|-|-|
|木板房子⑦处(左侧)按键1（S引脚）|io4|
|木板房子⑨处(右侧)按键2（S引脚）|io32|

⚠️ **特别注意：智能家居已经组装好了，这里不需要把LED模块拆下来又重新组装和接线，这里再次提供接线图，是为了方便您编写代码！**

![](media/pjt7.png)

#### 7.5 控制SK6812的实验代码1  

控制SK6812显示各种灯效

打开“Thonny”软件，点击“此电脑” → “D:” → “MicroPython资料” → “MicroPython_代码”。并鼠标左键双击“Project_07.1_RGB_sk6812.py”。

```python
# 作者 : www.keyes-robot.com

#导入Pin, neopiexl和time模块.
from machine import Pin
import neopixel
import time

#定义连接到新像素的引脚和led的数量.
pin = Pin(26, Pin.OUT)
np = neopixel.NeoPixel(pin, 4) 

#亮度:0 - 255
brightness=100                                
colors=[[brightness,0,0],                    #红
        [0,brightness,0],                    #绿
        [0,0,brightness],                    #蓝
        [brightness,brightness,brightness],  #白
        [0,0,0]]                             #关闭

#嵌套两个for循环，使模块重复显示红、绿、蓝、白和OFF五种状态。    
while True:
    for i in range(0,5):
        for j in range(0,4):
            np[j]=colors[i]
            np.write()
            time.sleep_ms(50)
        time.sleep_ms(500)
    time.sleep_ms(500)
```

#### 7.6 实验结果1

按照接线图接好线，将 ESP32 主控板通过Micro USB数据线与计算机相连供电，外接电源供电，然后单击按钮![](media/1305.png)，示例代码开始执行。

![](media/AB1.png)

示例代码开始执行之后，你会看到的现象是：智能家居的氛围灯显示红、绿、蓝、白，然后熄灭。


![Img](../../media/image-07.gif)

单击![](media/1311.png)“停止/启动后端进程”退出程序。

#### 7.7 代码流程图

![](media/project07.png)

#### 7.8 按钮切换灯颜色的实验代码2 

两个按键，左右切换氛围灯的颜色。

打开“Thonny”软件，点击“此电脑” → “D:” → “MicroPython资料” → “MicroPython_代码”。并鼠标左键双击“Project_07.2_btn_sk6812.py”。


```python
# 作者 : www.keyes-robot.com

#导入Pin, neopiexl和time模块.
from machine import Pin
import neopixel
import time

button1 = Pin(4, Pin.IN, Pin.PULL_UP)
button2 = Pin(32, Pin.IN, Pin.PULL_UP)
count = 0

#定义连接到新像素的引脚和led的数量.
pin = Pin(26, Pin.OUT)
np = neopixel.NeoPixel(pin, 4) 

#亮度:0 - 255 
brightness=100                                
colors=[[0,0,0],                             #关闭
        [brightness,0,0],                    #红
        [0,brightness,0],                    #绿
        [0,0,brightness],                    #蓝
        [brightness,brightness,0],           #黄
        [brightness,0,brightness],           #品红
        [brightness,brightness,brightness]   #白
        ]                              

def func_color(val):
    for j in range(0,4):
        np[j]=colors[val]
        np.write()
        time.sleep_ms(50)
        
#嵌套两个for循环，使模块重复显示红、绿、蓝、白和OFF五种状态.    
while True:
    btnVal1 = button1.value()  # 读取按钮1的值
    #print("button1 =",btnVal1)  #用shell窗口中打印出来
    if(btnVal1 == 0):
        time.sleep(0.01)
        while(btnVal1 == 0):
            btnVal1 = button1.value()
            if(btnVal1 == 1):
                count = count - 1
                print(count)
                if(count <= 0):
                    count = 0
                
    btnVal2 = button2.value()        
    if(btnVal2 == 0):
        time.sleep(0.01)
        while(btnVal2 == 0):
            btnVal2 = button2.value()
            if(btnVal2 == 1):
                count = count + 1
                print(count)
                if(count >= 6):
                    count = 6
    
    if(count == 0):
        func_color(0)
    elif(count == 1):
        func_color(1)
    elif(count == 2):
        func_color(2)
    elif(count == 3):
        func_color(3)
    elif(count == 4):
        func_color(4)
    elif(count == 5):
        func_color(5)
    elif(count == 6):
        func_color(6)
```

#### 7.9 实验结果2

按照接线图接好线，将 ESP32 主控板通过Micro USB数据线与计算机相连供电，外接电源供电，然后单击按钮![](media/1305.png)，示例代码开始执行。

![](media/AB1.png)

示例代码开始执行之后，你会看到的现象是：点击木板房子⑨处(右侧)按键2，SK6812RGB模块依次亮红、绿、蓝、黄、品红、白等颜色灯；点击木板房子⑦处(左侧)按键1，SK6812RGB模块依次亮品红、黄、蓝、绿、红等颜色灯和熄灭。通过点击木板房子⑦处(左侧)按键1和木板房子⑨处(右侧)按键2来切换氛围灯的颜色。

![Img](../../media/image-07-1.gif)

单击![](media/1311.png)“停止/启动后端进程”退出程序。