Json arduino как использовать
Перейти к содержимому

Json arduino как использовать

  • автор:

Библиотека ArduinoJson

ArduinoJson доступна через менеджер библиотек в Arduino IDE. Для работы с библиотекой нужно включить заголовочный файл.

Пример десериализации файла и вывод только необходимых данных показан в статье Узнаём погоду через OpenWeatherMap.

Создание JSON-файла

Рассмотрим пример создания JSON-файла с необходимыми данными.

В мониторе порта смотрим, как выглядит запись в JSON-формате.

MessagePack. Сериализация

Кроме текстового формата JSON существует бинарный формат MessagePack. Честно признаюсь, никогда о нём не слышал до чтения примеров для библиотеки. MessagePack имеет преимущество — он эффективен для передачи данных, занимая меньше места. Это может оказаться решающим фактором при больших объёмах данных.

Пример с сериализацией не сильно отличается от аналогичного примера для JSON.

Проверить корректность данных можно на сайте msgpack-lite, декодируя набор байт.

В коде есть код, обрамлённый комментариями. Он позволяет узнать требуемый размер сообщения до отправки, не пересылая сами данные. Это пригодится, чтобы оценить объём данных и принять решение об отправке. Во время отправки сообщения этот код избыточен, так как при отправке сообщения мы можем уже сами посчитать количество отсылаемых байтов.

ESP8266 уроки. Анализ JSON в среде Arduino IDE.

В этом уроке ESP8266 создадим простую программу для синтаксического анализа строки JSON, имитирующей данные с датчика, и вывод полученных значений в последовательный порт. Для данного урока вам нужно установить библиотеки ESP8266 для Arduino IDE, о чем рассказывал здесь.

Чтобы избежать ручного декодирования строки в пригодные для использования значения, будем использовать библиотеку ArduinoJson, которая предоставляет простые в использовании классы и методы для синтаксического анализа JSON. С библиотекой и ее возможностями можно ознакомиться на GitHub.

Эта очень полезная библиотека позволяет, как кодировать, так и декодировать JSON, она очень эффективна и работает на ESP8266. Её можно установить через «менеджер библиотек» Arduino IDE, как показано на рисунке ниже.

библиотеку ArduinoJson

Основные настройки для работы esp8266 json http.

Прежде всего, необходимо подключить библиотеку ArduinoJson, реализующую функцию синтаксического анализа.

Поскольку в этой библиотеке есть некоторые приемы, позволяющие избежать проблем при ее использовании, в этом уроке будет показано, как анализировать локально созданную строку, и поэтому мы не будем использовать функции WiFi. Итак, мы просто запустим последовательное соединение. Но вы можете использовать esp8266 json http на основании предыдущих уроков.

Основной код разбора JSON с помощью ESP8266.

В функции основного цикла loop() объявим сообщение JSON, которое будет проанализировано. Символы «\» используются для экранирования двойных кавычек в строке, поскольку имена JSON требуют двойных кавычек.

Эта простая структура состоит из 2 пар «имя : значение», соответствующих типу датчика и значению для этого датчика. Для удобства чтения, структура JSON данных показана ниже без экранирования символов.

Затем нам нужно объявить объект класса StaticJsonDocument. Он будет соответствовать предварительно выделенному пулу памяти для хранения дерева объектов, и его размер указывается в параметре шаблона (значение между <> ) в байтах.

В этом случае мы объявили размер 300 байт, что более чем достаточно для строки, которую хотим проанализировать. Автор библиотеки указывает здесь два подхода к определению размера буфера. Лично я предпочитаю объявлять буфер, имеющий достаточный размер для ожидаемой полезной нагрузки сообщения, и проверять наличие ошибок на этапе синтаксического анализа.

Библиотека также поддерживает динамическое выделение памяти, но такой подход не рекомендуется.

Затем вызываем объект DeserializationError, передавая строку JSON в качестве аргумента.

Чтобы проверить, успешно ли был проанализирован JSON, проверим, удалось ли выполнить синтаксический анализ.

После этого можем использовать оператор индекса для получения проанализированных значений по их именам. Проверяем здесь информацию об операторе нижнего индекса. Другими словами, это означает, что мы используем квадратные скобки и имена параметров для получения их значений, как показано ниже

Код основного цикла программы показана ниже. Мы включили несколько дополнительных выводов информации, чтобы отделить каждую итерацию функции цикла и показать, как исходная строка изменяется при синтаксическом анализе. Нам нужно напечатать значения char из char, потому что синтаксический анализатор включает символы «\0», и поэтому, если бы мы использовали Serial.println (JSONMessage), мы бы просто видели содержимое до первого символа «\0».

Проверка кода вывода значений полученных из JSON с помощью ESP8266 (NodeMCU).

Чтобы протестировать код, просто скомпилируйте его, и загрузите на плату ESP8266 (NodeMCU). После этого откройте последовательный монитор Arduino IDE. На рисунке ниже показан результат, вывода данных в последовательный порт.

Проверка кода вывода значений полученных из JSON с помощью ESP8266 (NodeMCU).

Как видим, у этой библиотеки есть некоторые особенности, которые должны учитывать при ее использовании, чтобы избежать неожиданных проблем. К счастью, страница этой библиотеки на GitHub очень хорошо документирована, и поэтому здесь есть раздел, описывающий, как избежать ошибок.

Кроме того, настоятельно рекомендую проверить примеры программ, которые устанавливаются вместе с библиотекой, которые очень хорошо подходят для понимания того, как она работает.

Заключение к уроку Arduino json esp8266.

Заключение к уроку Arduino json esp8266.

В этом уроке показано, как легко анализировать JSON при помощи ESP8266 в среде Arduino. Естественно, это позволяет изменять данные в хорошо известном структурированном формате, который может быть легко интерпретирован другими приложениями, без необходимости реализации определенного протокола.

Поскольку микроконтроллеры и устройства IoT имеют ограниченные ресурсы, JSON создает гораздо меньше расходов ресурсов, чем, например, XML, и поэтому является очень хорошим выбором.

Тем не менее, нужно иметь в виду, что для некоторых интенсивных приложений даже JSON может создавать недопустимые нагрузки, и поэтому нам может потребоваться перейти на байтовые протоколы. Но для простых приложений, таких как чтение данных с датчика и отправка их на удаленный сервер или получение набора конфигураций, JSON является очень хорошей альтернативой.

Понравился ESP826 урок. Анализ JSON в среде Arduino IDE? Не забудь поделиться с друзьями в соц. сетях.

А также подписаться на наш канал на YouTube, вступить в группу Вконтакте, в группу на Facebook.

Decoding and Encoding JSON with Arduino or ESP8266

In this blog post you’re going to learn how to decode (parse a JSON string) and encode (generate a JSON string) with the ArduinoJson library using the Arduino with the Ethernet shield. This guide also works with the ESP8266 and ESP32 Wi-Fi modules with small changes.

Important: this tutorial is only compatible with the ArduinoJSON library 5.13.5.

What is JSON?

JSON stands for JavaScript Object Notation. JSON is a lightweight text-based open standard design for exchanging data.

JSON is primarily used for serializing and transmitting structured data over network connection – transmit data between a server and a client. It is often used in services like APIs (Application Programming Interfaces) and web services that provide public data.

JSON syntax basics

In JSON, data is structured in a specific way. JSON uses symbols like < >, : ” ” [ ] and it has the following syntax:

  • Data is represented in key/value pairs
  • The colon (:) assigns a value to key
  • key/value pairs are separated with commas (,)
  • Curly brackets hold objects (< >)
  • Square brackets hold arrays ([ ])

For example, to represent data in JSON, the key/value pairs come as follows:

JSON examples

In a real world example, you may want structure data about a user:

Or in a IoT project, you may want to structure data from your sensors:

In JSON, the values can be another JSON object (sports) or an array (pets) . For example:

Here we are structuring data about a user and we have several keys: “name”, “sports” and “pets”.

The name has the value Rui assigned. Rui may practice different sports relating to where they are practiced. So, we create another JSON object to save Rui’s favorite sports. This JSON object is the value of the “sports” key.

The “pets” key has an array that contains Rui’s pets’ names and it has the values “Max” and “Dique” inside.

Most APIs return data in JSON and most values are JSON objects themselves. The following example shows the data provided by a weather API.

This API provides a lot of information. For example, the first lines store the coordinates with the longitude and latitude.

Arduino with Ethernet shield

The examples in this post use an Arduino with an Ethernet shield. Just mount the shield onto your Arduino board and connect it to your network with an RJ45 cable to establish an Internet connection (as shown in the figure below).

Note: the examples provided in this tutorial also work with the ESP8266 and ESP32 with small changes.

Preparing the Arduino IDE

The easiest way to decode and encode JSON strings with the Arduino IDE is using the ArduinoJson library 5.13.5 which was designed to be the most intuitive JSON library, with the smallest footprint and most efficiently memory management for Arduino.

It has been written with Arduino in mind, but it isn’t linked to Arduino libraries so you can use this library in any other C++ project. There’s also a documentation website for the library with examples and with the API reference.

Features

  • JSON decoding (comments are supported)
  • JSON encoding (with optional indentation)
  • Elegant API, very easy to use
  • Fixed memory allocation (zero malloc)
  • No data duplication (zero copy)
  • Portable (written in C++98)
  • Self-contained (no external dependency)
  • Small footprint
  • Header-only library
  • MIT License

Compatible with

  • Arduino boards: Uno, Due, Mini, Micro, Yun…
  • ESP8266, ESP32 and WeMos boards
  • Teensy, RedBearLab boards, Intel Edison and Galileo
  • PlatformIO, Particle and Energia

Installing the ArduinoJson library

For this project you need to install the ArduinoJson library in your Arduino IDE:

    . You should have a .zip folder in your Downloads folder
  1. Unzip the .zip folder and you should get ArduinoJson-master folder
  2. Rename your folder from ArduinoJson-master to ArduinoJson
  3. Move the ArduinoJson folder to your Arduino IDE installation libraries folder
  4. Finally, re-open your Arduino IDE

Decoding JSON – Parse JSON string

Let’s start by decoding/parsing the next JSON string:

Import the ArduinoJson library:

Arduino JSON uses a preallocated memory pool to store the JsonObject tree, this is done by the StaticJsonBuffer. You can use ArduinoJson Assistant to compute the exact buffer size, but for this example 200 is enough.

Create a char array called json[] to store a sample JSON string:

Use the function parseObject() to decode/parse the JSON string to a JsonObject called root.

To check if the decoding/parsing was successful, you can call root.success():

The result can be false for three reasons:

  • the JSON string has invalid syntax;
  • the JSON string doesn’t represent an object;
  • the StaticJsonBuffer is too small – use ArduinoJson Assistant to compute the buffer size.

Now that the object or array is in memory, you can extract the data easily. The simplest way is to use the JsonObject root:

You can use the decoded variables sensor, time, latitude or longitude in your code logic.

OpenWeatherMap API

For a real example using an Arduino with an Ethernet shield, we’re going to use a free API from OpenWeatherMap to request the day’s weather forecast for your chosen location.

Learning to use APIs is a great skill because it allows you access to a wide variety of constantly-changing information, such as the current stock price, the currency exchange rate, the latest news, traffic updates, and much more.

Using the API

OpenWeatherMap’s free plan provides everything you need for thins example. To use the API you need an API key, known as the APIID. To get an APIID:

  1. Open a browser and go to OpenWeatherMap
  2. Press the Sign up button and create a free account
  3. Once your account is created, you’ll be presented with a dashboard that contains several tabs (see figure below)
  4. Select the API Keys tab and copy your unique Key

This is a unique key you need to pull information from the site. Copy and paste this key somewhere, you’ll need it in a moment.

To pull information on weather in your chosen location, enter the following URL with the sections in curly brackets replaced with your chosen location information and your unique API key:

Replace with the city you want data for, with the country code for that city, and with your unique API key we found previously. For example, our API URL for the town of Porto in Portugal, after replacing with the details, would be:

Note: more information on using the API to get weather information is available here.

Copy your URL into your browser and it should give you a bunch of information that corresponds to your local weather information.

In our case, it returns the weather in Porto, Portugal on the day of writing:

Making an API Request with Arduino

Now that you have a URL that returns your local weather data. You can automate this task and access that data in your Arduino or ESP8266 projects. Here’s the full script that you need to upload to your Arduino with Ethernet shield to return the temperature in Kelvin and humidity:

Note: make sure your replace the resource variable with your unique OpenWeatherMap URL resource:

Modifying the code for your project

In this example, the Arduino performs an HTTP GET request to a desired service (in this case the OpenWeatherMap API), but you could change it to request any other web service. We won’t explain the Arduino code line by line.

For this project it’s important that you understand what you need to change in the Arduino code to decode/parse any JSON response. Follow these next three steps.

STEP #1 – struct

Create a data structure that can store the information that you’ll want to extract from the API. In this case, we want to store the temperature and humidity in char arrays:

STEP #2 – JsonBuffer size

Go to the ArduinoJson Assistant and copy the full OpenWeatherMap API response to the Input field.

Copy the Expression generated (see the preceding figure), in my case:

You’ll need to edit the readReponseContent() function with your the generated JsonBuffer size from ArduinoJson Assistant to allocate the appropriate memory for decoding the JSON response from an API:

Still inside the readReponseContent() function you need to copy the variables that you need for your project to your struct data:

STEP #3 – accessing the decoded data

Then, you can easily access the decoded JSON data in your Arduino code and do something with it. In this example we’re simply printing the temperature in Kelvin and humidity in the Arduino IDE serial monitor:

You can read the docs about enconding here.

Import the ArduinoJson library:

Arduino JSON uses a preallocated memory pool to store the object tree, this is done by the StaticJsonBuffer. You can use ArduinoJson Assistant to compute the exact buffer size, but for this example 200 is enough.

Create a JsonObject called root that will hold your data. Then, assign the values gps and 1351824120 to the sensor and time keys, respectively:

Then, to hold an array inside a data key, you do the following:

It is very likely that you’ll need to print the generated JSON in your Serial monitor for debugging purposes, to do that:

After having your information encoded in a JSON string you could post it to another device or web service as shown in the next example.

Encoding example with Arduino and Node-RED

For this example you need to Node-RED or a similar software that can receive HTTP POST requests. You can install Node-RED on your computer, but I recommend running Node-RED on a Raspberry Pi.

Creating the flow

In this flow, you’re going to receive an HTTP POST request and print the receive data in the Debug window. Follow these next 6 steps to create your flow:

1) Open the Node-RED software in your browser

2) Drag an HTTP input node and a debug node

3) Edit the HTTP input by adding the POST method and the /json-post-example URL

4) You can leave the default settings for the debug node

5) Connect your nodes

6) To save your application, you need to click the deploy button on the top right corner

Your application is saved and ready.

Send JSON data with Arduino

After having Node-RED prepared to receive POST requests at the /json-post-example URL, you can use the next code example on an Arduino with an Ethernet shield to send data to it.

Note: make sure your replace the server variable with your Raspberry Pi IP address:

Modifying the code for your project

In this example, the Arduino performs an HTTP POST request to Node-RED, but you could change it to make request another web service or server. We won’t explain the Arduino code line by line. For this project it’s important that you understand what you need to change in the Arduino code to encode/generate a JSON request.

sendRequest() function

For this project you can modify the sendRequest() function with your own JSON data structure:

Start by reserving memory space for your JSON data. You can use ArduinoJson Assistant to compute the exact buffer size, but for this example 200 is enough.

Create a JsonObject called root that will hold your data and assign the values to your keys (in this example we have the sensor key):

To hold data inside an array, you do the following:

Print the generated JSON string in the Arduino IDE serial monitor for debugging purposes:

The rest of the sendRequest() function is the POST request.

Note that you can use the root.measureLength() to determine the length of your generated JSON. The root.printTo(client) send the JSON data to the Ethernet client.

Demonstration

Open the Arduino IDE serial monitor at a baud rate of 9600 and you’ll see the JSON object printed in the serial monitor every 60 seconds.

In the Node-RED debug tab you’ll see the same JSON object being receive every 60 seconds:

Finally, you create functions in Node-RED that do something useful with the received data, but for demonstration purposes we’re just printing the sample data.

Wrapping up

In this tutorial we’ve shown you several examples on how to decode and encode JSON data. You can follow these basic steps to build more advanced projects that require exchanging data between devices.

We hope you’ve found this tutorial useful.

If you liked this project and Home Automation make sure you check our course: Build a Home Automation System for $100.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *