GET запрос, при нажатии на html кнопку не понятное поведение.
- Войдите на сайт для отправки комментариев
Добрый день, друзья просьба ногами сильно не буцать, это мой первый проект в этой сфере.... Суть проблемы: Есть скейч который будет управлять аквариумом, так как дисплея нет, было принято решение юзать html, там есть три кнопки " on " " off " и " auto " Ну и соответственно показания датчиков температуры, всё работает но... При нажатии на кнопку " on " включается реле (первое включение происходит нормально, точнее если в адресной строке чистый IP без запроса), при нажатии на кнопку " off " реле выключается с двойным шелчком, тоесть на пин подаётся сначала 0 потом 1 и ещё раз 0, тоже самое и в обратную сторону... Прошу помочь с решение (Советом, годной документацией, ну или решением.)
Сам скейч...
/************************************************************************************/ // подключаем библиотеки. #include <ESP8266WiFi.h> #include <WiFiClient.h> #include <OneWire.h> #include <DallasTemperature.h> #include <DS1302.h> /************************************************************************************/ //Объявление пинов подключения. #define led 4 // Пин на Led ленту.(D2) #define pel 12 //Пин реле пельтье.(D6) #define rFill 13 //Пин реле фильтра.(D7) #define rCom 15 //Пин реле компрессора(D8) //Переменные для использования. unsigned long last_time;// Переменная для хранения счетчика. unsigned long last_time_h;//Переменная для хранения счетчика для выключения света. int ledLevel = 0;// Уровень ШИМ сигнала для Led ленты для включения. int ledLevelof = 1023; //Уровень ШИМ сигнала для Led ленты для выключения. /************************************************************************************/ //Класс времени. Time tim; /************************************************************************************/ //Подключение датчика температуры DS18B20 #define ONE_WIRE_BUS 5 //Контакт, к которому подключен датчик температуры. #define ONE_WIRE_MAX_DEV 15 //Максимальное кол-во датчиков. /************************************************************************************/ OneWire oneWire(ONE_WIRE_BUS);//Библиотека датчика DallasTemperature DS18B20(&oneWire);//Подключение датчика int numberOfDevices; //Количество найденных температурных датчиков. DeviceAddress devAddr[ONE_WIRE_MAX_DEV]; //Мак адрес темперетурных датчиков. float tempDev[ONE_WIRE_MAX_DEV]; //Сохранение последнего измерения температуры. float tempDevLast[ONE_WIRE_MAX_DEV]; //Предыдущее измерение температуры. long lastTemp; //Последнее измерение. const int durationTemp = 5000; //Частота измерения температуры. /************************************************************************************/ // RST DS1302 GPIO 0 (D3) // Data DS1302 GPIO 2 (D4) // CLK DS1302 GPIO 14 (D5) DS1302 rtc(0, 2, 14); // Пины подключения часов. /************************************************************************************/ // вписываем здесь SSID и пароль для вашей WiFi-сети: const char* ssid = "MyWIFI"; // название Wi-Fi сети const char* password = "WIFI_pass"; // пароль сети // веб-сервер на порте 80: WiFiServer server(80); /************************************************************************************/ //Преобразование идентификатора устройства в строку String GetAddressToString(DeviceAddress deviceAddress) { String str = ""; for (uint8_t i = 0; i < 8; i++) { if ( deviceAddress[i] < 16 ) str += String(0, HEX); str += String(deviceAddress[i], HEX); } return str; } /************************************************************************************/ //Установка датчика температуры void SetupDS18B20() { DS18B20.begin(); Serial.print("Parasite power is: "); if ( DS18B20.isParasitePowerMode() ) { Serial.println("ON"); } else { Serial.println("OFF"); } numberOfDevices = DS18B20.getDeviceCount(); Serial.print( "Device count: " ); Serial.println( numberOfDevices ); lastTemp = millis(); DS18B20.requestTemperatures(); //Добавление адреса при подключении датчика. for (int i = 0; i < numberOfDevices; i++) { // Search the wire for address if ( DS18B20.getAddress(devAddr[i], i) ) { //devAddr[i] = tempDeviceAddress; Serial.print("Found device "); Serial.print(i, DEC); Serial.print(" with address: " + GetAddressToString(devAddr[i])); Serial.println(); } else { Serial.print("Found ghost device at "); Serial.print(i, DEC); Serial.print(" but could not detect address. Check power and cabling"); } //Get resolution of DS18b20 //Получите разрешение DS18b20 Serial.print("Resolution: "); Serial.print(DS18B20.getResolution( devAddr[i] )); Serial.println(); //Чтение температуры с DS18b20 float tempC = DS18B20.getTempC( devAddr[i] ); Serial.print("Temp C: "); Serial.println(tempC); } } /************************************************************************************/ //Цикл измерения температуры. void TempLoop(long now) { if ( now - lastTemp > durationTemp ) { //Измерение производится в фиксированное время (durationTemp = 5000ms, 5сек). for (int i = 0; i < numberOfDevices; i++) { float tempC = DS18B20.getTempC( devAddr[i] ); // Температура измерения по Цельсию. tempDev[i] = tempC; //Сохранить измеренное значение в массиве. } DS18B20.setWaitForConversion(false); //Не ждать измерения. DS18B20.requestTemperatures(); //Инициировать измерение температуры. lastTemp = millis(); //Сохранение последнего измерения времени. } } /************************************************************************************/ // блок setup() запускается только один раз – при загрузке. void setup() { /************************************************************************************/ pinMode(rFill, OUTPUT); pinMode(rCom, OUTPUT); pinMode(led, OUTPUT); pinMode(pel, OUTPUT); digitalWrite(pel, LOW); digitalWrite(rFill, LOW); digitalWrite(rCom, LOW); /************************************************************************************/ // инициализируем последовательный порт (для отладочных целей). Serial.begin(115200); delay(10); rtc.halt(false); rtc.writeProtect(false); /************************************************************************************/ //Установка времени для модуля часов. ( Расскоментировать предварительно выставив правильное время и дату, после первой загрузки скейча закоментировать и загрузить скейч заново ) //rtc.setDOW(THURSDAY); //rtc.setTime(19,22,45); //rtc.setDate(23, 8, 2018); /************************************************************************************/ // подключаемся к WiFi-сети: Serial.println(); Serial.print("Connecting to "); // "Подключаемся к " Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); // "Подключение к WiFi выполнено" /************************************************************************************/ // запускаем веб-сервер: server.begin(); Serial.println("Web server running. Waiting for the ESP IP..."); // "Веб-сервер запущен. Ожидание IP-адреса ESP..." delay(10000); // печатаем IP-адрес ESP: Serial.println(WiFi.localIP()); /************************************************************************************/ SetupDS18B20(); } /************************************************************************************/ void loop() { /************************************************************************************/ tim = rtc.getTime(); /************************************************************************************/ // Включение света в течении часа. //if (tim.hour == 00 && tim.min == 59){ if (tim.hour == 7 && tim.hour < 8){ if (millis() - last_time > 15000){ last_time = millis(); ledLevel = ledLevel + 5; Serial.println (ledLevel); if (ledLevel >= 999){ ledLevel = 1023; } analogWrite(led, ledLevel); } } /************************************************************************************/ //Проверка что бы свет был включен в течении дня, если не было питания на момент розжига. if (tim.hour > 8 && tim.hour <= 19){ if (millis() - last_time_h > 600000){ last_time_h = millis(); ledLevel = 1023; ledLevel = ledLevel; analogWrite(led, ledLevel); } } /************************************************************************************/ // Выключение света в течении часа. //if (tim.hour == 01 && tim.min == 00){ if (tim.hour == 20 && tim.hour < 21){ if (millis() - last_time > 15000){ last_time = millis(); ledLevelof = ledLevelof - 5; ledLevel = ledLevelof; Serial.println (ledLevel); Serial.println (ledLevelof); if (ledLevelof <= 101){ ledLevelof = 0; } analogWrite(led, ledLevel); } } /************************************************************************************/ //Включение фильтра. if (tim.hour >= 9){ digitalWrite(rFill, HIGH); } //Выключение фильтра if (tim.hour >= 21){ digitalWrite(rFill, LOW); } /************************************************************************************/ // Проверка температуры и включение пельтье при температуре больше чем 26. float temp_C; for (int i = 0; i < numberOfDevices; i++) { temp_C = DS18B20.getTempC( devAddr[1] ); //Serial.println (temp_C); if (temp_C > 25.90){ digitalWrite(pel, 1); } else { digitalWrite(pel, 0); } } /************************************************************************************/ // начинаем прослушку входящих клиентов. WiFiClient client = server.available(); /************************************************************************************/ //Вывести информацию " Температуру полученую с датчиков DALLAS 18b20 и время полученое с модуля реального времени DS1302 " при подключении клиента и обнавление страницы каждые 10 секунд. if (client) { Serial.println("New client"); // "Новый клиент" // создаем переменную типа «boolean», // чтобы определить конец HTTP-запроса: boolean blank_line = true; while (client.connected()) { if (client.available()) { const char* comb; const char* ledb; char c = client.read(); if (c == '\n' && blank_line) { client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); client.println("Refresh: 10"); client.println(); // веб-страница с данными о температуре: client.println("<!DOCTYPE HTML>"); client.println("<html>"); client.println("<head></head><body><h1>ESP8266 - \322\345\354\357\345\360\340\362\363\360\340</h1>"); //\322\345\354\357\345\360\340\362\363\360\340 (Температура) client.print("\304\340\362\340: ");// \304\340\362\340 (Дата) client.print(rtc.getDateStr()); client.print(" \302\360\345\354\377: ");// \302\360\345\354\377 (Время) client.print(rtc.getTimeStr()); client.print(" \304\345\355\374: ");// \304\345\355\374 (День) client.print(rtc.getDOWStr()); client.print("<h3>\312\356\353\353-\342\356 \344\340\362\367\350\352\356\342: ");// \312\356\353\353-\342\356 \344\340\362\367\350\352\356\342 (Колл-во датчиков) client.print(numberOfDevices); client.print("</h3>"); client.print("<table border='1' cellspacing=0>"); client.print("<tr><td>Device id</td><td>\322\345\354\357\345\360\340\362\363\360\340</td></tr>"); // \322\345\354\357\345\360\340\362\363\360\340(Температура) float temp_C; for (int i = 0; i < numberOfDevices; i++) { client.print("<tr><td>"); client.print(" "); client.print(GetAddressToString( devAddr[i] )); client.print(" "); client.print("</td>"); client.print("<td>"); client.print(" "); temp_C = DS18B20.getTempC( devAddr[i] ); client.print(temp_C); client.print("</td></tr>"); Serial.print( "Sending temperature: " ); Serial.println( temp_C ); } client.print("</table>"); client.print("<table border='1' cellspacing=0>"); client.print("<tr>"); client.print("<td>"); client.print("<p>\312\356\354\357\360\345\361\361\356\360 "); client.print("</td>"); client.print("<td>"); client.print("<a href=\"comOn\"><button>ON</button></a><a href=\"comOff\"><button>OFF</button></a><a href=\"autoOff\"><button>AUTO</button></a></p>"); client.print (comb); client.print ("</td>"); client.print("</tr>"); client.print("<tr>"); client.print("<td>"); client.print("<p>\321\342\345\362"); client.print("</td>"); client.print("<td>"); client.print("<a href=\"ledOn\"><button>ON</button></a><a href=\"ledOff\"><button>OFF</button></a><a href=\"autoOff\"><button>AUTO</button></a></p>"); client.print (ledb); client.print("</tr>"); client.print("</td>"); //client.println("<form method=get name=led><input type=radio name=Level value=1 CHECKED>On<input type=radio name=Level value=0>Of<input type=submit value=OK></form>"); //client.print (off); client.print("</table>"); client.println("</body></html>"); break; } if (c == '\n') { // если обнаружен переход на новую строку: blank_line = true; } else if (c != '\r') { // если в текущей строчке найден символ: blank_line = false; String req = client.readStringUntil('\r'); //Serial.println(req); if (req.indexOf("/comOff") != -1){ client.flush(); digitalWrite(rCom, LOW); comb = "Low"; Serial.println (comb); } if (req.indexOf("/comOn") != -1){ digitalWrite(rCom, HIGH); comb = "High"; Serial.println (comb); } if (req.indexOf("/ledOff") != -1){ digitalWrite(led, LOW); ledb = "Low"; } if (req.indexOf("/ledOn") != -1){ digitalWrite(led, HIGH); ledb = "High"; } } } } // закрываем соединение с клиентом: delay(1); client.stop(); Serial.println("Client disconnected."); // "Клиент отключен." } long t = millis(); TempLoop( t ); }
С косяком разобрался тему можно закрывать.