GET запрос, при нажатии на html кнопку не понятное поведение.

Genadich
Offline
Зарегистрирован: 23.08.2018

Добрый день, друзья просьба ногами сильно не буцать, это мой первый проект в этой сфере.... Суть проблемы: Есть скейч который будет управлять аквариумом, так как дисплея нет, было принято решение юзать 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("&nbsp;&nbsp;&nbsp;&nbsp; \302\360\345\354\377: ");// \302\360\345\354\377 (Время)
          client.print(rtc.getTimeStr());
          client.print("&nbsp;&nbsp;&nbsp;&nbsp; \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("&nbsp;");
          client.print(GetAddressToString( devAddr[i] ));
          client.print("&nbsp;");
          client.print("</td>");
          client.print("<td>");
          client.print("&nbsp;&nbsp;");
           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 &nbsp;");
          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 );
}
Genadich
Offline
Зарегистрирован: 23.08.2018

С косяком разобрался тему можно закрывать.