ESP32 - это микроконтроллер с низким энергопотреблением(не совсем), который является новой версией нашумевшего ESP8266. В отличии от его предка, на борту у нас есть не только Wi-Fi, но и встроенный Bluetooth, что в целом и послужила его возвышении перед другими микроконтроллерами в разделе создания умного дома.
Для начала работы с ESP32 нужно подключить плату к компьютеру. Первым шагом будет открытие Arduino IDE. Затем нужно найти в «Файл» – «Настройки» и в окно «дополнительные ссылки для менеджера плат» вставить ссылку:
https://dl.espressif.com/dl/package_esp32_index.json
После этого в меню «документы» – «плата» «менеджер плат» выбрать «ESP32» и установить последнюю версию.
После проделанных действий в меню «инструменты» – «плата» нужно найти ESP32 Arduino.
И в случае с нашей платой выбираем ESP32 Dev Module
После того, как все необходимые данные будут установлены и скопированы, можно будет начать работать.
GET-запрос по URL-адресу в Интернете.
// библиотека для работы с HTTP-протоколом #include <HTTPClient.h> // вводим имя и пароль точки доступа const char* ssid = "WIFINAME"; const char* password = "WIFIPASSWORD"; void setup() { // иницилизируем монитор порта Serial.begin(115200); // запас времени на открытие монитора порта — 5 секунд delay(5000); // подключаемся к Wi-Fi сети WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to Wi-Fi.."); } Serial.println("Connected to the Wi-Fi network"); } void loop() { // выполняем проверку подключения к беспроводной сети if ((WiFi.status() == WL_CONNECTED)) { // создаем объект для работы с HTTP HTTPClient http; // подключаемся к тестовому серверу с помощью HTTP http.begin("http://httpbin.org/"); // делаем GET запрос int httpCode = http.GET(); // проверяем успешность запроса if (httpCode > 0) { // выводим ответ сервера String payload = http.getString(); Serial.println(httpCode); Serial.println(payload); } else { Serial.println("Error on HTTP request"); } // освобождаем ресурсы микроконтроллера http.end(); } delay(10000); }
После подключения к Wi-Fi микроконтроллер напишет в COM порт ответ от сервера.
Создадим WEB-сервер на порту 80. С помощью веб-интерфейса будем мигать светодиодами на 16 и 17 пинах.
// подключяем библиотеку для работы с Wi-Fi server #include <WiFi.h> // указываем пины, к которым подключены светодиоды #define LED_GREEN 16 #define LED_RED 17 // вводим имя и пароль точки доступа const char* ssid = "WIFINAME"; const char* password = "WIFIPASSWORD"; // инициализируем сервер на 80 порте WiFiServer server(80); // создаем буфер и счетчик для буфера char lineBuf[80]; int charCount = 0; void setup() { // запас времени на открытие монитора порта — 5 секунд delay(5000); // инициализируем контакты для светодиодов pinMode(LED_GREEN, OUTPUT); pinMode(LED_RED, OUTPUT); // инициализируем монитор порта Serial.begin(115200); // подключаемся к Wi-Fi сети Serial.println(); 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("Wi-Fi connected"); Serial.println("IP-address: "); // пишем IP-адрес в монитор порта Serial.println(WiFi.localIP()); server.begin(); } void loop() { // анализируем канал связи на наличие входящих клиентов WiFiClient client = server.available(); if (client) { Serial.println("New client"); memset(lineBuf, 0, sizeof(lineBuf)); charCount = 0; // HTTP-запрос заканчивается пустой строкой boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); Serial.write(c); // считываем HTTP-запрос lineBuf[charCount] = c; if (charCount < sizeof(lineBuf) - 1) { charCount++; } // на символ конца строки отправляем ответ if (c == '\n' && currentLineIsBlank) { // отправляем стандартный заголовок HTTP-ответа client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); // тип контента: text/html client.println("Connection: close"); // после отправки ответа связь будет отключена client.println(); // формируем веб-страницу String webPage = "<!DOCTYPE HTML>"; webPage +="<html>"; webPage +=" <head>"; webPage +=" <meta name=\"viewport\" content=\"width=device-width,"; webPage +=" initial-scale=1\">"; webPage +=" </head>"; webPage +=" <h1>ESP32 - Web Server</h1>"; webPage +=" <p>LED #1"; webPage +=" <a href=\"on1\">"; webPage +=" <button>ON</button>"; webPage +=" </a> "; webPage +=" <a href=\"off1\">"; webPage +=" <button>OFF</button>"; webPage +=" </a>"; webPage +=" </p>"; webPage +=" <p>LED #2"; webPage +=" <a href=\"on2\">"; webPage +=" <button>ON</button>"; webPage +=" </a> "; webPage +=" <a href=\"off2\">"; webPage +=" <button>OFF</button>"; webPage +=" </a>"; webPage +=" </p>"; webPage +="</html>"; client.println(webPage); break; } if (c == '\n') { // анализируем буфер на наличие запросов // если есть запрос, меняем состояние светодиода currentLineIsBlank = true; if (strstr(lineBuf, "GET /on1") > 0) { Serial.println("LED 1 ON"); digitalWrite(LED_GREEN, HIGH); } else if (strstr(lineBuf, "GET /off1") > 0) { Serial.println("LED 1 OFF"); digitalWrite(LED_GREEN, LOW); } else if (strstr(lineBuf, "GET /on2") > 0) { Serial.println("LED 2 ON"); digitalWrite(LED_RED, HIGH); } else if (strstr(lineBuf, "GET /off2") > 0) { Serial.println("LED 2 OFF"); digitalWrite(LED_RED, LOW); } // начинаем новую строку currentLineIsBlank = true; memset(lineBuf, 0, sizeof(lineBuf)); charCount = 0; } else if (c != '\r') { // в строке попался новый символ currentLineIsBlank = false; } } } // даем веб-браузеру время, чтобы получить данные delay(1); // закрываем соединение client.stop(); Serial.println("client disconnected"); } }
Скопируйте IP-адрес из монитора порта и вставьте в адресную строку браузера. Если вы подключены к той же локальной сети, что и ESP32, то вы увидите веб-интерфейс. При переходе по IP-адресу из монитора порта, выводится веб-страница с кнопками.