/* * Создано для сайта 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 = "
Строим сервер
"; Content += "

Мой сервер 1injener.ru

"; Content += "

Цифровой: Влажность: "+Hum+" | Температура: "+Temp+"

"; Content += " "; Content += "

"; Content += " "; Content += "

"; Content += "

Мой дом. для 1injener.ru

"; Content += " "; Header += "Content-Length: "; Header += (int)(Content.length()); Header += "\r\n\r\n"; //Отправка данных START_SENT: esp_serial.print("AT+CIPSEND="); esp_serial.print(ch_id); esp_serial.print(","); esp_serial.println(Header.length()+Content.length()); // monitor.print("AT+CIPSEND="); // monitor.print(ch_id); // monitor.print(","); // monitor.println(Header.length()+Content.length()); delay(10); if (esp_serial.find(">")) { esp_serial.print(Header); esp_serial.print(Content); delay(10); } } void clearSerialBuffer(void) { while ( esp_serial.available()> 0 ) { esp_serial.read(); } } void clearBuffer(void) { for (int i = 0;i 0){ char inChar = esp_serial.read(); if(i> 0){ if (inChar == '\n'){ inputChar[i] = '\0'; esp_serial.flush(); return 0; //break; } } if(inChar!='\r'){ inputChar[i] = inChar; i++; } } } } //Заветная функция определения ответа модуля ОК int CheckResponse(){ for(m=0;m<500;m++){ if(esp_serial.read()=='K'){ // Check "OK" return OK; } delay(10); } return TIMEOUT; }