Наверно многие из вас задумывались о простом индикаторе событий, почты, состояния серверов и т.д., но сегодняшний рынок не предоставляет готовых решений, способных охватить все возможные уведомления. В результате изучения различных модулей для Arduino мне на глаза попалась панель 4х4 из 16 RGB светодиодов для управления которыми достаточно только одного выхода микроконтроллера.
Для управления светодиодами есть специальная библиотека «NeoPixelBus» под Arduino. Вдоволь наигравшись с моргающими светодиодами было решено собрать простой индикатор событий, платформой для которого стал модуль на чипе ESP8266, а управление основано на GET-запросах.
Был заказан модуль с платой на которой распаяны подтягивающие сопротивления и оставлено место под регулятор напряжения (Светодиоды работают от 5В, беспроводной модуль от 3,3В). Регулятор напряжения я выпаял из старой железяки, предварительно убедившись, что он выдает 3,3 В. Впаяв регулятор, необходимо удалить нулевое сопротивление с другой стороны платы. Соединив питание обоих плат, пин 14 с входом LED-матрицы, получился вот такой «бутерброд» (4см х 4см х 1см):
Остается залить новую прошивку и саму программу управления. Соединив собранное устройство с Arduino по следующей схеме, была загружена последняя прошивка через программу «XTCOM_UTILITY». (Для режима прошивки-программирования необходимо замкнуть пин 00 на землю)
Управление светодиодами решено было осуществить по следующей схеме запросов:
Яркость определенного канала регулируется в пределах от 0 до 255, тем самым можно получить любой цвет, любой яркости. Запрос ip/00 тушит все светодиоды.
Программировал в среде Arduino, подключив необходимые библиотеки, сам код программы:
#include <NeoPixelBus.h>
#include <ESP8266WiFi.h>
#define pixelCount 16 //LEDs
NeoPixelBus strip = NeoPixelBus(pixelCount, 14, NEO_GRB); //14 - GPIO14
const char *ssid = "*******"; //WiFi name
const char *password = "*******"; //WiFi key
WiFiServer server(80);
void setup() {
pinMode(2, OUTPUT);
digitalWrite(2, 0);
WiFi.begin(ssid, password);
strip.Begin();
strip.Show();
server.begin();
}
void loop() {
// Check if a client has connected
WiFiClient client = server.available();
if (!client) {
return;
}
while(!client.available()){
delay(1);
}
String data = client.readStringUntil('r');
client.flush();
String str,R,G,B,N;
str = String ("GET /");
if (str== data.substring(0,5)) {
digitalWrite(2, 1);
N=data.substring(5,7);
R=data.substring(7,10);
G=data.substring(10,13);
B=data.substring(13,16);
if (N.toInt()==00) {
for (int i=0; i< pixelCount; i++){
strip.SetPixelColor(i,0);
strip.Show();
}
}
strip.SetPixelColor(N.toInt()-1,RgbColor (R.toInt(),G.toInt(),B.toInt()));
strip.Show();
}
client.flush();
String s = "HTTP/1.1 200 OKrnContent-Type: text/htmlrnrn<!DOCTYPE HTML>rn<html>rnOK ";
s += "</html>n";
client.print(s);
digitalWrite(2, 0);
delay(1);
}
Итоговый пример работы устройства:
У меня все это питается через USB кабель от телефонной зарядки, можно припаять микро USB разъем для большей красоты и миниатюрности.
Цена устройства около 8$, знания электротехники-програмирования минимальны, время на пайку незначительное. Если недостаточно индикаторов, то можно купить светодиодную матрицу 8х8.
С радостью отвечу на все вопросы.
Автор: Испанский лётчик