Одновременно не работает web server и millis() ESP32
- Войдите на сайт для отправки комментариев
Сб, 20/07/2019 - 14:43
Одновременно не работает 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\"> AUTO </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(""); } } }
включи в настройках ИДЕ Core Debug Level: verbose и в компорте смотри, возможно, что понятно станет, где затык.
больше ничего не посоветую, т.к. пока юзаю ESP32 без радио-фейсов, т.е. на одном ядре.
В строках №№ 9 и 10 размеры массивов 15, а в строке №71 проверка на 16. Не знаю единственная ли это ошибка (думаю, нет), но ошибка грубая, приводящая к непредсказуемому поведению и, пока её не исправите, говорить не о чем.
Почитал про verbose. Но не пойму как он работает в Arduino IDE, и как его применять!
Спасибо!
А ошибку в размере массива собираетесь править?
Огромное спасибо, что-то я затупил. Думал что количество переменных в масиве тоже с учетом 0 надо считать.
Работать четко начала. Выходы переключаются но web страчки так и нет!
Почитал про verbose. Но не пойму как он работает в Arduino IDE, и как его применять!
Спасибо!
в нулевой компорт выдаёт отладочную инфу - нулевой, это тот, через который прошиваешь.
т.е. монитор порта запусти в Дуино ИДЕ