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

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

Isten

New member
Всем привет! Работаю сейчас над wemos d1 r1 на базе esp8266 и светодиодной лентой ws2812b.
Есть идея и есть "скетч", в котором куча мусора и ничего не понятно. Лепил тяп-ляп т.к. очень плох в программировании.
#include <Adafruit_NeoPixel.h>
#define PIN 2 // номер порта к которому подключен модуль
//#define DOOR 0 // Номер порта "датчика" двери. (Подключён конкретный контакт)
//#define WINDOW 5 // Номер порта "датчика" окна. (Подключён конкретный контакт)

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <ESP8266WebServer.h>
const int relayPin = 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

};

const char* ssid1 = "test1"; // WiFi router

const char* password1 = "12345678";

const char* ssid2 = "test2"; // modem Samsung

const char* password2 = "12345678";

const char* ssid3 = "test1"; // WiFi router

const char* password3 = "12345678";

const char* ssid4 = "test2"; // modem Samsung

const char* password4 = "123456";

ESP8266WebServer server(80);

byte success = 0;
const int pins[] = {16, 5, 4, 0, 2,14,12,13,15}; //pin GPIO
// D0,D1,D2,D3,D4,D5,D6,D7,D8 pin label
char *State = "111111111 - State of pins: D0 ... D8"; // GPIO = 16, 5, 4, 0, 2,14,12,13,15
//выводим в терминал состояние пинов т.к. если есть сигнал на пин,то 1, если нет, то 0.

void handleRoot() {
digitalWrite(LED_BUILTIN, 1);
for(int i=0;i<9;i++) State = digitalRead(pins) + 0x30;
//server.send(200, "text/plain", "hello from esp8266!");
server.send(200, "text/plain", State);
digitalWrite(LED_BUILTIN, 0);
}

void handleNotFound(){
digitalWrite(LED_BUILTIN, 1);
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET)?"GET":"POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i=0; i<server.args(); i++){
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
digitalWrite(LED_BUILTIN, 0);
}

void setup(void){
//pinMode(led, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
pinMode(relayPin, OUTPUT);
digitalWrite(relayPin, HIGH);
delay(1000); // wait for a second
for(int i = 2; i > 0; i--)
{
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
digitalWrite(relayPin, HIGH);
delay(500);
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
digitalWrite(relayPin, LOW);
delay(500); // wait for a second
}
delay(1000);
Serial.begin(9600);
Serial.print("Connecting to ");
Serial.println(ssid1);
WiFi.begin(ssid1, password1);
int count = 40;
while ((WiFi.status() != WL_CONNECTED) && (count > 0)) {
delay(500);
count -= 1;
Serial.print(".");
}
Serial.println(""); Serial.print(ssid1);
if(count >0){
success = 1;
Serial.println(" connected");
Blink_N(1);
} else Serial.println(" not connected");

if(!success)

{

//Serial.println();

Serial.print("Connecting to ");

Serial.println(ssid2);

WiFi.begin(ssid2, password2);

count = 40;

while ((WiFi.status() != WL_CONNECTED) && (count > 0))

{

delay(500);

count -= 1;

Serial.print(".");

}

Serial.println(""); Serial.print(ssid2);

if(count >0)

{

success = 1;

Serial.println(" connected");

Blink_N(2);

} else Serial.println(" not connected");

}

if(!success)

{

//Serial.println();

Serial.print("Connecting to ");

Serial.println(ssid3);

WiFi.begin(ssid3, password3);

count = 40;

while ((WiFi.status() != WL_CONNECTED) && (count > 0))

{

delay(500);

count -= 1;

Serial.print(".");

}

Serial.println(""); Serial.print(ssid3);

if(count >0)

{

success = 1;

Serial.println(" connected");

Blink_N(3);

} else Serial.println(" not connected");

} Serial.println(WiFi.localIP());


if(!success)
{
Serial.print("Connecting to ");
Serial.println(ssid4);
WiFi.begin(ssid4, password4);
count = 40;
while ((WiFi.status() != WL_CONNECTED) && (count > 0))
{
delay(500);
count -= 1;
Serial.print(".");
}
Serial.println(""); Serial.print(ssid4);
if(count >0)
{
success = 1;
Serial.println(" connected");
Blink_N(4);
} else Serial.println(" not connected");
} Serial.println(WiFi.localIP());

if (MDNS.begin("esp8266")) {
Serial.println("MDNS responder started");
}

server.on("/", handleRoot);

server.on("/inline", [](){

server.send(200, "text/plain", "this works as well");

});

server.onNotFound(handleNotFound);

server.begin();

Serial.println("HTTP server started");



strip.begin();

strip.clear(); // очистить

strip.show(); // отправить на ленту

strip.setBrightness(50); // яркость, от 0 до 255

//pinMode(2, INPUT);

// digitalWrite(2, HIGH);

// pinMode(DOOR, INPUT_PULLUP); подтягиваем внутренние резисторы для конкретного контакта DOOR 0

//digitalWrite(3, HIGH);

// pinMode(WINDOW, INPUT_PULLUP); подтягиваем внутренние резисторы для конкретного контакта WINDOW 5


//digitalWrite(4, HIGH);

}


void loop(void){

server.handleClient();

//while (!server.client.available()) {

//delay(1);

//

// 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])); //Проверяем сигнал для конкретного контакта 0. По умолчанию значение светодиода зелёный.

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])); Проверяем сигнал для конкретного контакта 5. По умолчанию значение светодиода зелёный.

else strip.setPixelColor( 6, strip.Color( palette1[1][0], palette1[1][1], palette1[1][2])); //Если есть сигнал, то зажигаем соответствующий светодиод красным.

strip.show(); // отправить на ленту
delay(1000);
}
}



Изначально данный скетч работал так:
На контакт, например, #define DOOR 0 приходил сигнал и светодиод на ленте окрашивался в соответсвующий цвет с помощью палитры:
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
};

Проблема заключается в переносе этого всего на модуль wemos.
Как совместить подключение к серверу и окрашивание ленты в разные цвета?
Я вижу это примерно так:
1. #define STRIPSIZE 7 - Определяем количество пикселей, которые будем закрашивать.
2.
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
};
- делаем палитру цветов.
3. Подключаемся к серверу.
4.
const int pins[] = {16, 5, 4, 0, 2,14,12,13,15}; //pin GPIO
// D0,D1,D2,D3,D4,D5,D6,D7,D8 pin label
- определяем пины.
char *State = "111111111 - State of pins: D0 ... D8"; // GPIO = 16, 5, 4, 0, 2,14,12,13,15
- Выводим в терминал состояние пинов т.к. если есть сигнал на пин,то 1, если нет, то 0. Например, GPIO = 16 - приходит сигнал , то в терминале отображается его состояние - '1'. И так с соответсвующими пинами.
5.
strip.begin();
strip.clear(); // очистить
strip.show(); // отправить на ленту
strip.setBrightness(50); // яркость, от 0 до 255
- Инициализируем работу с лентой, чтобы можно было её окрасить и очистить.
6.
if (digitalRead(DOOR)) strip.setPixelColor( 3, strip.Color( palette1[2][0], palette1[2][1], palette1[2][2])); //Проверяем сигнал для конкретного контакта 0. По умолчанию значение светодиода зелёный.

else strip.setPixelColor( 3, strip.Color( palette1[3][0], palette1[3][1], palette1[3][2])); //Если есть сигнал, то зажигаем соответствующий светодиод синим.
- Здесь взят пример конкретного пина (DOOR 5), а нужно , чтобы окрашивался любой пин, на который приходит сигнал и он в терминале отображается '1'.
Условно, если на GPIO = 16 приходит сигнал '1', а на остальные нет, то именно он окрашивается в цвет из палитры.
В общем, идея есть. Может кто-то подсказать с кодом как это можно реализовать?
Если не понятно моё описание, то попробую переформулировать.
 

svs2007m

Active member
Дружище ! желающих ковырятся в "Вашей солянке" врядли здесь найдешь. Может начать с простого , Предположу что это возможно сигнализация. Какая площадь объекта, этажность, конструктивные особенности здания, какие датчики обнаружения планируете , помехозащищенность, питание, и т.д . Провода, WI-FI или радиоканал.
1. Просто каждый параметр меняет "Ваш скетч" до в "мусорку".
2.Предложу начать с простого :)
 

Isten

New member
Дружище ! желающих ковырятся в "Вашей солянке" врядли здесь найдешь. Может начать с простого , Предположу что это возможно сигнализация. Какая площадь объекта, этажность, конструктивные особенности здания, какие датчики обнаружения планируете , помехозащищенность, питание, и т.д . Провода, WI-FI или радиоканал.
1. Просто каждый параметр меняет "Ваш скетч" до в "мусорку".
2.Предложу начать с простого :)
Понял. Спасибо, посмотрю)
Я просто много чего пересмотрел и начитал. Беда именно в скетче, т.е. программист из меня 0.
За ссылочку на видео - спасибо.
 
Сверху Снизу