Используем Arduino UNO с WiFi на одной плате для POST запроса на сервер
В статье «Как у меня заработал WIFI для Arduino ESP8266 ESP-12E» рассказывал как заставить работать платы Arduino UNO с ESP8266 ESP-12E UART Wi-Fi.
Но зачем такие сложности, если есть уже совмещенная плата?
Вместо слоеного пирога из двух плат:
Заказал вот эту плату:
И она заработала безо всяких прошивок и перепрошивок.
Работает только на скорости 115200
Среда Arduino уже была настроена для работы.
Осталось только переключатели перещелкивать, чтобы заливать скетч в UNO.
Таблица положений переключателей есть здесь.
Вот только не упомянуто положение переключателей (1-4 ON), когда во время работы Mega328+ESP8266 CH340 мониторит порт и выводит в консоль передаваемые команды.
Как настроить среду Arduino объясняется здесь или здесь.
Таблица переключателей.
CH340 connect to ESP8266 (upload sketch)
CH340 connect to ESP8266 (connect)
CH340 connect to ATmega328 (upload sketch)
All modules work independent
Совместная работа и мониторинг команд
Передача информации на серверы Cayenne и RemoteXY.
Протестировал плату на решении задач, скетчи которых заливал в слоеный пирог из двух плат:
Эти сервисы предоставляют свои библиотеки для работы с ESP8266.
Все заработало сразу без изменений и мучений.
Необходимо в скетчах заменить скорость на 115200.
Передача информации на произвольный сервер.
Решение предыдущей задачи «Отправка данных из ESP8266WiFi на сервер с CMS MaxSite» с этой платой повторить не удалось.
Для отправки данных на произвольный сервис использовалась универсальная библиотека WiFiESP.
И оказалось, что эта библиотека не заработала с этой платой, выдавая
[WiFiEsp] Warning: Unsupported firmware 0.9.5
Действительно, модуль при обращении с соответствующей командой AT+GMR сообщает версию SDK 0.9.5:
В файле README.md библиотеки можно прочитать:
Supports ESP SDK version 1.1.1 and above (AT version 0.25 and above).
Попытки обновить прошивку при помощи flash_download_tools не увенчались успехом (да и не старался особо):
Ведь библиотеки Cayenne и RemoteXY для этой платы заработали без проблем!
В этих статьях описывается способ обращения к ESP8266 обычными командами без библиотек.
Будем обрабатывать POST запрос к серверу при помощи плагина my_esp8266 для MaxSiteCMS, который принимает данные.
ESP8266: HTTP POST Requests
Introduction
The objective of this post is to explain how to do POST requests from an ESP8266, using the Arduino IDE and the ESP8266 libraries. All the tests shown here were performed on a NodeMCU board, which you can find at Ebay for less than 5 euros.
If you prefer a video tutorial, please check my YouTube Channel below.
The setup
First, we need to include some libraries, which should be available after the installation of the ESP8266 support for the Arduino IDE.
We will need the ESP8266WiFi.h, so we can connect the ESP8266 to a WiFi network, and the ESP8266HTTPClient.h, which makes available the methods needed to perform the POST request.
In the Arduino setup function, we will start by initializing a serial connection, so we can output the results of our program.
After that, we will take care of connecting the ESP8266 to a WiFi network, so later we can send the HTTP request. To do so, we only need to call the begin method on the WiFi extern variable, passing as first input the name of the network (SSID) and as second the password. Note that, in the snippet below, I’m using placeholder strings that you should replace by your network credentials.
For a detailed tutorial on how to connect a ESP8266 to a WiFi network, please check here.
To finish the setup function, we will poll the status of the WiFi connection until it is established. We are using a polling approach here for simplicity, since we can only start doing the HTTP POST requests after the connection to the WiFi network is established. Naturally, in a real application, we should take in consideration that there might be some issue trying to connect to the network and that polling might not be the best approach for the requirements.
The complete setup function can be seen below.
The main code
In this section, we will analyze the code needed in the Arduino main loop function to perform the HTTP POST request. We will break the code in parts and analyze them step by step, but the final result is summarized at the end of this section.
First of all, we need to define an object of class HTTPClient, from which we will call various methods to prepare the headers and content of the request, send it and check for the result. We will call this object simply “http“.
After that, we will call the begin method on the http object and pass the URL that we want to connect to and make the HTTP POST request. In this case, I’m sending the post request to an application running on my local network, which is why I’m sending it the format seen bellow (Host_IP:Port/Path).
Nevertheless, we can send the request to a website by specifying it’s domain name, as seen bellow (the destination website used in the code snippet implements a dummy REST API for testing and prototyping).
Next, we can define headers for the request with the addHeader method. In this case, we are specifying the content-type as “text/plain“, since we will just send a simple string in the body.
The body of the request is specified as a parameter when calling the POST method on the HTTPClient object. In this case, we will simply send a string saying “Message from ESP8266”. The return value of this method corresponds to the HTTP response code and thus it is important to check for error handling.
Take in consideration that, if the value is greater than 0, it corresponds to a standard HTTP code. If this value is lesser than 0, it corresponds to a ESP8266 error, related with the connection. You can check the list of possible errors here.
We can now get the payload by calling the getString method, which will return the response payload as a String.
We will print both the received payload and the HTTP code.
To finish, we need to call the end method on the http object to guarantee that the TCP connection is closed. This is very important to free the resources.
The final code is shown bellow. To handle any possible WiFi connection errors, we will include a validation of the connection status before making the request. We will also add a 30 seconds delay between each iteration of the Arduino loop, to avoid a constant polling of the server.
Note that, to keep the code simpler and focus on the main subject of sending the HTTP POST request, we did not check if the httpCode variable is less than zero, which indicates an error in the connection. Nevertheless, we should do so in the final code of an application.
Testing the code
In the context of this tutorial, I was sending the post requests to a MuleSoft application running in a machine on my local network. Just to illustrate the result, figure 1 shows the output of incoming requests on the console of the development environment. As can be seen in the bottom right, it is printing the “Message from ESP8266” string we defined early.
Figure 2 shows the HTTP codes and response payloads for the POST requests. In this case, I defined a simple “Message received” string as response to the requests.
To avoid having to setup your own server to test the ESP8266 code, you can simply send the request to the testing API suggested in the previous section.
Final Notes
As an alternative, the begin method used before can be called with other sets of parameters, as can be seen in the specification of the HTTPClient class. For example, we can pass the host IP, port and path as 3 different parameters, instead of a single string, amongst many other options.
The HTTPClient class also has a method to simplify debugging of a response to the request. So, if we want to print the response payload to the serial port, we can just call the writeToStream method and pass as argument a pointer to the Serial port, that we initialized before in the setup function. So, the call bellow is an alternative to the getString method used in the code section:
These are just 2 alternative implementation examples. The HTTPClient class has many other useful methods not used in this tutorial. You can check them here.
ESP8266 уроки. HTTP-запрос POST
Цель этого урока — объяснить, как выполнять запросы POST от ESP8266, используя Arduino IDE и библиотеки ESP8266. Все показанные здесь тесты, были выполнены на плате NodeMCU.
Для данного урока нужно подключить некоторые библиотеки, которые должны быть доступны после установки поддержки ESP8266 в среде Arduino IDE.
Нам понадобится ESP8266WiFi.h, чтобы была возможность подключить ESP8266 к сети Wi-Fi, и ESP8266HTTPClient.h, который делает доступными методы, необходимые для выполнения запроса POST.
В функции setup() Arduino начнем с инициализации последовательного соединения, чтобы была возможность вывести результаты нашей программы.
После этого позаботимся о подключении ESP8266 к сети Wi-Fi, чтобы позже мы могли отправить HTTP-запрос. Для этого нужно только вызвать метод begin для переменной WiFi, передав в качестве первого значения, имя сети (SSID), а второй параметр — пароль.
Внимание , используйте учетные данные вашей сети.
Подробное руководство о том, как подключить ESP8266 к сети Wi-Fi, можно прочитать здесь.
Чтобы завершить настройку, будем опрашивать статус WiFi-соединения, пока оно не будет установлено. Для простоты используем здесь метод опроса, так как начать выполнение HTTP-запросов POST можно только после того, как будет установлено соединение с сетью Wi-Fi. Естественно, в реальном приложении мы должны учитывать, что при попытке подключения к сети могут возникнуть некоторые проблемы.
Полная настройка приведена ниже.
Описание кода HTTP-запросы POST.
В этом разделе проанализируем код, выполняемый в функции основного цикла Arduino для выполнения запроса HTTP POST. Будем разбивать код на части и анализировать его шаг за шагом, но окончательный результат подведен в конце этого раздела.
Прежде всего, нам нужно определить объект класса HTTPClient, из которого будем вызывать различные методы для подготовки заголовков и содержимого запроса, отправки его и проверки результата. Будем называть этот объект просто «http».
После этого вызовем метод begin для объекта http и передадим URL-адрес, к которому мы хотим подключиться, и сделаем запрос HTTP POST. В этом случае я отправляю запрос на веб-сайт, указав его доменное имя, как показано ниже (целевой веб-сайт, используемый во фрагменте кода, реализует фиктивный REST API для тестирования и прототипирования).
Затем можем определить заголовок для запроса с помощью метода addHeader. В этом случае указываем тип содержимого как «text/plain», поскольку мы просто отправим простую строку в теле.
Тело запроса указывается в качестве параметра при вызове метода POST для объекта HTTPClient. В этом случае просто отправим строку «Message from ESP8266». Возвращаемое значение этого метода соответствует коду ответа HTTP, поэтому важно проверить обработку ошибок.
Учтите, что если значение больше 0, оно соответствует стандартному коду HTTP. Если это значение меньше 0, это соответствует ошибке ESP8266, связанной с подключением. Вы можете проверить список возможных ошибок здесь.
Теперь можем получить полезную нагрузку, вызвав метод getString, который вернет информацию ответа в виде строки.
Выведем полезную нагрузку и код HTTP в монитор порта.
В завершение нам нужно вызвать метод end объекта http, чтобы гарантировать закрытие TCP-соединения. Это очень важно для освобождения ресурсов.
Полный код показан ниже. В скетч добавим 30-секундную задержку между каждым выполнение цикла Arduino, чтобы избежать постоянного опроса сервера.
Обратите внимание, что для упрощения кода и сосредоточения внимания на основной теме отправки запроса HTTP POST мы не проверяли, меньше ли значение переменной httpCode нуля, что указывает на ошибку в соединении. Тем не менее, мы должны сделать это в окончательном коде приложения.
Тестирование кода POST запроса с помощью ESP8266.
На рисунке ниже показан результат для запроса POST. Чтобы избежать необходимости настраивать собственный сервер для тестирования кода ESP8266, вы можете просто отправить запрос в API тестирования.
Заключительные и примечания по POST-запросу с помощью ESP8266.
В качестве альтернативы использованный ранее метод begin может быть вызван с другими наборами параметров, что можно увидеть в спецификации класса HTTPClient. Например, мы можем передать IP-адрес хоста, порт и путь как 3 разных.
Класс HTTPClient также имеет метод, упрощающий отладку ответа на запрос. Итак, если хотим вывести полезную нагрузку ответа в последовательный порт, можем просто вызвать метод writeToStream и в качестве аргумента указать на последовательный порт, который мы инициализировали ранее в функции настройки. Итак, приведенный ниже код является альтернативой методу getString:
Это всего лишь 2 альтернативных примера реализации. У класса HTTPClient есть много других полезных методов, не используемых в этом уроке. Вы можете посмотреть их здесь.
Понравился ESP826 урок. HTTP-запрос POST? Не забудь поделиться с друзьями в соц. сетях.
А также подписаться на наш канал на YouTube, вступить в группу Вконтакте, в группу на Facebook.
Спасибо за внимание!
Технологии начинаются с простого!