IoT 硬件:NeoPixel

WS2812B 灯带 一个集控制电路与发光电路于一体的智能外控LED光源。可单独寻址数字 LED 灯。 每个像素都有自己的颜色和亮度。 您可以单独控制它们,并将其设置成任何颜色。 256 灰色级别可调节和 16777216 彩色 24 位全彩显示。

WS2812B 灯带 一个集控制电路与发光电路于一体的智能外控LED光源。可单独寻址数字 LED 灯。 每个像素都有自己的颜色和亮度。 您可以单独控制它们,并将其设置成任何颜色。 256 灰色级别可调节和 16777216 彩色 24 位全彩显示。




from machine import ADC
from machine import Pin
class Light():
"""
基于 PT550 环保型光敏二极管的光照传感器元器件,它的灵敏度更高,测量范围是 0Lux~6000Lux。
Lux(勒克斯)是光照强度的单位,它和另一个概念 Lumens(流明)是不同的。Lumens 是指一个光源(比如电灯、投影仪)发出的光能力的总量,而 Lux 是指空间内一个位置接收到的光照的强度。
因为 ADC 支持的最大位数是 12bit,所以这个数值范围是 0~4095 之间。这里按照线性关系做一个转换。
"""
def __init__(self, pin):
self._light = ADC(Pin(pin))
def value(self):
value = self._light.read()
print("Light ADC value:", value)
return int(value/4095*6000)
import time
import ujson
from umqtt.simple import MQTTClient
from light import Light
"""
QCloud Device Info
"""
DEVICE_NAME = ""
PRODUCT_ID = ""
DEVICE_KEY = ""
"""
MQTT topic
"""
MQTT_DEVICE_CONTROL_TOPIC = "$thing/down/property/"+PRODUCT_ID+"/"+DEVICE_NAME
MQTT_DEVICE_STATUS_TOPIC = "$$thing/up/property/"+PRODUCT_ID+"/"+DEVICE_NAME
MQTT_SERVER = PRODUCT_ID + ".iotcloud.tencentdevices.com"
MQTT_PORT = 1883
MQTT_CLIENT_ID = PRODUCT_ID+DEVICE_NAME
MQTT_USERNAME = ""
MQTT_PASSWORD = ""
class LightSensor():
def __init__(self):
self.light = Light(36)
class TencentMQTT():
light_sensor = LightSensor()
def __init__(self):
self.mqtt_client = None
def connect(self):
self.mqtt_client = MQTTClient(MQTT_CLIENT_ID, MQTT_SERVER, MQTT_PORT, MQTT_USERNAME, MQTT_PASSWORD, 60)
self.mqtt_client.set_callback(TencentMQTT.control)
self.mqtt_client.connect()
"""
接收订阅的消息(用于远程控制)
"""
@staticmethod
def control(topic, msg):
pass
"""
发送设备的状态消息
"""
def report(self):
msg = {
"method": "report",
"clientToken": "clientToken-0123456789",
"params": {
"Illuminance": self.light_sensor.value()
}
}
self.mqtt_client.publish(MQTT_DEVICE_STATUS_TOPIC.encode(), ujson.dumps(msg).encode())
"""
消息循环
"""
def loop(self):
self.mqtt_client.subscribe(MQTT_DEVICE_CONTROL_TOPIC.encode())
up_time = 5000
time_sleep = 50
time_count = 0
while True:
self.mqtt_client.check_msg()
time_count += time_sleep
if (time_count >= up_time):
self.report()
time_count = 0
time.sleep_ms(time_sleep)









from machine import PWM
from machine import Pin
class LED():
"""
LED模块
"""
def __init__(self, rpin, gpin, bpin, freq=1000):
"""
构造函数
:param pin: 接LED的管脚,必须支持PWM
:param freq: PWM的默认频率是1000
"""
self.pin_red = Pin(rpin)
self.pin_green = Pin(gpin)
self.pin_blue = Pin(bpin)
self.led_red = PWM(self.pin_red, freq = freq)
self.led_green = PWM(self.pin_green, freq = freq)
self.led_blue = PWM(self.pin_blue, freq = freq)
def rgb_light(self, red, green, blue, brightness):
if red in range(256) and \
green in range(256) and \
blue in range(256) and \
0.0 <= brightness and \
brightness <=1.0:
self.led_red.duty(int(red/255*brightness*1023))
self.led_green.duty(int(green/255*brightness*1023))
self.led_blue.duty(int(blue/255*brightness*1023))
else:
print("red green blue must between 0 and 255, and brightness from 0.0 to 1.0")
def deinit(self):
"""
析构函数
"""
self.led_red.deinit()
self.led_green.deinit()
self.led_blue.deinit()

esptool.py --chip esp32 --port /dev/cu.usbserial-1410 erase_flash
esptool.py --chip esp32 --port /dev/cu.usbserial-1410 --baud 460800 write_flash -z 0x1000 esp32-idf3-20210202-v1.14.bin
import ubluetooth
ble = ubluetooth.BLE()
ble.active(True)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 110] ETIMEDOUT

esptool.py read_mac 命令,确认连接成功。$ esptool.py read_mac
esptool.py v3.0
Found 2 serial ports
Serial port /dev/cu.usbserial-0001
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: f4:cf:a2:ec:0a:86
Uploading stub...
Running stub...
Stub running...
MAC: f4:cf:a2:ec:0a:86
Hard resetting via RTS pin...
$ ls /dev/cu*
/dev/cu.Bluetooth-Incoming-Port /dev/cu.usbserial-0001
esptool.py --port /dev/cu.usbserial-0001 erase_flash
烧录固件 esptool.py --port /dev/cu.