/*
* Создано для сайта 1injener.ru
* Домашний веб сервер на Аrduino. Температура и Реле [Проверенно]
* Про работу с WI-FI модулем можно прочитать на хорошем сайте еsp8266.ru
*/
#include "dht11.h" // Добавляем библиотеку DHT11
dht11 DHT; // Объявление переменной класса dht11
#define DHT11_PIN 4
HardwareSerial & monitor = Serial;
HardwareSerial & esp_serial = Serial1;
// Установка пинов для реле. Предусмотренно на будущее 2 реле, а использовалось только 1.
const int relay1 = 22;
const int relay2 = 23;
//Буфер для передачи данных с сервера в ардуину
#define BUFFER_SIZE 128
char buffer[BUFFER_SIZE];
//Временные переменные для нужд сервера.
int result = 0;
int OK = 1;
int TIMEOUT = 2 ;
int CANCEL = 3;
int NOT_FOUND = 4;
int i;
int m=0;
int lp = 0;
char inputChar[500];
int len = 0;
//Порт для Веб сервера на Ардуино
String port="80";
String cmd;
String myIP;
int currentID;
int ch_id, packet_len;
char *pb;
void(* resetFunc) (void) = 0;
//Установки при старте Ардуины
//Устанавливаются пины для реле как выходы и в выключенное состояние
void setup() {
pinMode(relay1, OUTPUT);
pinMode(relay2, OUTPUT);
digitalWrite(relay1,LOW);
digitalWrite(relay2,LOW);
//Активируем Serial терминал для отображения данных на компьютере (Для проверки)
monitor.begin(115200);
esp_serial.begin(115200); // Так же активируем Serial для Wi-FI модуля ESP8266
monitor.println(F("\nESP8266 WebServer TEST"));
delay(1000);
/* RESET Module */
esp_serial.println("AT+RST"); // Програмный рестарт WI-FI модуля
monitor.print("\nAT+RST");
result = CheckResponse(); // Специальной функцией ниже мы отлавливаем ответ модуля "ОК"
if(result == OK){
Serial.print(" OK");
delay(300);
}
else{
Serial.print(" ERROR");
delay(2000);
resetFunc();
}
//Ниже идут части программы к которым мы будем обращаться из основного цикла.
SET_MODE:
esp_serial.println("AT+CWMODE=1"); // Установка режима клиента, который будет подключаться к роутеру.
// Так же можно подключаться к самому модулю. Но об этом в другой статье.
monitor.print("\nAT+CWMODE=1");
result = CheckResponse(); // ответ модуля "ОК"
if(result == OK){
Serial.print(" OK");
delay(200);
}
else{
Serial.print(" ERROR");
delay(1000);
goto SET_MODE;
}
DISCONNECT_AP:
esp_serial.println("AT+CWQAP"); // Отключение
monitor.print("\nAT+CWQAP");
result = CheckResponse(); // ответ модуля "ОК"
if(result == OK){
Serial.print(" OK");
delay(300);
}
else{
Serial.print(" ERROR");
delay(1000);
goto DISCONNECT_AP;
}
CONNECT_WIFI:
cmd = "AT+CWJAP=\"*******\",\"2365426HC\"";
esp_serial.println(cmd); // Подключение к роутеру. Выше надо прописать ваш SSID wifi точки роутера и пароль
monitor.print("\n"+cmd);
result = CheckResponse(); // ответ модуля "ОК"
if(result == OK){
Serial.print(" OK");
delay(300);
}
else{
Serial.print(" ERROR");
delay(1000);
goto CONNECT_WIFI;
}
SET_MULTIPLE:
esp_serial.println("AT+CIPMUX=1"); // Выбор режима множественных подключений
monitor.print("\nAT+CIPMUX=1");
result = CheckResponse(); // ответ модуля "ОК"
if(result == OK){
Serial.print(" OK");
delay(300);
}
else{
Serial.print(" ERROR");
delay(1000);
goto SET_MULTIPLE;
}
START_SERVER:
cmd = "AT+CIPSERVER=" + String("1") + String(",") + port;
esp_serial.println(cmd); // СТАРТУЕМ!!! Я СКАЗАЛ СТАРУЕЕЕМ!
monitor.print("\n"+cmd);
result = CheckResponse(); // ответ модуля "ОК"
if(result == OK){
Serial.print(" OK");
delay(200);
}
else{
Serial.print(" ERROR");
delay(1000);
}
CHECK_IP:
esp_serial.println("AT+CIFSR"); // Отображаем и проверяем получили ли мы IP адресс от роутера.
monitor.print("\nAT+CIFSR");
readSerial();
monitor.print(inputChar);
readSerial();
monitor.print(inputChar);
readSerial();
monitor.print(inputChar);
for(unsigned char i=0;i<2;i++){
esp_serial.println("AT+CIPCLOSE"); // Закрываем подключение
monitor.print("\nAT+CIPCLOSE");
result = CheckResponse(); // ответ модуля "ОК"
if(result == OK){
Serial.print(" OK");
delay(200);
}
else{
Serial.print(" ERROR");
delay(200);
}
}
}
//Основной цикл, Веселье начинается
void loop() {
esp_serial.readBytesUntil('\n', buffer, BUFFER_SIZE); //Считываем в буфер все что говорит нам модуль
if(strncmp(buffer, "+IPD,", 5)==0) {
monitor.print("\nBuffer");
// Запрос: +IPD,ch,len:data
sscanf(buffer+5, "%d,%d", &ch_id, &packet_len);
if (packet_len> 0) {
monitor.print("\nlen> 0");
pb = buffer+5;
while(*pb!=':') pb++;
pb++;
//Получили все что получили и парсим на наличие в данных необходимых параметров
//Отслеживаем реле 1 включение
if (strncmp(pb, "GET /?relay1on", 14) == 0) {
//monitor.print(millis()); //Отладочная информация ы консоль компьютера
//monitor.print(" : ");
//monitor.println(buffer);
//monitor.print( "get led from ch :" );
//monitor.println(ch_id);
delay(100);
clearSerialBuffer();
digitalWrite(relay1, HIGH);
homepage(ch_id);
}
////Отслеживаем реле 1 выключение
if (strncmp(pb, "GET /?relay1off", 14) == 0) {
//monitor.print(millis());
//monitor.print(" : ");
//monitor.println(buffer);
//monitor.print( "get led from ch :" );
//monitor.println(ch_id);
delay(100);
clearSerialBuffer();
digitalWrite(relay1, LOW);
homepage(ch_id);
}
if (strncmp(pb, "GET /?relay2on", 14) == 0) {
//monitor.print(millis());
//monitor.print(" : ");
//monitor.println(buffer);
//monitor.print( "get led from ch :" );
//monitor.println(ch_id);
delay(100);
clearSerialBuffer();
digitalWrite(relay2, HIGH);
homepage(ch_id);
}
if (strncmp(pb, "GET /?relay2off", 14) == 0) {
//monitor.print(millis());
// monitor.print(" : ");
// monitor.println(buffer);
// monitor.print( "get led from ch :" );
// monitor.println(ch_id);
delay(100);
clearSerialBuffer();
digitalWrite(relay2, LOW);
homepage(ch_id);
}
//Если нет никаких параметров в GET запросе
if (strncmp(pb, "GET / ", 6) == 0) {
// monitor.print(millis());
// monitor.print(" : ");
// monitor.println(buffer);
// monitor.print( "get Status from ch:" );
// monitor.println(ch_id);
delay(100);
clearSerialBuffer();
homepage(ch_id);
}
}
}
clearBuffer();
monitor.print( "\nLoop ");
}
//Основная функция и при вызове выдается страница
void homepage(int ch_id) {
String Header;
//Спрашиваем у датчика температуру как и в остальных примерах
int chk;
chk = DHT.read(DHT11_PIN);
String Hum = String(DHT.humidity,DEC);
String Temp = String(DHT.temperature,DEC);
//Ниже идут знания HTML.
Header = "HTTP/1.1 200 OK\r\n";
Header += "Content-Type: text/html\r\n";
Header += "Connection: close\r\n";
Header += "Refresh: 20\r\n";
String Content;
Content = "
Цифровой: Влажность: "+Hum+" | Температура: "+Temp+"
"; Content += " "; Content += "Мой дом. для 1injener.ru
"; Content += "