# Умная RGB лампа
В качестве основы для построения умной лампы будем использовать адресные светодиоды WS2812B (Neopixel).
![](/assets/images/iot/04/ws2812.jpg)
Логика работы простая - все адресные светодиоды кроме собственно RGB светодиода содержат контроллер, который получает поток данных,
обрабатывает его и направляет дальше. Обычно они объединяются в цепочку друг за другом.
Описание протокола работы из Datasheet:
![](/assets/images/iot/04/ws2812_signal_send.png)
Логика обработки - по сигнальному проводу отправляется цепочка байт. Каждые 3 байта - это компоненты RGB цветового сигнала.
Первый адресный контроллер вырезает и использует первые три байта из направленного ему потока данных, направляя дальше остальной поток без изменений.
Соответственно на уровне программы следует заранее знать, сколько светодиодов будет в цепочке.
Библиотека содержит всё необходимое для работы.
### Схема подключения
![](/assets/images/iot/04/rgb_led.svg)
| WeMos D1 | RGB |
|----------|-------|
| 3v3 | VCC |
| GND | GND |
| **D7** | IN |
Использование пина D7 критично - в текущей версии библиотеки отсылка данных идёт через SPI, а на WeMosS D1 отправка данных через MOSI привязана именно к этому пину.
### Пример программы
```c
#include
#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)