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

Нужна помощь реле и esp-01 + сенсорная кнопка

Тема в разделе "Железные вопросы по esp8266", создана пользователем Vladimir_G, 15 июн 2018.

  1. maksimusv

    maksimusv Новичок

    Сообщения:
    14
    Симпатии:
    0
    точнее все не так происходит, если включить стартует реле находиться в режиме low, потом через две секунды переходит в режим high, то есть выключается, переходя по ссылкам в броузере никакой реакции, digitalWrite(relaystate,Low) не обрабатывается, потом подключаю кнопку к пину0, состояние реле изменяется, обновляя броузер состояние он офф обновляется, но функция вкл выкл через веб не пашет! 100% код у меня кривой
     
  2. maksimusv

    maksimusv Новичок

    Сообщения:
    14
    Симпатии:
    0
  3. maksimusv

    maksimusv Новичок

    Сообщения:
    14
    Симпатии:
    0
    да и обрати внимание, когда ты переходишь по ссылкам, в броузере верхний div не меняет состояние! меняет только от кнопки!
     
  4. Алексей.

    Алексей. Авторитетный участник сообщества

    Сообщения:
    551
    Симпатии:
    63
    Да толку то! На поставленные вопросы вы не отвечаете. Для ссылки в html контенте строите мимо правил. Какой помощи вы хотите, типа отвечать на вопросы я не стану, напишите мне скетч, но чтоб работал так как я хочу. Тогда ошиблись разделом.
    Логика работы у вас в голове и понять её очень не просто, скетч работает так как вы и задумали.
    например на строке 88 вы принимаете решение о включении реле
    Код (C):
    1.  
    2.        if (request.indexOf("/LED=ON") != -1) {
    3.         digitalWrite(relayPin,LOW);
    4.           relayState = HIGH;
    5.        }
    6.  
    устанавливаете для пина LOW и сохраняете relayState = HIGH
    далее на строке 121 безусловно устанавливаете для пина значение из relayState т.е. меняете обратно LOW на HIGH
    Код (C):
    1. digitalWrite(relayPin, relayState);
     
  5. maksimusv

    maksimusv Новичок

    Сообщения:
    14
    Симпатии:
    0
    Я не прошу написать код, прошу подсказать, где я туплю, задержка для ожидания, от палец поднёс, убрал поднёс, дрожания точнее руки), тоесть вы предлагаете relayState переделать в !relayState
     
  6. maksimusv

    maksimusv Новичок

    Сообщения:
    14
    Симпатии:
    0
    Как строить для ссылки по правилам?
     
  7. Алексей.

    Алексей. Авторитетный участник сообщества

    Сообщения:
    551
    Симпатии:
    63
    Я ничего не предлагал ещё. Непонятно для чего выставлять пин в LOW и тут же (в ту же миллисекунду) менять на HIGH.
    Читайте rfc.
    Вы используете ссылки типа /LED=ON, символ "=" зарезирвирован и используется при построении квери-сринг как разделитель в параметрах ключ=значение
    reserved = ";" | "/" | "?" | ":" | "@" | "&" | "="
    Но вам, я подозреваю, это не нужно. На простой вопрос "когда зависает если убрать delay" так и нет ответа.
    Для чего две переменные lastButtonState и buttonState в котором сохраняется последнее значение из digitalRead тоже не понятно, почему две? Почему lastButtonState статически инициализирован, а buttonState нет?
    Для чего в setup, когда кнопка еще не нажата включать реле, а после инициализации wifi уже в loop-е проверять что кнопка все ещё не нажата и выключать реле?
    Вы бы сначала разобрались что вам нужно.
     
  8. maksimusv

    maksimusv Новичок

    Сообщения:
    14
    Симпатии:
    0
    lastbutstate нужен что бы запомнить последнее состояние кнопки, так как без этого она бы просто нажать включилась отжал вЫключилась,, а как получить состояние, а потом его изменить?
     
  9. Алексей.

    Алексей. Авторитетный участник сообщества

    Сообщения:
    551
    Симпатии:
    63
    А другая переменная про запас.
    Библиотек для работы с кнопками есть и не одна, но свой код всегда лучше.
     
  10. maksimusv

    maksimusv Новичок

    Сообщения:
    14
    Симпатии:
    0
    Библиотек, даже не знаю где, в гугле мало инфы, может конечно проще запаять контакты на Ttp225 что бы перевести в режим триггера, и менять жёстко состояние, может ссылочками поможете?
     
  11. Алексей.

    Алексей. Авторитетный участник сообщества

    Сообщения:
    551
    Симпатии:
    63
    Если для получения состояния кнопки, просто выполняете digitalRead(buttonPin) то поведение не отличается от обычной тактовой кнопки (на тактовой дребезга даже больше), нет никакой разницы какими проводами подключать, красными, желтыми или зелеными.
    Библиотеки особенной для вашей кнопки не нужно.
    А библиотеки там же, на своем месте, как и в остальных случаях, на гитхабе, другого места я пока не знаю.
    Если вы не хотите искать самостоятельно, я нашел "arduino button" за вас.
     
  12. maksimusv

    maksimusv Новичок

    Сообщения:
    14
    Симпатии:
    0
    спасибо добрый человек
     
  13. maksimusv

    maksimusv Новичок

    Сообщения:
    14
    Симпатии:
    0
    прочитав про кнопки, все равно не понял, как мне совместить код, что бы обрабатывало события из веб и кнопку!
     
  14. Алексей.

    Алексей. Авторитетный участник сообщества

    Сообщения:
    551
    Симпатии:
    63
    Определите функцию, которая будет управлять реле, вызывайте её из обработчика нажатий кнопки и из обработчиков запросов к веб серверу.

    Почему не использовали библиотеку ESP8266WebServer для обработки http запросов, а взяли WiFiServer из библиотеки ESP8266WiFi?
    Для чего глобально определены String request (строка 14) и WiFiClient client (строка 32) которые не используются совсем.
    В функции loop, в стеке, String request аж две штуки, одна в области видимости накрывающая другую.
    Мусора очень много, что то работает вопреки, а не благодаря.
    Такое впечатление, что вы сами не понимаете что делаете.
     
  15. maksimusv

    maksimusv Новичок

    Сообщения:
    14
    Симпатии:
    0
    М-да, не хочу задеть и чем то обидеть, но вы походу разбираетесь в этом всем так же как и я, почему, почему, потому, если не передать стринг реквест пустую строку, то будет все время запрос на favicon.ico, а вот это уже мусор, мой вопрос был совсем иным, как использовать два разных метода на одно действие, расписывать поведение программы, которое и так видно что делает смысл? Если разделить эти два метода и использовать по отдельности, работает как надо, но в месте, один следует за другим, и выполняются оба, потому как все в цикле, и состояния всего два, вкл и выкл, код должен быть сложнее, но я не имею опыта в программировании контролёров, мне нужна грамотная подсказка человека который это уже делал, а не того кто просто занимается лечением больных идей, я знаю что мой код кривой, и поэтому я на форуме, не можешь подсказать, включи состояние офф
     
  16. maksimusv

    maksimusv Новичок

    Сообщения:
    14
    Симпатии:
    0
    то что предлагаете вы я и так это делаю в лупе, выносить куски кода за луп в отдельные функции, смысл, если они будут вызываться также, и будет происходить тот же бред, куда можно обратиться что бы купить уже этот кусок кода, я согласен на это, потому как логика в моей голове, работает как то иначе
     
  17. Алексей.

    Алексей. Авторитетный участник сообщества

    Сообщения:
    551
    Симпатии:
    63
    Взял библиотеку для обработки кнопок, почти первую найденную и библиотеку веб-сервера а не вифи-сервера.
    код (раскрыть)
    Код (C):
    1.  
    2. /**
    3. * Версия arduino-ide 1.8.9
    4. * Версия sdk esp8266 2.5.0
    5. * Версия библиотеки OneButton 1.3.0
    6. */
    7. #include <ESP8266WiFi.h>
    8. #include <ESP8266WebServer.h>
    9. #include <OneButton.h>
    10.  
    11. #define STASSID "****"
    12. #define STAPSK "****"
    13. // Определяем пин-ы для подключения тактовой кнопки и реле
    14. #define BUTTON_PIN 0
    15. #define RELAY_PIN 2
    16.  
    17. // Включаем контент, который будем отгружать веб сервером
    18. #include "index.h"
    19.  
    20. // Задаем переменную, в которой храним состояние пина, которым будем включать реле.
    21. // Включать будем низким уровнем, поэтому начальное состояние HIGH, реле выключено
    22. uint8_t relayPinState = HIGH;
    23.  
    24. OneButton button;
    25. ESP8266WebServer server;
    26.  
    27. // Определяем enum для управления реле
    28. enum e_relay_control {
    29.   // Включить
    30.   ON,
    31.   // Выключить
    32.   OFF,
    33.   // Переключить
    34.   TOGGLE
    35. };
    36.  
    37. // Функция управления реле
    38. void relaySwitch(enum e_relay_control control) {
    39.   switch (control) {
    40.     case ON: relayPinState = LOW; break;
    41.     case OFF: relayPinState = HIGH; break;
    42.     default: relayPinState = relayPinState == LOW ? HIGH : LOW; break;
    43.   }
    44.   digitalWrite(RELAY_PIN, relayPinState);
    45. }
    46.  
    47. // Обработчик нажатия кнопки (фактически срабатывает на отжатие)
    48. void buttonClick() {
    49.   relaySwitch(TOGGLE);
    50. }
    51.  
    52. void setup() {
    53.   // Настраиваем пин управления реле
    54.   pinMode(RELAY_PIN, OUTPUT);
    55.   digitalWrite(RELAY_PIN, relayPinState);
    56.  
    57.   // Настраиваем кнопку, срабатывание по низкому уровню
    58.   button = OneButton(BUTTON_PIN, true);
    59.   button.attachClick(buttonClick);
    60.  
    61.   // Настраиваем wifi и ожидаем соединения
    62.   WiFi.mode(WIFI_STA);
    63.   WiFi.begin(STASSID, STAPSK);
    64.   while (WiFi.status() != WL_CONNECTED) {
    65.     delay(500);
    66.   }
    67.  
    68.   // Устанавливаем обработчик запроса корневого uri
    69.   server.on("/", HTTP_GET, []() {
    70.   server.setContentLength(CONTENT_LENGTH_UNKNOWN);
    71.   server.send(200, "text/html");
    72.     server.sendContent_P(_index_h, strlen(_index_h));
    73.   });
    74.  
    75.   // Устанавливаем обработчик запроса статуса
    76.   server.on("/status", HTTP_GET, []() {
    77.     server.send(200, "text/plain", relayPinState == LOW ? "ON" : "OFF");
    78.   });
    79.  
    80.   // Устанавливаем обработчик запроса переключения реле
    81.   server.on("/relay", HTTP_POST, []() {
    82.     const String& s = server.arg("plain");
    83.     if (s.equals("ON")) {
    84.       relaySwitch(ON);
    85.     } else if (s.equals("OFF")) {
    86.       relaySwitch(OFF);
    87.     } else if (s.equals("TOGGLE")) {
    88.       relaySwitch(TOGGLE);
    89.     }
    90.     server.send(200, "text/plain", relayPinState == LOW ? "ON" : "OFF");
    91.   });
    92.  
    93.   // Устанавливаем обработчик остальных запросов
    94.   server.onNotFound([]() {
    95.     server.send(404, "text/plain", "Not found");
    96.   });
    97.  
    98.   // Инициализируем веб сервер на порту 80
    99.   server.begin(80);
    100. }
    101.  
    102. void loop() {
    103.   // Выполняем обработку нажатий на кнопку
    104.   button.tick();
    105.   // Выполняем обработку запросов к веб серверу
    106.   server.handleClient();
    107. }
    108.  
    109.  

    хтмл (раскрыть)
    Код (C):
    1.  
    2. static const char _index_h[] PROGMEM =
    3. "<!doctype html>\n"
    4. "<html\n"
    5. "<head>\n"
    6. "   <meta charset='utf-8' />\n"
    7. "</head>\n"
    8. "<body onload='get_state(); window.setInterval(\"get_state()\", 1000);'>\n"
    9. "   <div id='relayState'></div>\n"
    10. "   <input value='ON' type='button' onclick=\"exec('ON')\" />\n"
    11. "   <input value='OFF' type='button' onclick=\"exec('OFF')\" />\n"
    12. "   <input value='TOGGLE' type='button' onclick=\"exec('TOGGLE')\" />\n"
    13. "</body>\n"
    14. "<script type='text/javascript'>\n"
    15. "   function get_state() {\n"
    16. "       var request = new XMLHttpRequest();\n"
    17. "       request.open('GET','status',true);\n"
    18. "       request.onreadystatechange = function() {\n"
    19. "           if (request.readyState == 4 && request.status==200) {\n"
    20. "               document.getElementById('relayState').innerHTML = request.responseText;\n"
    21. "           }\n"
    22. "       }\n"
    23. "       request.send();\n"
    24. "   }\n"
    25. "   function exec(message) {\n"
    26. "       var request = new XMLHttpRequest();\n"
    27. "       request.open('POST','relay',true);\n"
    28. "       request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n"
    29. "       request.onreadystatechange = function() {\n"
    30. "    if (request.readyState == 4 && request.status==200) {\n"
    31. "               document.getElementById('relayState').innerHTML = request.responseText;\n"
    32. "    }\n"
    33. "    }\n"
    34. "       request.send(message);\n"
    35. "   }\n"
    36. "</script>\n"
    37. "</html>\n";
    38.  

    На ноде-мсу вместо реле - светодиод синий, встроенный, как раз к gpio2 подключен
    Вместо кнопки просто провод для беспаечного монтажа, замыкаю и размыкаю им gpio0.
    Замкнул-разомкнул светодиод включился и на веб-странице состояние изменилось (раз в секунду скриптом запрашиваю статус), ещё раз замкнул-разомкнул и светодиод выключился.
    На веб-странице нажал на кнопку, скриптом отправил запрос, в обработчике запроса выполнил переключение светодиода.
    Как то так.
     
    cruelty и maksimusv нравится это.
  18. flamik

    flamik Новичок

    Сообщения:
    1
    Симпатии:
    0
    Делал абсолютно подобный девайс и просто инвертировал выход на ttp223b, на самой платке ttp223b есть перемычки для инвертирования выхода.
     
  19. cruelty

    cruelty Новичок

    Сообщения:
    4
    Симпатии:
    0
    Шикарный и рабочий код! Спасибо!
    Как сделать на два реле и две кнопки?
    Продублировать? И что?
     
  20. cruelty

    cruelty Новичок

    Сообщения:
    4
    Симпатии:
    0
    Вот на копипастил. Двойной wi-fi выключатель с кнопками.
    Возможно доработать. Нет синхронизации со страницей и кнопки через секунду пашут. Но работает.
    Пины и ip сами выберете, так для демонстрации 0 кнопка и диод встроенный 2

    Может кому пригодится.

    Раскрыть Спойлер
    Код (C):
    1.  
    2. #include <ESP8266WiFi.h>
    3. #include <WiFiClient.h>
    4. #include <ESP8266WebServer.h>
    5. #include <ESP8266mDNS.h>
    6.  
    7. MDNSResponder mdns;
    8.  
    9. const char* ssid = "********";
    10. const char* password = "********";
    11.  
    12. byte arduino_mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
    13. IPAddress ip(192,168,1,242);
    14. IPAddress gateway(192,168,1,1);
    15. IPAddress subnet(255,255,255,0);
    16.  
    17. ESP8266WebServer server(80);
    18.  
    19. int Relay1 = 2;
    20. int Relay2 = 14;
    21. int But1 = 0;
    22. int But2 = 13;
    23. int flag=0;
    24. int flag1=0;
    25.  
    26. void setup(void){
    27.  
    28.   pinMode(Relay1, OUTPUT);
    29.   digitalWrite(Relay1, LOW);
    30.   pinMode(Relay2, OUTPUT);
    31.   digitalWrite(Relay2, LOW);
    32.  
    33.   delay(100);
    34.   Serial.begin(115200);
    35.   WiFi.begin(ssid, password);
    36.   WiFi.config(ip, gateway, subnet);
    37.  
    38.   Serial.println("");
    39.  
    40.   while (WiFi.status() != WL_CONNECTED) {
    41.     delay(500);
    42.    Serial.print(".");
    43.   }
    44.   Serial.println("");
    45.   Serial.print("Connected to ");
    46.   Serial.println(ssid);
    47.   Serial.print("IP address: ");
    48.   Serial.println(WiFi.localIP());
    49.  
    50.   if (mdns.begin("esp8266", WiFi.localIP())) {
    51.     Serial.println("MDNS responder started");
    52.   }
    53. //+++++++++++++++++++++++ START  Relay2 +++++++++++++++++++++++
    54.   server.on("/", [](){
    55.     server.send(200, "text/html", webPage());
    56.   });
    57.   server.on("/socket1On", [](){
    58.     digitalWrite(Relay1, HIGH);
    59.     server.send(200, "text/html", webPage());
    60.     delay(100);
    61.     });
    62.   server.on("/socket1Off", [](){
    63.     digitalWrite(Relay1, LOW);
    64.     server.send(200, "text/html", webPage());
    65.     delay(100);
    66. //+++++++++++++++++++++++ END  Relay1 +++++++++++++++++++++++++
    67.  
    68.    
    69. //+++++++++++++++++++++++ START  Relay2 +++++++++++++++++++++++
    70.   });
    71.   server.on("/socket2On", [](){
    72.     digitalWrite(Relay2, HIGH);
    73.     server.send(200, "text/html", webPage());
    74.     delay(100);  
    75.   });
    76.   server.on("/socket2Off", [](){
    77.     digitalWrite(Relay2, LOW);
    78.     server.send(200, "text/html", webPage());
    79.     delay(100);
    80. //++++++++++++++++++++++++ END  Relay2 +++++++++++++++++++++++
    81.    
    82.   });
    83.   server.begin();
    84.   Serial.println("HTTP server started");
    85. }
    86.  
    87. void loop(void){
    88.   server.handleClient();
    89. // ++++++++++++++++++++++++ Buttons +++++++++++++++++++++++++++
    90. if(digitalRead(But1)==HIGH&&flag==0)
    91. {
    92. digitalWrite(Relay1,!digitalRead(Relay1));
    93. flag=1;
    94. }
    95. if(digitalRead(But1)==LOW&&flag==1)
    96. {
    97. flag=0;
    98. }
    99. {
    100. if(digitalRead(But2)==HIGH&&flag1==0)
    101. {
    102. digitalWrite(Relay2,!digitalRead(Relay2));
    103. flag1=1;
    104. }
    105. if(digitalRead(But2)==LOW&&flag1==1)
    106. {
    107. flag1=0;
    108. }
    109. // +++++++++++++++++++++++ Buttons +++++++++++++++++++++++
    110. }
    111. }
    112.  
    113. String webPage()
    114. {
    115.   String web;
    116.   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>";
    117.   web += "<h1 style=\"text-align: center;font-family: Open sans;font-weight: 100;font-size: 20px;\">Интернет выключатель</h1><div>";
    118.  
    119. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++ Relay-1  ++++++++++++++++++++++++++++++++++++++++++++++++++++
    120.   web += "<p style=\"text-align: center;margin-top: 0px;margin-bottom: 5px;\">Выключатель 1</p>";
    121.   if (digitalRead(Relay1) == 1)
    122.   {
    123.     web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #43a209;margin: 0 auto;\">Включен</div>";
    124.   }
    125.   else
    126.   {
    127.     web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #ec1212;margin: 0 auto;\">Выключен</div>";
    128.   }
    129.   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>";
    130. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++ Relay-1  ++++++++++++++++++++++++++++++++++++++++++++++++++++
    131.  
    132. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++ Relay-2  ++++++++++++++++++++++++++++++++++++++++++++++++++++
    133.   web += "<p style=\"text-align: center;margin-top: 0px;margin-bottom: 5px;\">Выключатель 2</p>";
    134.   if (digitalRead(Relay2) == 1)
    135.   {
    136.     web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #43a209;margin: 0 auto;\">Включен</div>";
    137.   }
    138.   else
    139.   {
    140.     web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #ec1212;margin: 0 auto;\">Выключен</div>";
    141.   }
    142.   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>";
    143. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++ Relay-2  ++++++++++++++++++++++++++++++++++++++++++++++++++++
    144.    
    145. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++ REFRESH ++++++++++++++++++++++++++++++++++++++++++++++++++++
    146.   web += "<div style=\"text-align:center;margin-top: 20px;\"><a href=\"/\"><button style=\"width:158px;\">Обновить</button></a></div>";
    147. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++ REFRESH ++++++++++++++++++++++++++++++++++++++++++++++++++++
    148.  
    149.   web += "</div>";
    150.   return(web);
    151. }
    152.  
    153.  
    154.  
     

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