Всем привет! Работаю сейчас над wemos d1 r1 на базе esp8266 и светодиодной лентой ws2812b.
Есть идея и есть "скетч", в котором куча мусора и ничего не понятно. Лепил тяп-ляп т.к. очень плох в программировании.
Изначально данный скетч работал так:
На контакт, например, #define DOOR 0 приходил сигнал и светодиод на ленте окрашивался в соответсвующий цвет с помощью палитры:
Проблема заключается в переносе этого всего на модуль wemos.
Как совместить подключение к серверу и окрашивание ленты в разные цвета?
Я вижу это примерно так:
1. #define STRIPSIZE 7 - Определяем количество пикселей, которые будем закрашивать.
2.
- делаем палитру цветов.
3. Подключаемся к серверу.
4.
- определяем пины.
- Выводим в терминал состояние пинов т.к. если есть сигнал на пин,то 1, если нет, то 0. Например, GPIO = 16 - приходит сигнал , то в терминале отображается его состояние - '1'. И так с соответсвующими пинами.
5.
- Инициализируем работу с лентой, чтобы можно было её окрасить и очистить.
6.
- Здесь взят пример конкретного пина (DOOR 5), а нужно , чтобы окрашивался любой пин, на который приходит сигнал и он в терминале отображается '1'.
Условно, если на GPIO = 16 приходит сигнал '1', а на остальные нет, то именно он окрашивается в цвет из палитры.
В общем, идея есть. Может кто-то подсказать с кодом как это можно реализовать?
Если не понятно моё описание, то попробую переформулировать.
Есть идея и есть "скетч", в котором куча мусора и ничего не понятно. Лепил тяп-ляп т.к. очень плох в программировании.
#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 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
};
{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
};
{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
// 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
5.
strip.begin();
strip.clear(); // очистить
strip.show(); // отправить на ленту
strip.setBrightness(50); // яркость, от 0 до 255
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])); //Если есть сигнал, то зажигаем соответствующий светодиод синим.
else strip.setPixelColor( 3, strip.Color( palette1[3][0], palette1[3][1], palette1[3][2])); //Если есть сигнал, то зажигаем соответствующий светодиод синим.
Условно, если на GPIO = 16 приходит сигнал '1', а на остальные нет, то именно он окрашивается в цвет из палитры.
В общем, идея есть. Может кто-то подсказать с кодом как это можно реализовать?
Если не понятно моё описание, то попробую переформулировать.