Освой Arduino играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Использование различных сервисов для хранения данных может оказаться очень удобным инструментом в проекте. Например, мы получаем возможность иметь статический IP-адрес, а также получать доступ с компьютера или с телефона.
Для работы у вас должна быть учётная запись Dropbox. Если у вы раньше не пользовались этим сервисом, то у меня для вас небольшой подарок. Зарегистрируйтесь по этой ссылке, и вам (и мне) дадут дополнительные 500Мб свободного места к стандартным 2Гб.
Сначала нужно специальное "приложение на платформе DBX" на странице (ссылка поменялась, ищите сами) - было https://www.dropbox.com/developers/apps/create.
1.Choose an API - Dropbox API.
2.Choose the type of access you need - App folder...
3.Name your app - ESP32 (любое другое имя)
После нажатия кнопки Create app у вас появится отдельная страница созданного приложения. Все созданные приложения можно всегда посмотреть на странице https://www.dropbox.com/developers/apps.
Приложение Dropbox будет иметь доступ только к определённой папке, которая будет синхронизироваться с компьютером. Папка будет находиться по пути Имя_пользователя\Dropbox\Приложения\Имя_приложения.
Внутри настроек приложения у пункта Generated access token есть кнопка Generate для создания специального токена, он необходим для получения доступа. После нажатия кнопки вам выдадут ключ - длинную строку, которую следует запомнить и никому не передавать.
Dropbox API содержит множество функций, о которых можно почитать в документации. Нам будет достаточно одной функции upload.
Скетч создаёт три текстовых файла по шаблону "log-год-месяц-день-чч-мм-сс.txt". В файл будет записана какая-то информация.
Так как Dropbox использует https, то задействуем WiFiClientSecure.
// Подключаем библиотеки
#include "WiFi.h"
#include <WiFiClientSecure.h>
#include <time.h>
// Указываем идентификатор и пароль от своей WiFi-сети
const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPassword";
WiFiClientSecure client;
void uploadData(String content) {
Serial.println("Dropbox connecting...");
if (client.connect("content.dropboxapi.com", 443)) {
Serial.println("Dropbox connected");
// Сформировать имя файла по шаблону времени
time_t now = time(nullptr);
struct tm timeinfo;
gmtime_r(&now, &timeinfo);
char file_name[64] = {0};
strftime(file_name, 64, "log-%Y-%m-%d-%H-%M-%S.txt", &timeinfo);
Serial.print("Upload ");
Serial.println(file_name);
// Отправка запроса
client.println("POST /2/files/upload HTTP/1.1");
client.println("Host: content.dropboxapi.com");
client.println("Authorization: Bearer Your_token");
char dropbox_args[255] = {0};
sprintf(dropbox_args,
"{\"path\": \"/%s\", \"mode\": \"overwrite\", \"autorename\": true, \"mute\": false}", file_name);
client.print("Dropbox-API-Arg: ");
client.println(dropbox_args);
client.println("Content-Type: application/octet-stream");
client.print("Content-Length: ");
client.println(content.length());
client.println();
client.println(content);
delay(5000);
client.stop();
Serial.println("Disconnect");
Serial.println();
} else {
Serial.println("Error: cannot connect");
Serial.println();
}
}
void setup() {
Serial.begin(115200);
delay(10);
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
// Установка времени через SMTP
Serial.print("Setting time using SNTP");
configTime(8 * 3600, 0, "pool.ntp.org", "time.nist.gov");
time_t now = time(nullptr);
while (now < 8 * 3600 * 2) {
delay(500);
Serial.print(".");
now = time(nullptr);
}
Serial.println("done");
// Загрузка данных #1
uploadData(String("Data from ESP32 - this is a test 1"));
delay(5000);
// Загрузка данных #2
uploadData(String("Data from ESP32 - this is a test 2"));
delay(5000);
// Загрузка данных #3
uploadData(String("Data from ESP32 - this is a test 3"));
}
void loop() {}
Для удобства создана отдельная функция uploadData(), которую можно вызывать в любое время. В нашем примере функция вызывается только один раз в setup(), чтобы не создавать файлы постоянно. В реальном проекте вызывайте функцию, когда требуется записать новый лог о каком-то событии.
Вместо Your_token (выделено жирным шрифтом) подставьте свой токен.
После запуска программы в папке появится три файла.