Одновременно не работает web server и millis() ESP32

sssnek
Offline
Зарегистрирован: 20.07.2019

Одновременно не работает web server и millis() ESP32

Необходимо что бы при включении ESP32, поочереди включаись и отключались насосы каждые 5 сек (постоянно, покугу) 1 вкл - 5сек -1 выкл - 2 вкл - 5сек - 2 выкл и так далие 16шт.

Помимо этого есть html страничка которач не грузится паралельно с работой насосов.

В дальнейшем надо сделать ручной и автоматический режим включения насосов.

Подскажите что не так? Что мешает серверу работать?

#include <WiFi.h>


// Wi-Fi
const char* ssid = "INet";
const char* password = "000000008";
const int pin_p[] = {12,13,14,15,16,17,21,22,23,25,26,27,32,33,34,35}; //масив с номерами пинов
int i=0;
String State_P[15] = "off"; //состояние пинов для сервера
String State_I[15] = "on"; //состояние пинов для цыкла


//----------------------Таймер-----------------------------

unsigned long interval = 5000;
unsigned long next_time = 0;
// переменная для хранения HTTP-запроса:
    String header;
    // вспомогательные переменные
    // для хранения текущего состояния выходных контактов:
    // Ручной режим
String manual = "on";

WiFiServer server(80);

void setup(){
    // preparing GPIOs
    Serial.begin(115200);
    
    //Задаем пинам из масива, OUTPUT
for (int i=0; i <= 15; i++){
  pinMode(pin_p[i],OUTPUT); 
}
  //Задаем пинам из масива, LOW
for (int i=0; i <= 15; i++){
  digitalWrite(pin_p[i], LOW);
}

//-------------------------------------Wi-Fi---------------------------------------------------
Serial.print("Connecting to ");

      //  "Подключаемся к "
      Serial.println(ssid);
      WiFi.begin(ssid, password);
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
      
      // печатаем в мониторе порта локальный IP-адрес
      // и запускаем веб-сервер:
      Serial.println("");
      Serial.println("WiFi connected.");  //  "WiFi подключен."
      Serial.println("IP address: ");  //  "IP-адрес: "
      Serial.println(WiFi.localIP());
      server.begin();
//-------------------------------------Wi-Fi---------------------------------------------------
    }
  void loop(){
          unsigned long now_time = millis();
          digitalWrite(pin_p[i],HIGH);
          State_P[i]="ON";
     //---------------------------------------------Задержка------------------------------------------
      if( now_time - next_time >= interval )  // если текущее время превысило намеченное время, то
      {
          digitalWrite(pin_p[i],LOW);
          State_P[i]="OFF";          
          Serial.print("OFF- ");
          Serial.println(i);// вычисляем время следующего переключения
          i++;
            if (i>=16){
            i=0;
          }
          next_time = now_time; // вычисляем время следующего переключения 

  }
       // начинаем прослушивать входящих клиентов:
      WiFiClient client = server.available();
     
      if (client) {                     // если подключился новый клиент,    
        Serial.println("New Client.");  // печатаем сообщение
                                        // «Новый клиент.»
                                        // в мониторе порта;
        String currentLine = "";        // создаем строку для хранения
                                        // входящих данных от клиента;
        while (client.connected()) {    // цикл while() будет работать
                                        // все то время, пока клиент
                                        // будет подключен к серверу;
          if (client.available()) {     // если у клиента есть данные,
                                        // которые можно прочесть,
            char c = client.read();     // считываем байт, а затем    
            Serial.write(c);            // печатаем его в мониторе порта
            header += c;
            if (c == '\n') {            // если этим байтом является
                                        // символ новой строки
              // если мы получим два символа новой строки подряд
              // то это значит, что текущая строчка пуста;
              // это конец HTTP-запроса клиента,
              // а значит – пора отправлять ответ:
              if (currentLine.length() == 0) {
                // HTTP-заголовки всегда начинаются
                // с кода ответа (например, «HTTP/1.1 200 OK»)
                // и информации о типе контента
                // (чтобы клиент понимал, что получает);
                // в конце пишем пустую строчку:
                client.println("HTTP/1.1 200 OK");
                client.println("Content-type:text/html");
                client.println("Connection: close");
                           //  "Соединение: отключено"
                client.println();
               
                // с помощью этого кода
                // включаем и выключаем GPIO-контакты:
                //-------------------------Переключаем режим - РУЧНОЙ / АВТОМАТИЧЕСКИЙ -------------------------
                if (header.indexOf("GET /manual_on") >= 0) {
                  Serial.println("manual on");  //  "Ручной режим"
                  manual = "on";
                } else if (header.indexOf("GET /manual_off") >= 0) {
                  Serial.println("manual off");  //  "Автоматический"
                  manual = "off";
                }
                // -------------------------Включаем насос 1-------------------------
                if (header.indexOf("GET /Pump_1_on") >= 0) {
                  Serial.println("Pump_1_on");  //  "GPIO12 включен"
                  State_P[0] = "ON";
                  digitalWrite(pin_p[0], HIGH);
                } else if (header.indexOf("GET /Pump_1_off") >= 0) {
                  Serial.println("Pump_1_on");  //  "GPIO12 выключен"
                  State_P[0] = "OFF";
                  digitalWrite(pin_p[0], LOW);
                }
                // -------------------------Включаем насос 2-------------------------
                if (header.indexOf("GET /Pump_2_on") >= 0) {
                  Serial.println("Pump_2_on");  //  "GPIO13 включен"
                  State_P[1] = "ON";
                  digitalWrite(pin_p[1], HIGH);
                } else if (header.indexOf("GET /Pump_2_off") >= 0) {
                  Serial.println("Pump_2_off");  //  "GPIO13 выключен"
                  State_P[1] = "OFF";
                  digitalWrite(pin_p[1], LOW);             
                }
                // -------------------------Включаем насос 3-------------------------
                if (header.indexOf("GET /Pump_3_on") >= 0) {
                  Serial.println("Pump_3_on");  //  "GPIO14 включен"
                  State_P[2] = "ON";
                  digitalWrite(pin_p[2], HIGH);
                } else if (header.indexOf("GET /Pump_3_off") >= 0) {
                  Serial.println("Pump_3_off");  //  "GPIO14 выключен"
                  State_P[2] = "OFF";
                  digitalWrite(pin_p[2], LOW);             
                }
                 //-------------------------Включаем насос 4-------------------------
                if (header.indexOf("GET /14_on") >= 0) {
                  Serial.println("GPIO 14 on");  //  "GPIO14 включен"
                  State_P[3] = "ON";
                  digitalWrite(pin_p[3], HIGH);
                } else if (header.indexOf("GET /14_off") >= 0) {
                  Serial.println("GPIO 14 off");  //  "GPIO14 выключен"
                  State_P[3] = "OFF";
                  digitalWrite(pin_p[3], LOW);             
                }
                //-------------------------Включаем насос 5-------------------------
                if (header.indexOf("GET /Pump_5_on") >= 0) {
                  Serial.println("Pump_5_on");  //  "GPIO14 включен"
                  State_P[4] = "ON";
                  digitalWrite(pin_p[4], HIGH);
                } else if (header.indexOf("GET /Pump_5_off") >= 0) {
                  Serial.println("Pump_5_off");  //  "GPIO14 выключен"
                  State_P[4] = "OFF";
                  digitalWrite(pin_p[4], LOW);
                       
                // показываем веб-страницу с помощью этого HTML-кода:
                client.println("<!DOCTYPE html><html>");
                client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
                client.println("<link rel=\"icon\" href=\"data:,\">");
                // с помощью CSS задаем стиль кнопок «ON» и «OFF»;
                // если есть желание, можно поэкспериментировать
                // с фоновым цветом и атрибутами размера шрифта:
                client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");
                client.println(".button { background-color: #4CAF50; border: none; color: white; padding: 16px 40px;");
                client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");
                client.println(".button2 {background-color: #555555;}</style></head>");
               
                // заголовок веб-страницы:
                client.println("<body><h1>MoHuToPuHr FREONA</h1>");
               
                // рисуем кнопку для контакта GPIO27
                // и показываем его текущее состояние (ON/OFF):
                client.println("<p>MANUAL MODE" + manual + "</p>");
                client.println("<p>PUMP 1 " + State_P[0] + "</p>");
                client.println("<p>PUMP 2 " + State_P[1] + "</p>");
                client.println("<p>PUMP 3 " + State_P[2] + "</p>");
                client.println("<p>PUMP 4 " + State_P[3] + "</p>");
                client.println("<p>PUMP 5 " + State_P[4] + "</p>");

                // если на контакте «D12_pinState» значение «off»,

                //Ручной режим---------------------------------------------------------------------------------------------------
                if (manual=="off") {
                  client.println("<p><a href=\"/manual_on\"><button class=\"button\">&nbsp;AUTO&nbsp;</button></a></p>");
                } else {
                  client.println("<p><a href=\"/manual_off\"><button class=\"button button2\">MANUAL</button></a></p>");
                }
              if (manual=="on") {
               //Насос 1---------------------------------------------------------------------------------------------------
                if (State_P[0]=="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>");
                }

                //Насос 2---------------------------------------------------------------------------------------------------
                if (State_P[1]=="OFF") {
                  client.println("<p><a href=\"/13_on\"><button class=\"button\">ON </button></a></p>");
                } else {
                  client.println("<p><a href=\"/13_off\"><button class=\"button button2\">OFF</button></a></p>");
                }
                
                //Насос 3---------------------------------------------------------------------------------------------------
                if (State_P[2]=="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>");
                }
                //Насос 4---------------------------------------------------------------------------------------------------
                if (State_P[3]=="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>");
                }
                //Насос 5---------------------------------------------------------------------------------------------------
                if (State_P[4]=="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>");
                }
            }

                // конец html отображения
                client.println("</body></html>");
                // конец HTTP-ответа задается
                // с помощью дополнительной пустой строки:
                client.println();
                // выходим из цикла while:
                break;
              } else {  // если получили символ новой строки,
                        // очищаем текущую строку «currentLine»:
                currentLine = "";
              }
            } else if (c != '\r') {  // если получили любые данные,
                                     // кроме символа возврата каретки,
              currentLine += c;      // добавляем эти данные
                                     // в конец строки «currentLine»
            }
          }
        }
        // очищаем переменную «header»:
        header = "";
        
        // отключаем соединение:
        
        client.stop();
        Serial.println("Client disconnected.");
                   //  "Клиент отключен."
        Serial.println("");
      }
      }

  }

 

Клапауций 003
Offline
Зарегистрирован: 20.07.2019

включи в настройках ИДЕ Core Debug Level: verbose и в компорте смотри, возможно, что понятно станет, где затык.

больше ничего не посоветую, т.к. пока юзаю ESP32 без радио-фейсов, т.е. на одном ядре.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

В строках №№ 9 и 10 размеры массивов 15, а в строке №71 проверка на 16. Не знаю единственная ли это ошибка (думаю, нет), но ошибка грубая, приводящая к непредсказуемому поведению и, пока её не исправите, говорить не о чем.

sssnek
Offline
Зарегистрирован: 20.07.2019

Почитал про verbose. Но не пойму как он работает в Arduino IDE, и как его применять!

Спасибо!

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

А ошибку в размере массива собираетесь править?

sssnek
Offline
Зарегистрирован: 20.07.2019

Огромное спасибо, что-то я затупил. Думал что количество переменных в масиве тоже с учетом 0 надо считать.

Работать четко начала. Выходы переключаются но web страчки так и нет!

Клапауций 003
Offline
Зарегистрирован: 20.07.2019

sssnek пишет:

Почитал про verbose. Но не пойму как он работает в Arduino IDE, и как его применять!

Спасибо!

в нулевой компорт выдаёт отладочную инфу - нулевой, это тот, через который прошиваешь.

т.е. монитор порта запусти в Дуино ИДЕ