В качестве основы для построения умной лампы будем использовать адресные светодиоды WS2812B (Neopixel).
Для удобства работы провода уже распаяны и закреплены термоусадочной трубкой. Черный провод - GND, красный провод - +5 V (используем цветовую маркировку блоков питания ATX :), желтый - сигнальный - DATA.
Логика работы простая - все адресные светодиоды кроме собственно RGB светодиода содержат контроллер, который получает поток данных, обрабатывает его и направляет дальше. Обычно они объединяются в цепочку друг за другом.
Описание протокола работы из Datasheet:
Логика обработки - по сигнальному проводу отправляется цепочка байт. Каждые 3 байта - это компоненты RGB цветового сигнала. Первый адресный контроллер вырезает и использует первые три байта из направленного ему потока данных, направляя дальше остальной поток без изменений. Соответственно на уровне программы следует заранее знать, сколько светодиодов будет в цепочке.
Библиотека https://github.com/adafruit/Adafruit_NeoPixel содержит всё необходимое для работы.
Пример готового устройства.
Пример кода для работы:
#include <Adafruit_NeoPixel.h>
#define PIN D7
#define NUMPIXELS 8
#define BRIGHTNESS 50
// 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 delayval = 50;
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);
}
}
Задача:
Задача - написать прошивку, которая будет зажигать все светодиоды одним цветом, полученным из топика rtfbest/rgb_lamp (subscribe)
Использование пина D7 критично - в текущей версии библиотеки отсылка данных идёт через SPI, а на WEMOS D1 Mini отправка данных через MOSI привязана именно к этому пину.