К книге
Цифровая электроника для начинающихСтраница 12
67%
Страница 12
12

msg1 = msg2;

msg2 = msg3;

msg3 = msg;

Функцию вывода на экран также придется изменить.

3.13 Отправляем данные через Dropbox

Мы уже умеем выводить с ESP32 данные через встроенный веб-сервер. К сожалению, главный его недостаток - необходимость наличия статического IP-адреса, если мы хотим получать доступ извне. Это удобно, но статический IP-адрес - это обычно платная услуга, этого хотелось бы избежать.

Есть альтернативный способ - сохранять данные в бесплатном сервисе Dropbox. Это позволит ESP32 периодически сохранять логи или какую-либо другую информацию в файлах Dropbox, и они будет автоматически синхронизироваться и появляться на домашнем компьютере или смартфоне.

Сначала нужно создать так называемое “приложение dropbox”, сделать это можно по ссылке https://www.dropbox.com/developers/apps/create:

Когда приложение создано, мы можем выбрать его в разделе My apps на странице https://www.dropbox.com/developers/apps.

Приложение Dropbox имеет доступ только к определенной папке, которая будет синхронизироваться с домашним или рабочим компьютером, и будет иметь путь “Имя_пользователя\Dropbox\Приложения\Имя_приложения”.

Внутри настроек приложения есть параметр “access token”, он будет нужен нам для получения доступа.

Там же выбираем пункт Generate access token:

Нажимаем кнопку “Generate” рядом с “access token”, и получаем ключ вида V3z9NpYlRxEAAAAAAACG5cjBXXXXXXXXXXXXXX, его надо сохранить, мы будем использовать его в дальнейшем.

На этом подготовительная часть закончена. Сам сервис Dropbox имеет разнообразное API для работы с данными, посмотреть список функций можно по адресу https://www.dropbox.com/developers/documentation/http/documentation. Нам для отправки файлов нужна будет всего лишь одна функция upload.

Для того, чтобы отличать файлы друг от друга, мы будем создавать файлы по шаблону “год-месяц-день-чч-мм-сс.txt”. Dropbox требует защищенного соединения по https, поэтому мы используем класс WiFiClientSecure.

Код программы целиком приведен ниже.

#include <WiFi.h>

#include <WiFiClientSecure.h>

#include <time.h>

const char* ssid = "TP-LINK_AB11";

const char* password = "12345678";

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 XXXXXXXXXXXXXXXXXXXXXXXXXXXX");

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);

while (WiFi.status() != WL_CONNECTED) {

delay(500);

WiFi.begin(ssid, password);

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, которую можно вызывать нужное число раз (имеет смысл делать это не очень часто, например раз в 5 или 30 минут). В данном примере функция вызывается только из setup(), чтобы файлы не создавались постоянно.

Вместо XXXXXXXXXXXXXXXXXXXXXXXXXXXX нужно будет вставить свой токен, полученный в панели управления https://www.dropbox.com/developers/apps.

Результат - запускаем программу, и через некоторое время видим в папке Dropbox 3 файла.

При использовании в реальном приложении, целесообразно отправлять лог лишь по каким-то редким событиям (например срабатывание датчика открывания двери). Если же нужно отправлять лог постоянно, имеет смысл накапливать данные в буфере памяти объемом несколько килобайт, и отправлять данные лишь по мере заполнения буфера.

Важно. Это наверное должно быть и так очевидно, но лучше повторить. Функции любого сервиса, такого как Dropbox, Google, Amazon, всегда поставляются на условиях “как есть” - создатели не гарантируют их абсолютно бесперебойной работы (тем более, если речь идет о бесплатных услугах). Также эти функции могут периодически совершенствоваться и меняться, так что гарантий многолетней и бесперебойной работы устройства, увы, нет. Поэтому подходы, аналогичные описанным выше, не стоит использовать там, где от этого зависит безопасность людей или имущества.

На этом мы закончим описание работы с платой ESP32. Как можно видеть, свою цену в 8$ она отрабатывает на 110%. В следующей части мы рассмотрим работу с Linux на базе одноплатного компьютера Raspberry Pi.

Часть 4. Осваиваем Linux: Raspberry Pi

4.1 Общее знакомство

Одноплатные компьютеры Raspberry Pi появились на рынке несколько лет назад, и сразу получили признание у пользователей. Действительно, всего за 20-30$ покупатель получал практически полноценный компьютер с операционной системой Linux. Мы уже рассматривали платы Arduino, и как нетрудно было видеть, они весьма ограничены в своих возможностях. Linux позволяет использовать практически любые современные средства разработки, от Си или Python, до многопоточных или даже распределенных вычислений.

Компьютер Raspberry Pi - это небольшая плата длиной около 10см, которая выглядит примерно так:

На плате есть Ethernet и WiFi, 4 порта USB, видеовыход HDMI, порт для подключения камеры и ряд выводов, которыми можно управлять программно.

Доступен весьма большой набор различных интерфейсов (показан на картинке справа), от простого переключения пинов до уже рассмотренных нами I2C и SPI.

В этом пожалуй, одно из главных отличий - в отличие от обычных компьютеров, Raspberry Pi легко может подключаться к различным устройствам, ничуть не отличаясь в этом от Arduino. Работу с дисплеем, датчиками, сенсорами и различным оборудованием можно легко совмещать с гибкостью и настраиваемостью Linux. Например, Raspberry Pi легко подключить к домашней WiFi-сети. Или наоборот, Raspberry Pi может работать как точка доступа и не только “раздавать” интернет на другие устройства, но и например, мониторить температуру в помещении и посылать уведомления хозяевам. На Raspberry Pi вполне может работать полноценный Web или FTP-сервер, также можно подключить и USB-модем или иное оборудование. Вместо диска на Raspberry Pi используется карта MicroSD, с нее осуществляется загрузка системы.

Желающим сделать более компактное устройство, можно выбрать Raspberry Pi Zero W, которая по размеру еще вдвое меньше:

На момент написания этой главы (2018й год) последней версией является Raspberry Pi 3, более старые модели брать не рекомендуется, т.к. они имеют менее производительный процессор и не имеют WiFi.

Помимо оригинальной Raspberry Pi, на рынке появилось много клонов, плат такого же размера. Некоторые отличаются ценой, некоторые производительностью. Среди вполне удачных, можно отметить Asus Tinkerboard от известного производителя материнских плат Asus.

Asus Tinkerboard вдвое дороже Raspberry Pi, но имеет более мощный процессор, больше памяти, и может пригодиться для более ресурсоемких задач.

Еще одним плюсом популярности Raspberry Pi является большое количество аксессуаров - корпусов, экранов, реле и прочих дополнительных устройств. Это позволяет вполне гибко подобрать ресурсы под интересующие задачи. К примеру, можно докупить вот такой экран, позволяющий сделать из Raspberry Pi домашний мини-сервер, метеостанцию или пульт управления “умным домом”:

Важно заметить и то, что в отличие от обычного компьютера, Raspberry Pi потребляет мало энергии и не имеет вентиляторов, так что работает совершенно бесшумно.

Кстати о питании, для работы Raspberry Pi нужен блок питания с MicroUSB и максимальным током 2-2.5А, так что подойдет обычное зарядное устройство от любого современного смартфона.

Для первого включения нам понадобятся: Raspberry Pi, клавиатура, HDMI-кабель для подключения к монитору и кард-ридер для записи операционной системы Linux на карту памяти.

4.2 Настройка системы

Вначале нужно подготовить Raspberry Pi к первому использованию. В принципе, ничего не мешает использовать Raspberry Pi как обычный компьютер - подключить клавиатуру и мышь, и пользоваться. Но во-первых, это все же будет довольно-таки медленный компьютер, а во-вторых, это не так интересно, мы пойдем настоящим путем Linux, используя Raspberry Pi в режиме удаленного терминала через консоль.

Шаг-1. Подготовка карты памяти

Скачиваем дистрибутив Raspbian Stretch Lite со страницы на официальном сайте - https://www.raspberrypi.org/downloads/raspbian/. Мы выберем Lite-версию, т.к. она занимает меньше места, и для наших задач будет более эффективна.

Пока дистрибутив скачивается, устанавливаем программу Win32DiskImager. Вставляем карту памяти в кард-ридер, и с помощью win32diskimager записываем сохраненный дистрибутив на карту. По завершении записи карту памяти можно вставить обратно в Raspberry Pi.

Шаг-2. Настройка Raspbian

Подключаем Raspberry Pi к монитору и клавиатуре (мы будем использовать удаленный доступ, но один раз сделать это все-таки придется). Запускаем Raspberry Pi, дожидаемся приглашения ввода имени и пароля, вводим pi и raspberry.

Ура, мы в Linux! Никакого графического интерфейса, и ничего лишнего. Как настоящие хакеры (шутка) мы будем только вводить команды через Linux-терминал. Мышь можно не подключать, нам она не пригодится.

Вводим нашу первую Linux-команду: sudo raspi-config. Raspi-config это программа для настройки системы, а sudo говорит о том, что команда будет запущена с правами администратора, значит она может менять системные файлы и настройки.

Запустится текстовое окно конфигурации системы, в котором нужно будет выбрать следующие параметры:

- Активировать SSH (Advanced options - SSH). Это позволит нам иметь удаленный доступ к Raspberry Pi.

- Активировать I2C (кто забыл что это такое, может перечитать главу 2.8)

- Активировать SPI (через этот интерфейс могут подключаться некоторые дисплеи).

- При желании, можно настроить страну и часовой пояс (Internationalization options).

По завершении ввода настроек, перезагружаемся, если система не предложит сделать это сама, можно набрать команду sudo reboot.

Шаг-3. Подключаемся к Интернет

Следующим шагом мы должны подключить Raspberry Pi к Интернет, без этого на нее не удастся установить никаких программ. Здесь есть 2 варианта.

Самый простой способ - просто подключить Raspberry Pi к сетевому кабелю. При этом ничего настраивать не нужно, все заработает само. Однако, с точки зрения удобства использования платы, это не очень удобный вариант, лишний провод на столе будет только мешаться.

Способ сложнее, зато удобнее - подключиться к домашней сети WiFi. Если мы вдруг забыли имя своей WiFi-сети, можно набрать команду sudo iwlist wlan0 scan. Затем мы открываем текстовый редактор командой sudo nano /etc/wpa_supplicant/wpa_supplicant.conf. Nano - это текстовый редактор, а /etc/wpa_supplicant/wpa_supplicant.conf это путь к файлу, который мы будем редактировать.

Предыдущая главаГлава 12 из 18Следующая глава