• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Обработка нажатий кнопок на NodeMCU

Baster075

New member
Здравствуйте!
Подскажите пожалуйста, всю голову уже сломал :(

Есть дом, на котором висит три прожектора. Эти прожекторы управлялись ардуиной, к которой было подключено 4 кнопки.
Всё отлично работало уже два года как :)
Сейчас возникла необходимость ещё и из локальной сети ими управлять, чтобы домой не бегать.

Попробовал реализовать это на NodeMCU V2, но возникла проблема... После перезагрузки модуля кнопки работают нормально, но если выключить прожектора через интернет - модуль на кнопки больше не реагирует :(

Код слеплен из старой программы под ардуино+веб-сервер для NodeMCU
С ардуино, да и вообще программированием, я новичёк, так что это по-любому мой косяк где-то... но найти его я так и не смог
Код прикладываю в следующем сообщении
 

Baster075

New member
Код:
/*********
  Попытка добавить управление освещением
  на даче по Wi-Fi
 *********/

// Wi-Fi библиотека
#include <ESP8266WiFi.h>

// Настройки Wi-Fi
const char* ssid     = "...:::HoMe:::..."; //имя вафли
const char* password = "11111";        //пароль вафли

// сделать порт Веб-сервера 80
WiFiServer server(80);

// Variable to store the HTTP request
String header;

// Auxiliar variables to store the current output state
String VesSvet = "off";
String Parking = "off";
String Dvor = "off";
String Shashlichnya = "off";

// Assign output variables to GPIO pins
const int L_Parking = 16;
const int L_Dvor = 14;
const int L_Shashl = 2;
const int KnopkaAvto = 5;
const int KnopkaDvor = 4;
const int KnopkaShashl = 3;
const int KnopkaParking = 1;

bool z1=0;
bool status_k1=0;
unsigned long time_k1;

bool z2=0;
bool status_k2=0;
unsigned long time_k2;

bool z3=0;
bool status_k3=0;
unsigned long time_k3;
 
bool k4=0;
bool status_k4=0;
unsigned long time_k4;

unsigned long time_f=1000;

void setup() {
  Serial.begin(115200);
  // Initialize the output variables as outputs
  pinMode(KnopkaAvto, INPUT_PULLUP);
  pinMode(KnopkaDvor, INPUT_PULLUP);
  pinMode(KnopkaShashl, INPUT_PULLUP);
  pinMode(KnopkaParking, INPUT_PULLUP);
  pinMode(L_Parking, OUTPUT);
  pinMode(L_Dvor, OUTPUT);
  pinMode(L_Shashl, OUTPUT);
  // Set outputs to LOW
  digitalWrite(L_Parking, LOW);
  digitalWrite(L_Dvor, LOW);
  digitalWrite(L_Shashl, LOW);
 

  // Connect to Wi-Fi network with SSID and password
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  // Print local IP address and start web server
  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  server.begin();
}

void loop(){
//обработка нажатий кнопок
 
  //  первое нажатие кнопки №1
  if (digitalRead(KnopkaAvto)==LOW && z1==0 && millis()-time_k1>time_f)
  {
    VesSvet = "on";
    Parking = "on";
    Dvor = "on";
    Shashlichnya = "on";
    z1=1;
    z2=1;
    z3=1;
    time_k1=millis();
    digitalWrite(L_Parking, HIGH);
    digitalWrite(L_Dvor, HIGH);
    digitalWrite(L_Shashl, HIGH);
  }
 
 //  второе нажатие кнопки №1
  if (digitalRead(KnopkaAvto)==LOW && z1==1 && millis()-time_k1>time_f)
  {
    VesSvet = "off";
    Parking = "off";
    Dvor = "off";
    Shashlichnya = "off";
    z1=0;
    z2=0;
    z3=0;
    time_k1=millis();
    digitalWrite(L_Parking, LOW);
    digitalWrite(L_Dvor, LOW);
    digitalWrite(L_Shashl, LOW);
  }
 
  WiFiClient client = server.available();   // Listen for incoming clients

  if (client) {                             // If a new client connects,
    Serial.println("New Client.");          // print a message out in the serial port
    String currentLine = "";                // make a String to hold incoming data from the client
    while (client.connected()) {            // loop while the client's connected
      if (client.available()) {             // if there's bytes to read from the client,
        char c = client.read();             // read a byte, then
        Serial.write(c);                    // print it out the serial monitor
        header += c;
        if (c == '\n') {                    // if the byte is a newline character
          // if the current line is blank, you got two newline characters in a row.
          // that's the end of the client HTTP request, so send a response:
          if (currentLine.length() == 0) {
            // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
            // and a content-type so the client knows what's coming, then a blank line:
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println("Connection: close");
            client.println();
            
            // turns the GPIOs on and off
            if (header.indexOf("GET /All/on") >= 0) {
              Serial.println("All lights is on");
              VesSvet = "on";
              Parking = "on";
              Dvor = "on";
              Shashlichnya = "on";
              z1=1;
              z2=1;
              z3=1;
              digitalWrite(L_Parking, HIGH);
              digitalWrite(L_Dvor, HIGH);
              digitalWrite(L_Shashl, HIGH);
            } else if (header.indexOf("GET /All/off") >= 0) {
              Serial.println("All lights is off");
              VesSvet = "off";
              Parking = "off";
              Dvor = "off";
              Shashlichnya = "off";
              z1=0;
              z2=0;
              z3=0;
              digitalWrite(L_Parking, LOW);
              digitalWrite(L_Dvor, LOW);
              digitalWrite(L_Shashl, LOW);
            } else if (header.indexOf("GET /4/on") >= 0) {
              Serial.println("GPIO 4 on");
              Parking = "on";
              z1=1; 
              digitalWrite(L_Parking, HIGH);
            } else if (header.indexOf("GET /4/off") >= 0) {
              Serial.println("GPIO 4 off");
              Parking = "off";
              z1=0;
              digitalWrite(L_Parking, LOW);
              } else if (header.indexOf("GET /14/on") >= 0) {
              Serial.println("GPIO 14 on");
              Dvor = "on";
              z2=1;
              digitalWrite(L_Dvor, HIGH);
            } else if (header.indexOf("GET /14/off") >= 0) {
              Serial.println("GPIO 14 off");
              Dvor = "off";
              z2=0;
              digitalWrite(L_Dvor, LOW);
              } else if (header.indexOf("GET /12/on") >= 0) {
              Serial.println("L_Shashl on");
              Shashlichnya = "on";
              z3=1;
              digitalWrite(L_Shashl, HIGH);
            } else if (header.indexOf("GET /12/off") >= 0) {
              Serial.println("L_Shashl off");
              Shashlichnya = "off";
              z3=0;
              digitalWrite(L_Shashl, LOW);
            }
            
            // Display the HTML web page
            client.println("<!DOCTYPE html><html>");
            client.println("<head><meta charset=\"utf-8\" name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
            client.println("<link rel=\"icon\" href=\"data:,\">");
            // CSS to style the on/off buttons
            // Feel free to change the background-color and font-size attributes to fit your preferences
            client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");
            client.println(".button { background-color: #FF0000; border: none; color: white; padding: 16px 40px;");
            client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");
            client.println(".button2 {background-color: #00FF00;}</style></head>");
            
            // Web Page Heading
            client.println("<body><h1>Управление светом</h1>");
            
            // Display current state, and ON/OFF buttons for GPIO 5 
            client.println("<p>Весь свет - " + VesSvet + "</p>");
            // If the VesSvet is off, it displays the ON button       
            
              client.println("<p><a href=\"/All/on\"><button class=\"button button2\">ON</button></a><a href=\"/All/off\"><button class=\"button\">OFF</button></a></p>");
            
              client.println("");
          
              
            // Display current state, and ON/OFF buttons for GPIO 4 
            client.println("<p>Парковка - " + Parking + "</p>");
            // If the Parking is off, it displays the ON button       
            if (Parking=="off") {
              client.println("<p><a href=\"/4/on\"><button class=\"button\">ON</button></a></p>");
            } else {
              client.println("<p><a href=\"/4/off\"><button class=\"button button2\">OFF</button></a></p>");
            }

            // Display current state, and ON/OFF buttons for GPIO 14 
            client.println("<p>Двор - " + Dvor + "</p>");
            // If the Dvor is off, it displays the ON button       
            if (Dvor=="off") {
              client.println("<p><a href=\"/14/on\"><button class=\"button\">ON</button></a></p>");
            } else {
              client.println("<p><a href=\"/14/off\"><button class=\"button button2\">OFF</button></a></p>");
            }

            // Display current state, and ON/OFF buttons for GPIO 12 
            client.println("<p>Шашлычная - " + Shashlichnya + "</p>");
            // If the Shashlichnya is off, it displays the ON button       
            if (Shashlichnya=="off") {
              client.println("<p><a href=\"/12/on\"><button class=\"button\">ON</button></a></p>");
            } else {
              client.println("<p><a href=\"/12/off\"><button class=\"button button2\">OFF</button></a></p>");
            }
            client.println("</body></html>");
            
            // The HTTP response ends with another blank line
            client.println();
            // Break out of the while loop
            break;
          } else { // if you got a newline, then clear currentLine
            currentLine = "";
          }
        } else if (c != '\r') {  // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }
      }
    }
    // Clear the header variable
    header = "";
    // Close the connection
    client.stop();
    Serial.println("Client disconnected.");
    Serial.println("");
  }
 
}
 

CodeNameHawk

Moderator
Команда форума
Посмотрите какие значения принимают ваши переменные после нажатия кнопки и какие после изменения через веб.
Во общем элементарная откладка в сериал.
 

Baster075

New member
мне прям даже неловко это спрашивать, но как это сделать? :( монитор порта ничего не выдаёт ни по нажатию физических кнопок, ни в браузере... Ещё раз повторюсь - я с программированием новичёк-самоучка...
 

CodeNameHawk

Moderator
Команда форума
Разве трудно додуматься у кого спросить: ардуино скетч отладка.
Serial.println ...
 

Baster075

New member
в коде есть строки типа
Код:
void setup() {
  Serial.begin(115200);
Код:
Serial.println("All lights is on");
но в мониторе порта всё равно ничего не отображается.
Единственное чего удалось добиться это
Код:
load 0x4010f000, len 3460, room 16
tail 4
chksum 0xcc
load 0x3fff20b8, len 40, room 4
tail 4
chksum 0xc9
csum 0xc9
v00045760
~ld
при нажатии кнопки reset на мк
 

CodeNameHawk

Moderator
Команда форума
я видимо совсем тупой... нет у меня такого в arduino ide
А вы на все вопросы ищите ответ в ардуиноиде?

Я чаще всего использую google.
https://google.gik-team.com/?q=как+отладить+скетч+в+ардуино+при+помощи+serial.println
Если вас google не любит https://arduinomaster.ru/program/arduino-serial-print-println-write/
 

CodeNameHawk

Moderator
Команда форума
полагаю что то, что должно уходить в монитор порта уходит в обработку веб-сервером
Для начала надо в скетч вставить команды вывода в сериал.
void setup() { Serial.begin(115200); // Initialize the output variables as outputs
нп. Вставьте Serial.println("Program started.")
А также можете вывести значение переменной, если знаете что это.
Смотреть в мониторе порта на скорости 115200.
 

Baster075

New member
эксперементальным путём было выявлено, что кнопки перестают работать когда заходишь на сайт веб-сервера. Когда закрываешь страницу - через некоторое время начинают работать кнопки.
 

CodeNameHawk

Moderator
Команда форума
ну дак оно же вставлено, вы можете хотя бы краем глаза код посмотреть, который я приложил?
Ну раз вы так утверждаете, то покажите на скриншоте
Посмотрите какие значения принимают ваши переменные после нажатия кнопки и какие после изменения через веб.
 

esp340

Active member
После перезагрузки модуля кнопки работают нормально, но если выключить прожектора через интернет - модуль на кнопки больше не реагирует
Какие именно кнопки вы имеете ввиду - физические или программные? Если физические, то в вашем коде я вижу опрос только одной кнопки и она работает нормально, по крайней мере у меня. Правда, я заливал на модуль WittyCLoud (NodeMCU лень доставать) и немного изменил код в плане нумерации пинов.
 

Baster075

New member
Ну раз вы так утверждаете, то покажите на скриншоте
скриншот чего вас интересует? монитора порта? Сейчас сделаю...

А по поводу вывода в этот самый монитор - вот выдержки из кода:
Код:
....
void setup() {
  Serial.begin(115200); 
...

вот должна быть информация о подключении
// Connect to Wi-Fi network with SSID and password
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  // Print local IP address and start web server
  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  server.begin();
}
....

вот должна быть какая-то реакция на нажатия интернет-кнопок
// turns the GPIOs on and off
            if (header.indexOf("GET /All/on") >= 0) {
              Serial.println("All lights is on");
....
else if (header.indexOf("GET /All/off") >= 0) {
              Serial.println("All lights is off");
...
там ещё есть, всё не стал выдёргивать. Т.Е. как бы какие-то сообщения должны быть но в мониторе порта глухо.
 

Baster075

New member
Какие именно кнопки вы имеете ввиду - физические или программные? Если физические, то в вашем коде я вижу опрос только одной кнопки и она работает нормально, по крайней мере у меня. Правда, я заливал на модуль WittyCLoud (NodeMCU лень доставать) и немного изменил код в плане нумерации пинов.
Кнопки физические. Их пока одна, да. Она работает нормально у меня до того момента, как к веб-серверу подключается клиент. Т.Е. пока где-то открыта сгенерированная nodeMCU страничка работают только интернет-кнопки. После закрытия этой странички, через пару минут, физическая кнопка снова работать начинает.
 

CodeNameHawk

Moderator
Команда форума
То вы пишите что
монитор порта ничего не выдаёт ни по нажатию физических кнопок, ни в браузере
то
в мониторе порта глухо.
Это как понимаете две большие разницы.
Какой смысл писать, что не видно реакции на кнопку, если сериал не работает?
Установите hterm и покажите реакцию на нажатие в программе кнопки Rst. (скриншотом)
 
Сверху Снизу