• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Управление светодиодной лентой ws2812b по wi-fi от wemos d1 r1

Isten

New member
Здравствуйте, господа. Я не очень силен в программировании, но очень хочется сделать свой проект.
Надеюсь на вашу помощь.
У меня есть WeMos d1 r1 - esp8266 и матрица из ленты ws2812b.
Хотелось бы как-то реализовать простой контроль за состоянием дверей и окон. В моем представлении это выглядит следующим образом:
Wi-Fi модуль считывает входящие данные с датчиков состояния и передает полученную информацию на светодиодную ленту.
У меня датчика на данный момент нет, поэтому я решил воспользоваться маленькой хитростью на первое время (на датчики перейду потом) - за счет простой перемычки на gpio2 образую прерывание и это эмитирует датчик. Итак, если есть сигнал от перемычки - на светодиодной ленте отображается соответствующий пиксель.
Есть мой код для отображения информации на пиксели:
Код:
#include <Adafruit_NeoPixel.h>
#define PIN 2 // номер порта к которому подключен модуль
#define DOOR 0 // Номер порта "датчика" двери
#define WINDOW 5 // Номер порта "датчика" окна

#define STRIPSIZE 7  // количество светодиодов
#define BRIGHTNESS 128
Adafruit_NeoPixel strip = Adafruit_NeoPixel(STRIPSIZE, PIN, NEO_GRB + NEO_KHZ800); //first number change does distance between colors
uint8_t s;
uint8_t  palette1[7][3] ={
  {0,0,0}, //black
  {255,0,0}, //red сигнализирует о проблеме с объектом "дверь"
  {0,255,0}, //green сигнализирует о "нормальном" состоянии объектов
  {0,0,255}, //blue сигнализирует о проблеме с объектом "Окно"
  {255,255,0}, //yellow
  {255,0,255}, //magenta другой датчик
  {255,255,255} //white
};


void setup() {
  strip.begin();
  strip.clear();                          // очистить
  strip.show();                           // отправить на ленту
  strip.setBrightness(50);    // яркость, от 0 до 255
  //pinMode(2, INPUT);
// digitalWrite(2, HIGH);
  pinMode(DOOR, INPUT_PULLUP);
  //digitalWrite(3, HIGH);
  pinMode(WINDOW, INPUT_PULLUP);
  //digitalWrite(4, HIGH);
}
void loop() {
   // if (digitalRead(2)) strip.setPixelColor( 0, strip.Color( palette1[2][0], palette1[2][1], palette1[2][2]));
    //else strip.setPixelColor( 0, strip.Color( palette1[1][0], palette1[1][1], palette1[1][2]));
    if (digitalRead(DOOR)) strip.setPixelColor( 3, strip.Color( palette1[2][0], palette1[2][1], palette1[2][2])); //Проверим сигнал для двери
    else strip.setPixelColor( 3, strip.Color( palette1[3][0], palette1[3][1], palette1[3][2]));
    if (digitalRead(WINDOW)) strip.setPixelColor( 6, strip.Color( palette1[2][0], palette1[2][1], palette1[2][2]));
    else strip.setPixelColor( 6, strip.Color( palette1[1][0], palette1[1][1], palette1[1][2]));
    strip.show();                         // отправить на ленту
    delay(1000);
}
А теперь главный вопрос: Как это все сделать через wi-fi? Я пока с таким не сталкивался, поэтому откровенно без понятия, что с этим делать.
Нашел на просторах интернета код для управления светодиодом.
Код:
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

int val = 0;                         // По умолчанию диод не горит
const char *ssid = "MyTest";      // Название сети WiFi
const char *password = "1234567890"; // Пароль для подключения
ESP8266WebServer server(80);         // Создаем веб сервер на 80 порту

// Метод формирует стартовую страницу http://192.168.4.1
// Выводит в браузер текущее состояние диода и две кнопки
void handleRoot() {
  String s = (val) ? "<h1>LED On</h1>" : "<h1>LED Off</h1>";
  s += "<h2><a href=\"/led/on\">LED On</a> ";
  s += "<a href=\"/led/off\">LED Off</a></h2>";
  server.send(200, "text/html", s);
}

// Метод включения диода
void ledOn() {
  val = 1; // Включаем диод
  digitalWrite(BUILTIN_LED, val);
  // Перенаправление обратно на стартовую страницу
  server.sendHeader("Location", String("/"), true);
  server.send ( 302, "text/plain", "");
}

// Метод выключения диода
void ledOff() {
  val = 0; // Выключаем диод
  digitalWrite(BUILTIN_LED, val);
  // Перенаправление обратно на стартовую страницу
  server.sendHeader("Location", String("/"), true);
  server.send ( 302, "text/plain", "");
}

// Функция настройки. Выполняется один раз при запуске
void setup() {
  delay(1000);                 // Ждём секунду
  WiFi.softAP(ssid, password); // Создаём точку WiFi
  // Указываем по каким роутам какие методы запускать
  server.on("/", handleRoot);
  server.on("/led/on", ledOn);
  server.on("/led/off", ledOff);
  server.begin();
  // Диод по умолчанию выключен
  pinMode(BUILTIN_LED, OUTPUT);
  digitalWrite(BUILTIN_LED, val);
}

// Основной цикл программы
void loop() {
  // Ждём подключения
  server.handleClient();
}

После просмотра кода я попытался влепить свой "печальный" код для ленты в готовый код управления светодиодом:
Код:
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <Adafruit_NeoPixel.h>
#define PIN 2 // номер порта к которому подключен модуль
#define DOOR 0 // Номер порта "датчика" двери
#define WINDOW 5 // Номер порта "датчика" окна

#define STRIPSIZE 7  // количество светодиодов
#define BRIGHTNESS 128
Adafruit_NeoPixel strip = Adafruit_NeoPixel(STRIPSIZE, PIN, NEO_GRB + NEO_KHZ800); //first number change does distance between colors
uint8_t st;
uint8_t  palette1[7][3] ={
  {0,0,0}, //black
  {255,0,0}, //red сигнализирует о проблеме с объектом "дверь"
  {0,255,0}, //green сигнализирует о "нормальном" состоянии объектов
  {0,0,255}, //blue сигнализирует о проблеме с объектом "Окно"
  {255,255,0}, //yellow
  {255,0,255}, //magenta другой датчик
  {255,255,255} //white
};

int val = 0;                         // По умолчанию диод не горит
const char *ssid = "MyTest";      // Название сети WiFi
const char *password = "1234567890"; // Пароль для подключения
ESP8266WebServer server(80);         // Создаем веб сервер на 80 порту

// Метод формирует стартовую страницу http://192.168.4.1
// Выводит в браузер текущее состояние диода и две кнопки
void handleRoot() {
  String s = (val) ? "<h1>LED On</h1>" : "<h1>LED Off</h1>";
  s += "<h2><a href=\"/led/on\">LED On</a> ";
  s += "<a href=\"/led/off\">LED Off</a></h2>";
  server.send(200, "text/html", s);
}

// Метод включения диода
void ledOn() {
  val = 1; // Включаем диод
  digitalWrite(BUILTIN_LED, val);
  // Перенаправление обратно на стартовую страницу
  server.sendHeader("Location", String("/"), true);
  server.send ( 302, "text/plain", "");
}

// Метод выключения диода
void ledOff() {
  val = 0; // Выключаем диод
  digitalWrite(BUILTIN_LED, val);
  // Перенаправление обратно на стартовую страницу
  server.sendHeader("Location", String("/"), true);
  server.send ( 302, "text/plain", "");
}

// Функция настройки. Выполняется один раз при запуске
void setup() {
  delay(1000);                 // Ждём секунду
  WiFi.softAP(ssid, password); // Создаём точку WiFi
  // Указываем по каким роутам какие методы запускать
  server.on("/", handleRoot);
  server.on("/led/on", ledOn);
  server.on("/led/off", ledOff);
  server.begin();
  // Диод по умолчанию выключен
  //pinMode(BUILTIN_LED, OUTPUT);
  //digitalWrite(BUILTIN_LED, val);
  strip.begin();
  strip.clear();                          // очистить
  strip.show();                           // отправить на ленту
  strip.setBrightness(50);    // яркость, от 0 до 255
  //pinMode(2, INPUT);
// digitalWrite(2, HIGH);
  pinMode(DOOR, INPUT_PULLUP);
  //digitalWrite(3, HIGH);
  pinMode(WINDOW, INPUT_PULLUP);
  //digitalWrite(4, HIGH);
}

// Основной цикл программы
void loop() {
  // Ждём подключения
  server.handleClient();
     // if (digitalRead(2)) strip.setPixelColor( 0, strip.Color( palette1[2][0], palette1[2][1], palette1[2][2]));
    //else strip.setPixelColor( 0, strip.Color( palette1[1][0], palette1[1][1], palette1[1][2]));
    if (digitalRead(DOOR)) strip.setPixelColor( 3, strip.Color( palette1[2][0], palette1[2][1], palette1[2][2])); //Проверим сигнал для двери
    else strip.setPixelColor( 3, strip.Color( palette1[3][0], palette1[3][1], palette1[3][2]));
    if (digitalRead(WINDOW)) strip.setPixelColor( 6, strip.Color( palette1[2][0], palette1[2][1], palette1[2][2]));
    else strip.setPixelColor( 6, strip.Color( palette1[1][0], palette1[1][1], palette1[1][2]));
    strip.show();                         // отправить на ленту
    delay(1000)
}

В итоге получилось такое страшилище, что даже "недопеределал".
Может сможет кто-то что-то подсказать по этому поводу?
Спасибо за внимание!
 
Последнее редактирование:

Сергей_Ф

Moderator
Команда форума
@Isten а зачем вам wifi? Датчик подключен по поводу, лента тоже. Где тут место wifi-ю?
Или вы датчик хотите по wifi? Тогда надо несколько eso8266.
 

Isten

New member
@Isten а зачем вам wifi? Датчик подключен по поводу, лента тоже. Где тут место wifi-ю?
Или вы датчик хотите по wifi? Тогда надо несколько eso8266.
Задумка именно в wi-fi. Да, Датчик должен передавать состояние окна/двери без проводов на wi-fi модуль, а вот дальше по проводам на ленту)
 

Isten

New member
@Isten чем питать датчики будете?
На данный момент питание для датчиков не рассматривается, поскольку нет самих датчиков. Как я сказал выше, я ими хотел бы заняться после того, как смогу что-то сделать с перемычкой + сделать сеть с модулем esp8266. У меня перемычки эмитируют состояния датчиков на данный момент. Думаю, я вижу несостыковочку - "перемычки не равно датчики". Но все же, вопрос остается открыт в качестве имитации поступающего сигнала и вывода результата на ленту. Как в коде №2, который управляет светодиодом, я хотел бы аналогично отобразить информацию на ленте (достаточно тоже 1-2 пикселя).
 

Isten

New member
Начнем разбираться.
Вы хотите сделать следующее.
Датчики на двери и окнах.
Светодиодная лента где-то в квартире(доме).
Когда открываете окно или дверь на ленте загорается определенный диод.
Все верно?
-------------------------
Если да, то Wifi используется следующим образом.
Каждый датчик - это ESP на пин которого подается импульс при открытии окна(двери) . Можно подавать и на RST т е делать рестарт.
В результате ESP включается и передает по Wifi сигнал на ленту. После этого ESP можно выключить или перевести в deep-sleep
В таком варианте питать ESP датчика можно от батарейки.
ESP на датчиках работают как станции по протоколу UDP.
Можно использовать широковещательный режим, чтобы сделать программу для них идентичную и без доп настроек.
Т е такой датчик будет одинаковый для дверей и окон.
---
На ленте ESP работает как сервер и принимает сигналы от датчиков, определяет их IP и зажигает соответствующий диод на ленте.
=======================
Сеть можно построить через роутер, либо ESP на ленте сделать точкой доступа.
Совершенно верно! Да, идея такая как вы описали. Я думал сделать именно модуль WeMos d1 r1 с esp точкой доступа, чтобы не оперировать AT командами.
Я до датчиков пока не дошел, рассматриваю как сделать саму точку доступа с модулем.
А исходя из этого уже смотреть как будут подключаться датчики.
Кстати, а вы можете посоветовать какие-то материалы по данной теме?
 
Сверху Снизу