Мучает вопрос, по созданию такого выключателя. Вроде как ви-фи выключает, кнопкой тоже, а как их спарить и сделать сразу две, вот тут вопрос. https://esp8266.ru/forum/threads/rele-i-esp-01-sensornaja-knopka.3498/page-2 в конце есть такой, но одинарный. Как его раздвоить? Самый простой код, можно даже без страницы, просто get запросы. Поделитесь разработкой! Плиз!
А в этом коде что нетак? Код (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(); }
Дак он на 1ну кнопку и на один выключатель. При попытке добавить кнопку и реле, код не работает. Возможно просто я не программист. да и код сложный с опросом состояния.
Так не проблема, оцените свои возможности, силы, и решайте, что проще, поставить еще одну ESP-01, или переписать код, используя RX и TX на 01, там выводов то два + RS.
Про свои пиал тут. Работают нормально c конца 2016-го. В санузлах переделано, больше входов / выходов, под комнаты симисторы, для возможности димминга. Плюс PIR-ы, пожарные датчики - извещатели.
Что за пины?Почему не знаю?Вообще esp8266-01 та ещё штучка.Без танцев с Бубном можно использовать только RX а остальные пины надо правильно притянуть и желательно аппаратно к плюсу в момент старта.Я тут позавчера наипался вдоволь забыв об этом-никак не мог понять почему 01 не стартует.Поэтому если надо кучу выводов то лучше использовать Witty.Там всё уже притянуто куда надо да и под программатор есть свой девайс да и стаб питания встроенный.
Вот на копипастил. Возможно доработать. Нет синхронизации со страницей и кнопки через секунду пашут. Но работает. Пины и 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> <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> <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); }