# 4. Relay_DHT11_WS2812 5050 RGB LED <p style="text-align:right">Steven Lee</p> ## 繼電器(Relay) ![](https://i.imgur.com/vMWuiqd.png) * NO:Normal Open,常開,也就是正常情況它是不通電的。 * COM:Common Ground,共接電,很多人習慣把外電接到這個接腳,再從NO或NC接到外部設備上。 * NC:Normal Close,常閉,它在正常情況下是接通的。 * NO和NC一次只會選擇接一個 ```python= import time import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) Sing =11 GPIO.setwarnings(False) GPIO.setup(Sing,GPIO.OUT,initial=GPIO.LOW) def do_action(): GPIO.output(Sing,True) time.sleep(1) GPIO.output(Sing,False) time.sleep(1) for i in range(1,5): do_action() ``` ## 溫溼度感測器(DHT11) ![](https://i.imgur.com/MJOodmw.png) * 超低成本 * 3 至 5V 電源和 I/O * 轉換期間最大電流使用2.5mA(請求數據時) * 適用於 20-80% 濕度讀數,精度為 5% * 適用於 0-50°C 溫度讀數±2°C 精度 * 不超過 1 Hz 採樣率(每秒一次) * 體積小 ```python= import time import Adafruit_DHT GPIO_PIN = 4 humidity,temperature = 0.0,0.0 while True: humidity,temperature = Adafruit_DHT.read_retry(Adafruit_DHT.DHT11,GPIO_PIN) payload = {'temperature' : temperature , 'humidity' : humidity} print (payload) ``` ## 可程式控制RGB燈條(WS2812 5050 RGB LED) ![](https://i.imgur.com/gNBD7Ec.png) ``` pip install adafruit-circuitpython-neopixel ``` ![](https://i.imgur.com/DDJFURB.png) ![](https://i.imgur.com/94lQOyW.png) 上圖充分解釋了 WS2812 傳資料的模式,舉個例子來解釋或許會比較清楚。假設我有 10 顆 WS2812 LED (先不論電壓電流等因素,只討論資料傳送),相當於要傳 240 bits 資料 (因為 1 顆 RGB LED 是 24 bits),送完後要拉 LOW 至少 50us 讓 WS2812 知道資料傳完了,如果沒有這個機制 (reset code),WS2812 會以為資料還沒送完,就不會顯示任何東西。 而這 240 bits 放進 LED 的方式,比如說用前 48 bits 來解釋的話即為,假設開頭的 48 bits 為 11111111 00101101 10001011 00100101 00011110 11001110…… 第一個位置的 LED 所被放進的值就為 11111111 00101101 10001011。 然後原本的 48 bits 就會少掉 24 bits (因為給了第一個位置的 LED),變成 00100101 00011110 11001110,然後這 24 bits 又會被放到第二個位置的 LED,以此類推,直到拉 LOW 50us 表示資料傳送完畢,並且顯示出資料對應的數值顏色。 ```python= import time import board import neopixel pixel_pin = board.D18 num_pixels = 32+16 #根據LED數量決定 ORDER = neopixel.GRB pixels = neopixel.NeoPixel( pixel_pin, num_pixels, brightness=0.2, auto_write=False, pixel_order=ORDER ) def wheel(pos): if pos < 0 or pos > 255: r = g = b = 0 elif pos < 85: r = int(pos * 3) g = int(255 - pos * 3) b = 0 elif pos < 170: pos -= 85 r = int(255 - pos * 3) g = 0 b = int(pos * 3) else: pos -= 170 r = 0 g = int(pos * 3) b = int(255 - pos * 3) return (r, g, b) if ORDER in (neopixel.RGB, neopixel.GRB) else (r, g, b, 0) def rainbow_cycle(wait): for j in range(255): for i in range(num_pixels): pixel_index = (i * 256 // num_pixels) + j pixels[i] = wheel(pixel_index & 255) pixels.show() time.sleep(wait) while True: pixels.fill((255, 0, 0)) pixels.show() time.sleep(1) pixels.fill((0, 255, 0)) pixels.show() time.sleep(1) pixels.fill((0, 0, 255)) pixels.show() time.sleep(1) rainbow_cycle(0.001) ``` ###### tags: `物聯網`