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(); // разрешаем объекту-ответа «удалится»
}
#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); // отправляем ее клиенту.
Управление библиотеками в 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
В Редакторе Code:Blocks есть три места где можно поправить опции линковщика. Самое правильное место на картинке.

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