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 );
}
С косяком разобрался тему можно закрывать.