Здравствуйте, господа. Я не очень силен в программировании, но очень хочется сделать свой проект.
Надеюсь на вашу помощь.
У меня есть WeMos d1 r1 - esp8266 и матрица из ленты ws2812b.
Хотелось бы как-то реализовать простой контроль за состоянием дверей и окон. В моем представлении это выглядит следующим образом:
Wi-Fi модуль считывает входящие данные с датчиков состояния и передает полученную информацию на светодиодную ленту.
У меня датчика на данный момент нет, поэтому я решил воспользоваться маленькой хитростью на первое время (на датчики перейду потом) - за счет простой перемычки на gpio2 образую прерывание и это эмитирует датчик. Итак, если есть сигнал от перемычки - на светодиодной ленте отображается соответствующий пиксель.
Есть мой код для отображения информации на пиксели:
А теперь главный вопрос: Как это все сделать через wi-fi? Я пока с таким не сталкивался, поэтому откровенно без понятия, что с этим делать.
Нашел на просторах интернета код для управления светодиодом.
После просмотра кода я попытался влепить свой "печальный" код для ленты в готовый код управления светодиодом:
В итоге получилось такое страшилище, что даже "недопеределал".
Может сможет кто-то что-то подсказать по этому поводу?
Спасибо за внимание!
Надеюсь на вашу помощь.
У меня есть 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);
}
Нашел на просторах интернета код для управления светодиодом.
Код:
#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)
}
В итоге получилось такое страшилище, что даже "недопеределал".
Может сможет кто-то что-то подсказать по этому поводу?
Спасибо за внимание!
Последнее редактирование: