# Умная RGB лампа В качестве основы для построения умной лампы будем использовать адресные светодиоды WS2812B (Neopixel). ![](/assets/images/iot/04/ws2812.jpg) Логика работы простая - все адресные светодиоды кроме собственно RGB светодиода содержат контроллер, который получает поток данных, обрабатывает его и направляет дальше. Обычно они объединяются в цепочку друг за другом. Описание протокола работы из Datasheet: ![](/assets/images/iot/04/ws2812_signal_send.png) Логика обработки - по сигнальному проводу отправляется цепочка байт. Каждые 3 байта - это компоненты RGB цветового сигнала. Первый адресный контроллер вырезает и использует первые три байта из направленного ему потока данных, направляя дальше остальной поток без изменений. Соответственно на уровне программы следует заранее знать, сколько светодиодов будет в цепочке. Библиотека <https://github.com/adafruit/Adafruit_NeoPixel> содержит всё необходимое для работы. ### Схема подключения ![](/assets/images/iot/04/rgb_led.svg) | WeMos D1 | RGB | |----------|-------| | 3v3 | VCC | | GND | GND | | **D7** | IN | Использование пина D7 критично - в текущей версии библиотеки отсылка данных идёт через SPI, а на WeMosS D1 отправка данных через MOSI привязана именно к этому пину. ### Пример программы ```c #include <Adafruit_NeoPixel.h> #define PIN D7 #define NUMPIXELS 8 // Parameter 1 = number of pixels in strip // Parameter 2 = Arduino pin number (most are valid) // Parameter 3 = pixel type flags, add together as needed: // NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs) // NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products) Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); int r, g, b, j = 0; void setup() { strip.begin(); // This initializes the NeoPixel library. } void loop() { colorWipe(strip.Color(0, 0, 0), 50); // Black/off colorWipe(strip.Color(255, 0, 0), 50); // Red colorWipe(strip.Color(0, 255, 0), 50); // Green colorWipe(strip.Color(0, 0, 255), 50); // Blue delay(100); } void colorWipe(uint32_t c, uint8_t wait) { for(uint16_t i = 0; i < strip.numPixels(); i++) { strip.setPixelColor(i, c); strip.show(); delay(wait); } } ``` ### Итоговое устройство ![](/assets/images/iot/04/rgb_led.jpg) ## Задача Написать прошивку, которая будет зажигать все светодиоды одним цветом, полученным из топика **itschool/rgb_lamp** (subscribe). [к списку задач](iot/summer/tasks)