Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

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

Тема в разделе "Раздел для начинающих", создана пользователем Isten, 11 авг 2019.

Метки:
  1. Isten

    Isten Новичок

    Сообщения:
    6
    Симпатии:
    0
    Всем привет! Работаю сейчас над wemos d1 r1 на базе esp8266 и светодиодной лентой ws2812b.
    Есть идея и есть "скетч", в котором куча мусора и ничего не понятно. Лепил тяп-ляп т.к. очень плох в программировании.
    Скетч для 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', а на остальные нет, то именно он окрашивается в цвет из палитры.
    В общем, идея есть. Может кто-то подсказать с кодом как это можно реализовать?
    Если не понятно моё описание, то попробую переформулировать.
     
  2. svs2007m

    svs2007m Читатель

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

    Isten Новичок

    Сообщения:
    6
    Симпатии:
    0
    Понял. Спасибо, посмотрю)
    Я просто много чего пересмотрел и начитал. Беда именно в скетче, т.е. программист из меня 0.
    За ссылочку на видео - спасибо.
     

Поделиться этой страницей