Двойной выключатель Wi-Fi, сенсорный.

Тема в разделе "ESP8266, ESP32", создана пользователем Den-Ver, 22 июл 2019.

  1. Den-Ver

    Den-Ver Нуб

    Мучает вопрос, по созданию такого выключателя.
    Вроде как ви-фи выключает, кнопкой тоже, а как их спарить и сделать сразу две, вот тут вопрос.
    https://esp8266.ru/forum/threads/rele-i-esp-01-sensornaja-knopka.3498/page-2 в конце есть такой, но одинарный. Как его раздвоить?
    Самый простой код, можно даже без страницы, просто get запросы.
    Поделитесь разработкой! Плиз!
     
  2. Den-Ver

    Den-Ver Нуб

  3. Airbus

    Airbus Радиохулиган Модератор

    Кнопка это просто.Даже сенсорная!
     
  4. Den-Ver

    Den-Ver Нуб

    Так их 2шт и еще wi-fi. По отдельности как бы легко.
     
  5. Airbus

    Airbus Радиохулиган Модератор

    А в этом коде что нетак?
    Код (C++):
    #include <ESP8266WiFi.h>
    #include <ESP8266WebServer.h>
    #include <OneButton.h>
    #define STASSID "****"
    #define STAPSK "****"
    // Определяем пин-ы для подключения тактовой кнопки и реле
    #define BUTTON_PIN 0
    #define RELAY_PIN 2
    // Включаем контент, который будем отгружать веб сервером
    #include "index.h"
    // Задаем переменную, в которой храним состояние пина, которым будем включать реле.
    // Включать будем низким уровнем, поэтому начальное состояние HIGH, реле выключено
    uint8_t relayPinState = HIGH;
    OneButton button;
    ESP8266WebServer server;
    // Определяем enum для управления реле
    enum e_relay_control {
      // Включить
      ON,
      // Выключить
      OFF,
      // Переключить
      TOGGLE
    };
    // Функция управления реле
    void relaySwitch(enum e_relay_control control) {
      switch (control) {
        case ON: relayPinState = LOW; break;
        case OFF: relayPinState = HIGH; break;
        default: relayPinState = relayPinState == LOW ? HIGH : LOW; break;
      }
      digitalWrite(RELAY_PIN, relayPinState);
    }
    // Обработчик нажатия кнопки (фактически срабатывает на отжатие)
    void buttonClick() {
      relaySwitch(TOGGLE);
    }
    void setup() {
      // Настраиваем пин управления реле
      pinMode(RELAY_PIN, OUTPUT);
      digitalWrite(RELAY_PIN, relayPinState);
      // Настраиваем кнопку, срабатывание по низкому уровню
      button = OneButton(BUTTON_PIN, true);
      button.attachClick(buttonClick);
      // Настраиваем wifi и ожидаем соединения
      WiFi.mode(WIFI_STA);
      WiFi.begin(STASSID, STAPSK);
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
      }
      // Устанавливаем обработчик запроса корневого uri
      server.on("/", HTTP_GET, []() {
      server.setContentLength(CONTENT_LENGTH_UNKNOWN);
      server.send(200, "text/html");
        server.sendContent_P(_index_h, strlen(_index_h));
      });
      // Устанавливаем обработчик запроса статуса
      server.on("/status", HTTP_GET, []() {
        server.send(200, "text/plain", relayPinState == LOW ? "ON" : "OFF");
      });
      // Устанавливаем обработчик запроса переключения реле
      server.on("/relay", HTTP_POST, []() {
        const String& s = server.arg("plain");
        if (s.equals("ON")) {
          relaySwitch(ON);
        } else if (s.equals("OFF")) {
          relaySwitch(OFF);
        } else if (s.equals("TOGGLE")) {
          relaySwitch(TOGGLE);
        }
        server.send(200, "text/plain", relayPinState == LOW ? "ON" : "OFF");
      });
      // Устанавливаем обработчик остальных запросов
      server.onNotFound([]() {
        server.send(404, "text/plain", "Not found");
      });
      // Инициализируем веб сервер на порту 80
      server.begin(80);
    }
    void loop() {
      // Выполняем обработку нажатий на кнопку
      button.tick();
      // Выполняем обработку запросов к веб серверу
      server.handleClient();
    }
     
    Den-Ver нравится это.
  6. Den-Ver

    Den-Ver Нуб

    Дак он на 1ну кнопку и на один выключатель. При попытке добавить кнопку и реле, код не работает.
    Возможно просто я не программист. да и код сложный с опросом состояния.
     
  7. Airbus

    Airbus Радиохулиган Модератор

    Сюда надо ещё одну кнопку и одно реле так?Может ЭТО поможет?

     
  8. SergeiL

    SergeiL Гуру

  9. Den-Ver

    Den-Ver Нуб

    Такой есть у меня 4х контактное реле на нем.
    Да было бы здорово к такому прикрутить кнопки.
     
  10. Den-Ver

    Den-Ver Нуб

    :)Наоборот пытаюсь сократить их)))
    Даже на 01, по 4 порта впаиваю.
     
  11. SergeiL

    SergeiL Гуру

    Так не проблема, оцените свои возможности, силы, и решайте, что проще, поставить еще одну ESP-01, или переписать код, используя RX и TX на 01, там выводов то два + RS.
     
  12. SergeiL

    SergeiL Гуру

    Про свои пиал тут.
    Работают нормально c конца 2016-го.
    В санузлах переделано, больше входов / выходов, под комнаты симисторы, для возможности димминга.
    Плюс PIR-ы, пожарные датчики - извещатели.
     
    Последнее редактирование: 22 июл 2019
  13. Den-Ver

    Den-Ver Нуб

    Неее, в ESP-01 есть еще пины 12,13,14,15
     
  14. Airbus

    Airbus Радиохулиган Модератор

    Что за пины?Почему не знаю?Вообще esp8266-01 та ещё штучка.Без танцев с Бубном можно использовать только RX а остальные пины надо правильно притянуть и желательно аппаратно к плюсу в момент старта.Я тут позавчера наипался вдоволь забыв об этом-никак не мог понять почему 01 не стартует.Поэтому если надо кучу выводов то лучше использовать Witty.Там всё уже притянуто куда надо да и под программатор есть свой девайс да и стаб питания встроенный.
     
  15. Den-Ver

    Den-Ver Нуб

    Вот на копипастил.
    Возможно доработать. Нет синхронизации со страницей и кнопки через секунду пашут. Но работает.
    Пины и ip сами выберете, так для демонстрации 0 кнопка и диод встроенный 2

    Изменил чуток, страница рефрешится через 5сек, кнопку обновить закоментировал, если кому надо уберите слэши в этой секции в конце.

    Может кому пригодится.
    Код (C++):

    #include <ESP8266WiFi.h>
    #include <WiFiClient.h>
    #include <ESP8266WebServer.h>
    #include <ESP8266mDNS.h>

    MDNSResponder mdns;

    const char* ssid = "********";
    const char* password = "********";

    byte arduino_mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
    IPAddress ip(192,168,1,242);
    IPAddress gateway(192,168,1,1);
    IPAddress subnet(255,255,255,0);

    ESP8266WebServer server(80);

    int Relay1 = 2;
    int Relay2 = 14;
    int But1 = 0;
    int But2 = 13;
    int flag=0;
    int flag1=0;

    void setup(void){

      pinMode(Relay1, OUTPUT);
      digitalWrite(Relay1, LOW);
      pinMode(Relay2, OUTPUT);
      digitalWrite(Relay2, LOW);

      delay(100);
      Serial.begin(115200);
      WiFi.begin(ssid, password);
      WiFi.config(ip, gateway, subnet);

      Serial.println("");

      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
       Serial.print(".");
      }
      Serial.println("");
      Serial.print("Connected to ");
      Serial.println(ssid);
      Serial.print("IP address: ");
      Serial.println(WiFi.localIP());

      if (mdns.begin("esp8266", WiFi.localIP())) {
        Serial.println("MDNS responder started");
      }
    //+++++++++++++++++++++++ START  Relay2 +++++++++++++++++++++++
      server.on("/", [](){
        server.send(200, "text/html", webPage());
      });
      server.on("/socket1On", [](){
        digitalWrite(Relay1, HIGH);
        server.send(200, "text/html", webPage());
        delay(100);
        });
      server.on("/socket1Off", [](){
        digitalWrite(Relay1, LOW);
        server.send(200, "text/html", webPage());
        delay(100);
    //+++++++++++++++++++++++ END  Relay1 +++++++++++++++++++++++++

     
    //+++++++++++++++++++++++ START  Relay2 +++++++++++++++++++++++
      });
      server.on("/socket2On", [](){
        digitalWrite(Relay2, HIGH);
        server.send(200, "text/html", webPage());
        delay(100);
      });
      server.on("/socket2Off", [](){
        digitalWrite(Relay2, LOW);
        server.send(200, "text/html", webPage());
        delay(100);
    //++++++++++++++++++++++++ END  Relay2 +++++++++++++++++++++++
     
      });
      server.begin();
      Serial.println("HTTP server started");
    }

    void loop(void){
      server.handleClient();
    // ++++++++++++++++++++++++ Buttons +++++++++++++++++++++++++++
    if(digitalRead(But1)==HIGH&&flag==0)
    {
    digitalWrite(Relay1,!digitalRead(Relay1));
    flag=1;
    }
    if(digitalRead(But1)==LOW&&flag==1)
    {
    flag=0;
    }
    {
    if(digitalRead(But2)==HIGH&&flag1==0)
    {
    digitalWrite(Relay2,!digitalRead(Relay2));
    flag1=1;
    }
    if(digitalRead(But2)==LOW&&flag1==1)
    {
    flag1=0;
    }
    // +++++++++++++++++++++++ Buttons +++++++++++++++++++++++
    }
    }

    String webPage()
    {
      String web;
      web += "<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/> <meta charset=\"utf-8\"><title>Интернет выключатель</title><style>button{color:red;padding: 10px 27px;}</style></head>";
    web +="<meta http-equiv=\"refresh\" content=\"5\">";
      web += "<h1 style=\"text-align: center;font-family: Open sans;font-weight: 100;font-size: 20px;\">Интернет выключатель</h1><div>";

    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++ Relay-1  ++++++++++++++++++++++++++++++++++++++++++++++++++++
      web += "<p style=\"text-align: center;margin-top: 0px;margin-bottom: 5px;\">Выключатель 1</p>";
      if (digitalRead(Relay1) == 1)
      {
        web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #43a209;margin: 0 auto;\">Включен</div>";
      }
      else
      {
        web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #ec1212;margin: 0 auto;\">Выключен</div>";
      }
      web += "<div style=\"text-align: center;margin: 5px 0px;\"> <a href=\"socket1On\"><button>ON</button></a>&nbsp;<a href=\"socket1Off\"><button>OFF</button></a></div>";
    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++ Relay-1  ++++++++++++++++++++++++++++++++++++++++++++++++++++

    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++ Relay-2  ++++++++++++++++++++++++++++++++++++++++++++++++++++
      web += "<p style=\"text-align: center;margin-top: 0px;margin-bottom: 5px;\">Выключатель 2</p>";
      if (digitalRead(Relay2) == 1)
      {
        web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #43a209;margin: 0 auto;\">Включен</div>";
      }
      else
      {
        web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #ec1212;margin: 0 auto;\">Выключен</div>";
      }
      web += "<div style=\"text-align: center;margin: 5px 0px;\"> <a href=\"socket2On\"><button>ON</button></a>&nbsp;<a href=\"socket2Off\"><button>OFF</button></a></div>";
    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++ Relay-2  ++++++++++++++++++++++++++++++++++++++++++++++++++++
     
    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++ REFRESH ++++++++++++++++++++++++++++++++++++++++++++++++++++
    //  web += "<div style=\"text-align:center;margin-top: 20px;\"><a href=\"/\"><button style=\"width:158px;\">Обновить</button></a></div>";
    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++ REFRESH ++++++++++++++++++++++++++++++++++++++++++++++++++++

      web += "</div>";
      return(web);
    }
     
     
    Последнее редактирование: 26 июл 2019