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