DyadyaGenya
Member
Доброго времени суток. К своему огромному сожалению из-за вынужденного безделья все забыл и закостенел. Но как всегда в спешке пробую разобраться. Хочу на вэб странице в форму вбить данные с датчика. На самом деле датчик не важен, но в данной ситуации это DHT11.
Есть несколько проблем:
1. Функция HTTP запроса, где выводятся все данные (пока без вписывания в поля формы на странице) если датчик не подключен пишет в данных ерунду или не компилируется скетч.
2. Хотелось бы использовать для заполнения форм на странице json. Как по мне, так удобнее читать и проще отправлять POST
3. Как все таки заполнить данными формы на странице? Понимаю, что нужен jscript
Что я делаю:
1. Отрезаю на ESP место под фтп и заливаю туда простенький index.html Туда же потом зальются файл стилей и jscript
2. Подключаю библиотеки вэбсервера, фтп сервера, самой есп, для работы с файловой системой, для вайфая и для датчика
3. Все запускаю и получаю айпи для своей есп.
4. Оформляю блок для HTTP запросов
5. Объявляю стринговские переменные для этих запросов
Если делать запрос по каждому показателю (статус датчика, температура, влажность) датчика, то все работает. Если же хочу вывести сразу все, то если датчик подключен, все выводится, а если его отключить (типа сгорел или ещё что-то), то вместо данных температуры и влажности выскакивают какие-то непонятные цифры или же скетч не компилируется. Пишет ошибку преобразования (пробовал int, char, сразу стринг).
Подробности ниже в коде:
Есть несколько проблем:
1. Функция HTTP запроса, где выводятся все данные (пока без вписывания в поля формы на странице) если датчик не подключен пишет в данных ерунду или не компилируется скетч.
2. Хотелось бы использовать для заполнения форм на странице json. Как по мне, так удобнее читать и проще отправлять POST
3. Как все таки заполнить данными формы на странице? Понимаю, что нужен jscript
Что я делаю:
1. Отрезаю на ESP место под фтп и заливаю туда простенький index.html Туда же потом зальются файл стилей и jscript
2. Подключаю библиотеки вэбсервера, фтп сервера, самой есп, для работы с файловой системой, для вайфая и для датчика
3. Все запускаю и получаю айпи для своей есп.
4. Оформляю блок для HTTP запросов
5. Объявляю стринговские переменные для этих запросов
Если делать запрос по каждому показателю (статус датчика, температура, влажность) датчика, то все работает. Если же хочу вывести сразу все, то если датчик подключен, все выводится, а если его отключить (типа сгорел или ещё что-то), то вместо данных температуры и влажности выскакивают какие-то непонятные цифры или же скетч не компилируется. Пишет ошибку преобразования (пробовал int, char, сразу стринг).
Подробности ниже в коде:
Код:
#include <ESP8266WiFi.h> // Библиотека для создания Wi-Fi подключения (клиент или точка доступа)
#include <WiFiClient.h>
#include <ESP8266WebServer.h> // Библиотека для управления устройством по HTTP (например из браузера)
#include <FS.h> // Библиотека для работы с файловой системой
#include <ESP8266FtpServer.h> // Библиотека для работы с SPIFFS по FTP
#include "DHTesp.h"
const char* ssid = "";
const char* password = "";
ESP8266WebServer HTTP(80); // Определяем объект и порт сервера для работы с HTTP
FtpServer ftpSrv; // Определяем объект для работы с модулем по FTP (для отладки HTML)
DHTesp dht; // Определяем объект для работы с модулем DHT
void setup() {
Serial.begin(9600);
dht.setup(D4, DHTesp::DHT11); // Определяем на какой пин подается данные температуры и влаги
WiFi.begin(ssid, password); // Инициализируем подключение к указанной вайфай сети
SPIFFS.begin(); // Инициализируем работу с файловой системой
HTTP.begin(); // Инициализируем Web-сервер
ftpSrv.begin("",""); // Поднимаем FTP-сервер для удобства отладки работы HTML (логин: relay, пароль: relay)
while (WiFi.status() != WL_CONNECTED) { // Запускаем ожидание подключения к роутеру или вайфай серверу
delay(1000); Serial.println("waiting...");
}
Serial.println(WiFi.localIP());
// Обработка HTTP-запросов
HTTP.on("/get_all", [](){ // При HTTP запросе вида http://адрес есп/get_all
HTTP.send(200, "text/plain", get_all()); // Отдаём клиенту код успешной обработки запроса, сообщаем, что формат ответа текстовый и возвращаем результат выполнения функции relay_switch
});
HTTP.on("/temper", [](){ // При HTTP запросе вида http://адрес есп/temper
HTTP.send(200, "text/plain", temper()); // Отдаём клиенту код успешной обработки запроса, сообщаем, что формат ответа текстовый и возвращаем результат выполнения функции relay_status
});
HTTP.on("/vlaga", [](){ // При HTTP запросе вида http://адрес есп/vlaga
HTTP.send(200, "text/plain", vlaga()); // Отдаём клиенту код успешной обработки запроса, сообщаем, что формат ответа текстовый и возвращаем результат выполнения функции relay_status
});
HTTP.on("/status", [](){ // При HTTP запросе вида http://адрес есп/status
HTTP.send(200, "text/plain", status()); // Отдаём клиенту код успешной обработки запроса, сообщаем, что формат ответа текстовый и возвращаем результат выполнения функции relay_status
});
HTTP.onNotFound([](){ // Описываем действия при событии "Не найдено"
if(!handleFileRead(HTTP.uri())) // Если функция handleFileRead (описана ниже) возвращает значение false в ответ на поиск файла в файловой системе
HTTP.send(404, "text/plain", "Not Found"); // возвращаем на запрос текстовое сообщение "File isn't found" с кодом 404 (не найдено)
});
}
void loop() {
delay(dht.getMinimumSamplingPeriod());
float humidity = dht.getHumidity(); // Тут на всякий случай получаем температуру и влажность
float temperature = dht.getTemperature();
HTTP.handleClient(); // Обработчик HTTP-событий (отлавливает HTTP-запросы к устройству и обрабатывает их в соответствии с выше описанным алгоритмом)
ftpSrv.handleFTP(); // Обработчик FTP-соединений
}
String get_all() { // Функция передачи всех данных
const char* state;
int temper;
int vlag;
float humidity = dht.getHumidity();
float temperature = dht.getTemperature();
if (dht.getStatus() == 0)
{
state = "OK";
temper = temperature;
vlag = humidity;
}
else // И ВОТ ТУТ ПРОБЛЕМА
{
state = "NO";
temper = "Noo";
vlag = "Nine";
}
return String(state)+"+"+String(temper)+"+"+String(vlag); // возвращаем результат, преобразовав число в строку
}
String temper() {
int temper;
float temperature = dht.getTemperature();
temper = temperature;
return String(temper);
}
String vlaga() {
int vlag;
float humidity = dht.getHumidity();
vlag = humidity;
return String(vlag);
}
String status() { // Функция для определения текущего статуса датчика
const char* state;
if (dht.getStatus() == 0) // Если датчик передает данные
state = "OK"; // то запоминаем его как ОК
else
state = "NO"; // запоминаем его как НЕТ
return String(state); // возвращаем результат, преобразовав в строку
}
bool handleFileRead(String path){ // Функция работы с файловой системой
if(path.endsWith("/")) path += "index.html"; // Если устройство вызывается по корневому адресу, то должен вызываться файл index.html (добавляем его в конец адреса)
String contentType = getContentType(path); // С помощью функции getContentType (описана ниже) определяем по типу файла (в адресе обращения) какой заголовок необходимо возвращать по его вызову
if(SPIFFS.exists(path)){ // Если в файловой системе существует файл по адресу обращения
File file = SPIFFS.open(path, "r"); // Открываем файл для чтения
size_t sent = HTTP.streamFile(file, contentType); // Выводим содержимое файла по HTTP, указывая заголовок типа содержимого contentType
file.close(); // Закрываем файл
return true; // Завершаем выполнение функции, возвращая результатом ее исполнения true (истина)
}
return false; // Завершаем выполнение функции, возвращая результатом ее исполнения false (если не обработалось предыдущее условие)
}
String getContentType(String filename){ // Функция, возвращающая необходимый заголовок типа содержимого в зависимости от расширения файла
if (filename.endsWith(".html")) return "text/html"; // Если файл заканчивается на ".html", то возвращаем заголовок "text/html" и завершаем выполнение функции
else if (filename.endsWith(".css")) return "text/css"; // Если файл заканчивается на ".css", то возвращаем заголовок "text/css" и завершаем выполнение функции
else if (filename.endsWith(".js")) return "application/javascript"; // Если файл заканчивается на ".js", то возвращаем заголовок "application/javascript" и завершаем выполнение функции
else if (filename.endsWith(".png")) return "image/png"; // Если файл заканчивается на ".png", то возвращаем заголовок "image/png" и завершаем выполнение функции
else if (filename.endsWith(".jpg")) return "image/jpeg"; // Если файл заканчивается на ".jpg", то возвращаем заголовок "image/jpg" и завершаем выполнение функции
else if (filename.endsWith(".gif")) return "image/gif"; // Если файл заканчивается на ".gif", то возвращаем заголовок "image/gif" и завершаем выполнение функции
else if (filename.endsWith(".ico")) return "image/x-icon"; // Если файл заканчивается на ".ico", то возвращаем заголовок "image/x-icon" и завершаем выполнение функции
return "text/plain"; // Если ни один из типов файла не совпал, то считаем что содержимое файла текстовое, отдаем соответствующий заголовок и завершаем выполнение функции
}