Работа с JSON со стороны QT

QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender()); if (reply->error() == QNetworkReply::NoError) { // Ниже кусок кода, выводящий в textEdit содержимое полученное с сайта. // QByteArray content= reply->readAll(); // Получаем содержимое ответа // Реализуем преобразование кодировки (зависит от кодировки сайта) // QTextCodec *codec = QTextCodec::codecForName(«windows-1251»); // ui->textEdit->setPlainText(codec->toUnicode(content.data()) ); // Выводим результат // А вот тут уже работа с JSON QJsonDocument document = QJsonDocument::fromJson(reply->readAll()); QJsonObject root = document.object(); ui->textEdit->append(QString::number(root.value(«type»).toInt())); ui->textEdit->append(QString::number(root.value(«numOfPins»).toInt())); QJsonValue jv = root.value(«pin»); QJsonArray ja = jv.toArray(); for(int i = 0; i < ja.count(); i++){ QJsonObject subtree = ja.at(i).toObject(); //Берем подмассив и распарсим его по названиям значений //ui->textEdit->append(QString::number(i)+» = «+QString::number(ja[i].toInt())); // Вот так можно взять строчку из массива ui->textEdit->append(subtree.value(«type»).toString() + » » + subtree.value(«name»).toString()+ » » + subtree.value(«value»).toString()); } } else { ui->textEdit->setPlainText(reply->errorString());// Выводим описание ошибки, если она возникает. } reply->deleteLater(); // разрешаем объекту-ответа «удалится» }

Работа с JSON со стороны Arduino

  #include <ArduinoJson.h> StaticJsonDocument<500> doc; // Количество элементов в дереве json doc[«type»]=1; //Добавляем значение поле type и значение «1» doc[«numOfPins»]=6; // То же самое // А вот тут интереснее. Создаем массив векторов «pin». В каждом векторе может // быть сколько угодно пар JsonArray pinTypes = doc.createNestedArray(«pin»); Прописываем значения для каждого элемента массива. pinTypes[0][«type»]=»INPUT»; pinTypes[0][«name»]=»D3″; pinTypes[0][«value»]=String(digitalRead(0)); // А здесь зачем конвертить в String ? Не знаю. Но когда парсится массив, то //QT не может по-человечески вытащить это значение. А из String легко. pinTypes[1][«type»]=»RESERVED»; pinTypes[1][«name»]=»TX»; pinTypes[1][«value»]=0; // И так далее String jsonDoc; // Библиотека может серилизовать прямо в поток, например //  serializeJson(doc, Serial); Но мне нужно писать по-хитрому, serializeJson(doc, jsonDoc); // Поэтому создаем временную переменную и… server.send(200, «text/html», jsonDoc); // отправляем ее клиенту.

vcpkg

Управление библиотеками в MS Visual Studio Без vcpkg каждую библиотеку придётся ставить по отдельности. Пакетный менеджер vcpkg автоматизирует скачивание и сборку библиотек на машине разработчика. Он интегрируется в Visual Studio и для подключения библиотек не нужно ничего отдельно прописывать в каждом проекте. Сначала качаем Cmake c официального сайта. Потом ставим его и обязательно прописываем в пути. Дальше либо читаем полное описание либо по-быстрому:
:: Клонируем репозиторий vcpkg (ветка master)
git clone https://github.com/Microsoft/vcpkg

:: Переходим в каталог клона репозитория
cd vcpkg

:: Выполняем скрипт для сборки vcpkg
powershell -exec bypass scripts\bootstrap.ps1
:: Теперь в корне репозитория лежит vcpkg.exe, который можно вызывать
::  из каталога либо добавить в переменную окружения PATH.
vcpkg --triplet x86-windows-static  для 32 бит 
Или на выбор:
arm-uwp.cmake
x64-uwp.cmake
x64-windows-static.cmake
x64-windows.cmake
x86-uwp.cmake
x86-windows-static.cmake
x86-windows.cmake
:: Включаем интеграцию во все проекты Visual C++ в системе.
:: При первом запуске нужны права администратора.
vcpkg integrate install

:: Удаляем интеграцию - если она вам помешала.
vcpkg integrate remove

:: Ищем пакеты
vcpkg search opencv4 

Ставим OpenCV 
vcpkg -- triplet x64-windows-static install opencv4[contrib]

CMake projects should use: "-DCMAKE_TOOLCHAIN_FILE=C:/bin/vcpkg/scripts/buildsystems/vcpkg.cmake"

И еще на почитать 
https://docs.microsoft.com/en-us/cpp/build/vcpkg?view=vs-2019

Драйвер двигателей для WeMos D1

WeMos_Driver WeMos_Driver2 Wemos D1 работает на 3,3 В. Большинство драйверов двигателей для Arduino используют 5В логику. Поэтому чтобы не городить согласование логики можно использовать WEMOS I2C Dual Motor Driver.  Про него хорошо написано здесь и здесь Здесь ссылка на GITHUB откуда можно скачать библиотеку для работы с шилдом. I2C адрес 0x30 (по умолчанию), но можно изменить на 0x2D, 0x2E, 0x2F используя перемычки AD0, AD1 на обратной стороне платы модуля. Допускается использовать двигатели с рабочим напряжением от 4,5 до 13,5 В и номинальным током до 1,2 А.

WeMos D1 MINI

Установка в Arduino IDE, Подводные камни Установка хорошо описана здесь: http://wiki.iarduino.ru/page/WEMOS_start/ Но есть 2 момента:
  • Плату выбираем не WeMos D1 R2 & mini, а WeMos D1 Lite.
  • Скетч не прошьется. Будет выдавать ошибку, пока не установить  параметр Erase Flash: All Flash (См. картинку)WeMos