Освой Arduino играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

ESP32: Используем Dropbox

Использование различных сервисов для хранения данных может оказаться очень удобным инструментом в проекте. Например, мы получаем возможность иметь статический 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 (любое другое имя)

Dropbox app

После нажатия кнопки 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 (выделено жирным шрифтом) подставьте свой токен.

После запуска программы в папке появится три файла.

Дополнительные материалы

Реклама