• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 командами.
Я до датчиков пока не дошел, рассматриваю как сделать саму точку доступа с модулем.
А исходя из этого уже смотреть как будут подключаться датчики.
Кстати, а вы можете посоветовать какие-то материалы по данной теме?
 
Сверху Снизу