ESP32: Публикация показаний датчиков в Google Sheets (совместимо с ESP8266)
В этом руководстве мы покажем вам, как публиковать показания датчиков в Google Sheets с помощью платы ESP32 или ESP8266. В качестве примера мы будем публиковать показания температуры, влажности и давления с датчика BME280 в таблицу Google Sheets каждые 30 минут — мы будем использовать IFTTT.
Вы можете использовать IFTTT для интеграции с Google Sheets, но в настоящее время мы рекомендуем интеграцию с Google Sheets с помощью сервисного аккаунта Google. Рекомендуем следующее руководство: ESP32: Логирование данных в Google Sheets (с использованием сервисного аккаунта Google).
Обзор проекта
На следующем рисунке показан обзор того, что вы получите к концу этого проекта.
Сначала ESP подключается к вашей сети Wi-Fi;
Затем BME280 снимает показания температуры, влажности и давления;
Ваш ESP32 или ESP8266 связывается с сервисом IFTTT Webhooks, который публикует показания в таблицу Google Sheets, сохранённую в папке вашего Google Drive;
После публикации показаний ESP переходит в режим глубокого сна на 30 минут;
Через 30 минут ESP просыпается;
После пробуждения ESP подключается к Wi-Fi, и процесс повторяется.
Создание аккаунта IFTTT
Для этого проекта мы будем использовать IFTTT для интеграции с Google Sheets. Поэтому первый шаг — создание аккаунта на IFTTT, если у вас его ещё нет. Создание аккаунта на IFTTT бесплатно!
Перейдите на официальный сайт: ifttt.com и введите свой email, чтобы начать.
Создание апплета
Далее вам нужно создать новый апплет. Следуйте следующим шагам для создания нового апплета:
1) Перейдите в «My Applets» и создайте новый апплет, нажав кнопку «New Applet».
2) Нажмите на слово «this», выделенное синим цветом, как показано на рисунке ниже.
3) Найдите сервис «Webhooks» и выберите иконку Webhooks.
4) Выберите триггер «Receive a web request».
5) Задайте имя событию. В данном случае «bme280_readings», как показано на рисунке ниже. Затем нажмите кнопку «Create trigger».
6) Нажмите слово «that», чтобы продолжить.
7) Найдите сервис «Google Sheets» и выберите иконку Google Sheets.
8) Если вы ещё не подключили сервис Google Sheets, вам нужно нажать кнопку «Connect».
9) Выберите действие «Add a row to spreadsheet».
10) Затем заполните поля действия. Дайте таблице имя, оставьте поле «Formatted row» по умолчанию, а затем выберите путь к папке Google Drive. Если вы оставите это поле пустым, IFTTT создаст папку «IFTTT» в вашем Google Drive для сохранения таблицы. Наконец, нажмите кнопку «Create action».
11) Ваш апплет будет создан после нажатия кнопки «Finish».
Тестирование вашего апплета
Прежде чем продолжить работу над проектом, очень важно сначала протестировать ваш апплет. Следуйте следующим шагам для тестирования вашего апплета.
1) Перейдите на страницу сервиса Webhooks и нажмите кнопку «Documentation».
2) Появится страница, как показано на следующем рисунке. На странице отображается ваш уникальный API-ключ. Вы не должны делиться своим уникальным API-ключом ни с кем.
Заполните раздел «To trigger an Event», как показано ниже — он выделен красными прямоугольниками. Затем нажмите кнопку «Test it».
3) Событие должно быть успешно запущено, и вы получите зелёное сообщение, как показано ниже, с текстом «Event has been triggered».
4) Перейдите в ваш Google Drive. Сервис IFTTT должен был создать папку «IFTTT» с таблицей «BME280_Readings» внутри.
5) Откройте таблицу, и вы должны увидеть значения, которые вы ранее заполнили для тестирования апплета.
Продолжайте чтение, чтобы узнать, как интегрировать сервис IFTTT Google Sheets с вашим ESP32 или ESP8266.
Необходимые компоненты
Для этого примера мы будем снимать показания с датчика BME280. Вот список компонентов, которые вам понадобятся для сборки схемы этого проекта:
Плата ESP32 (читайте Сравнение лучших плат разработки ESP32)
Альтернатива — плата ESP8266 (читайте Лучшие платы разработки ESP8266)
Вы можете использовать приведённые выше ссылки или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!
Схемы подключения
Датчик BME280, который мы используем в этом примере, может общаться с ESP32/ESP8266 по протоколу связи I2C. Поэтому мы будем использовать выводы I2C на ESP.
BME280 с ESP32
Следуйте следующей схеме подключения для подключения датчика BME280, если вы используете ESP32.
(Эта схема использует модуль ESP32 DEVKIT V1 с 36 GPIO — если вы используете другую модель, пожалуйста, проверьте распиновку вашей платы.)
Рекомендуемое чтение: ESP32 с датчиком BME280 в Arduino IDE (давление, температура, влажность)
BME280 с ESP8266
Следуйте следующей схеме подключения, если вы используете ESP8266 12E.
Примечание: для использования глубокого сна с ESP8266 вам нужно соединить D0 (GPIO16) с выводом RST.
Рекомендуемое чтение: ESP8266 с BME280 в Arduino IDE (давление, температура, влажность)
Установка библиотеки BME280
Для снятия показаний с модуля датчика BME280 мы будем использовать библиотеку Adafruit_BME280. Следуйте следующим шагам для установки библиотеки в вашей Arduino IDE:
Откройте Arduino IDE и перейдите в Sketch > Include Library > Manage Libraries. Должен открыться менеджер библиотек.
Найдите «adafruit bme280» в поле поиска и установите библиотеку.
Установка библиотеки Adafruit_Sensor
Для использования библиотеки BME280 вам также необходимо установить библиотеку Adafruit_Sensor. Следуйте следующим шагам для установки библиотеки в вашей Arduino IDE:
Перейдите в Sketch > Include Library > Manage Libraries и введите «Adafruit Unified Sensor» в поле поиска. Прокрутите вниз, чтобы найти библиотеку, и установите её.
После установки библиотек перезапустите Arduino IDE.
Код
Существует дополнение для Arduino IDE, которое позволяет программировать ESP32 с помощью Arduino IDE и его языка программирования. Следуйте одному из следующих руководств для подготовки вашей Arduino IDE, если вы этого ещё не сделали.
Убедившись, что дополнение ESP32 установлено, вы можете скопировать следующий код в вашу Arduino IDE. Но пока не загружайте его! Вам нужно внести несколько изменений, чтобы он работал для вас.
Примечание: этот код работает как с ESP32, так и с ESP8266.
/*
* Rui Santos
* Complete Project Details https://randomnerdtutorials.com
*/
#ifdef ESP32
#include <WiFi.h>
#else
#include <ESP8266WiFi.h>
#endif
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
// Replace with your SSID and Password
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
// Replace with your unique IFTTT URL resource
const char* resource = "REPLACE_WITH_YOUR_IFTTT_URL_RESOURCE";
// How your resource variable should look like, but with your own API KEY (that API KEY below is just an example):
//const char* resource = "/trigger/bme280_readings/with/key/nAZjOphL3d-ZO4N3k64-1A7gTlNSrxMJdmqy3";
// Maker Webhooks IFTTT
const char* server = "maker.ifttt.com";
// Time to sleep
uint64_t uS_TO_S_FACTOR = 1000000; // Conversion factor for micro seconds to seconds
// sleep for 30 minutes = 1800 seconds
uint64_t TIME_TO_SLEEP = 1800;
// Uncomment to use BME280 SPI
/*#include <SPI.h>
#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10*/
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme; // I2C
//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI
void setup() {
Serial.begin(115200);
delay(2000);
// initialize BME280 sensor
bool status;
status = bme.begin(0x76);
if (!status) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
}
initWifi();
makeIFTTTRequest();
#ifdef ESP32
// enable timer deep sleep
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
Serial.println("Going to sleep now");
// start deep sleep for 3600 seconds (60 minutes)
esp_deep_sleep_start();
#else
// Deep sleep mode for 3600 seconds (60 minutes)
Serial.println("Going to sleep now");
ESP.deepSleep(TIME_TO_SLEEP * uS_TO_S_FACTOR);
#endif
}
void loop() {
// sleeping so wont get here
}
// Establish a Wi-Fi connection with your router
void initWifi() {
Serial.print("Connecting to: ");
Serial.print(ssid);
WiFi.begin(ssid, password);
int timeout = 10 * 4; // 10 seconds
while(WiFi.status() != WL_CONNECTED && (timeout-- > 0)) {
delay(250);
Serial.print(".");
}
Serial.println("");
if(WiFi.status() != WL_CONNECTED) {
Serial.println("Failed to connect, going back to sleep");
}
Serial.print("WiFi connected in: ");
Serial.print(millis());
Serial.print(", IP address: ");
Serial.println(WiFi.localIP());
}
// Make an HTTP request to the IFTTT web service
void makeIFTTTRequest() {
Serial.print("Connecting to ");
Serial.print(server);
WiFiClient client;
int retries = 5;
while(!!!client.connect(server, 80) && (retries-- > 0)) {
Serial.print(".");
}
Serial.println();
if(!!!client.connected()) {
Serial.println("Failed to connect...");
}
Serial.print("Request resource: ");
Serial.println(resource);
// Temperature in Celsius
String jsonObject = String("{\"value1\":\"") + bme.readTemperature() + "\",\"value2\":\"" + (bme.readPressure()/100.0F)
+ "\",\"value3\":\"" + bme.readHumidity() + "\"}";
// Comment the previous line and uncomment the next line to publish temperature readings in Fahrenheit
/*String jsonObject = String("{\"value1\":\"") + (1.8 * bme.readTemperature() + 32) + "\",\"value2\":\""
+ (bme.readPressure()/100.0F) + "\",\"value3\":\"" + bme.readHumidity() + "\"}";*/
client.println(String("POST ") + resource + " HTTP/1.1");
client.println(String("Host: ") + server);
client.println("Connection: close\r\nContent-Type: application/json");
client.print("Content-Length: ");
client.println(jsonObject.length());
client.println();
client.println(jsonObject);
int timeout = 5 * 10; // 5 seconds
while(!!!client.available() && (timeout-- > 0)){
delay(100);
}
if(!!!client.available()) {
Serial.println("No response...");
}
while(client.available()){
Serial.write(client.read());
}
Serial.println("\nclosing connection");
client.stop();
}
Указание SSID и пароля
Первое, что вам нужно изменить в коде — это ваши сетевые учётные данные: SSID и пароль в следующих строках:
// Replace with your SSID and Password
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
Указание уникального URL-ресурса IFTTT
Затем вам нужно указать ваш уникальный URL-ресурс IFTTT. Вернитесь к разделу «Тестирование вашего апплета», пункт 2), чтобы получить ваш уникальный URL-ресурс IFTTT.
// Replace with your unique IFTTT URL resource
const char* resource = "REPLACE_WITH_YOUR_IFTTT_URL_RESOURCE";
В моём случае мой ресурс:
/trigger/bme280_readings/with/key/nAZjOphL3d-ZO4N3k64-1A7gTlNSrxMJdmqy3
Таким образом, эта строка в коде выглядит следующим образом:
const char* resource = "/trigger/bme280_readings/with/key/nAZjOphL3d-ZO4N3k64-1A7gTlNSrxMJdmqy3";
Настройка времени сна
В этом примере мы установили время сна на 30 минут. Это означает, что каждые 30 минут ESP просыпается, снимает показания и публикует их в вашу таблицу Google Sheets. Время сна задаётся в переменной TIME_TO_SLEEP в секундах:
// sleep for 30 minutes = 1800 seconds
uint64_t TIME_TO_SLEEP = 1800;
Если вы хотите изменить время сна, вам нужно изменить переменную TIME_TO_SLEEP. Обратите внимание, что время сна указывается в переменной TIME_TO_SLEEP в секундах.
Предупреждение: будьте осторожны при установке времени сна. Если вы установите очень короткий период, вы можете превысить лимит запросов, установленный сервисом IFTTT.
Отправка показаний BME280
Показания датчика BME280 отправляются с помощью переменной jsonObject, как показано в следующей строке:
String jsonObject = String("{\"value1\":\"") + bme.readTemperature() + "\",\"value2\":\"" + (bme.readPressure()/100.0F) + "\",\"value3\":\"" + bme.readHumidity() + "\"}";
Публикация температуры в градусах Фаренгейта
Для публикации температуры в градусах Фаренгейта вам нужно закомментировать и раскомментировать код следующим образом:
// Temperature in Celsius
/*String jsonObject = String("{\"value1\":\"") + bme.readTemperature() + "\",\"value2\":\"" + (bme.readPressure()/100.0F) + "\",\"value3\":\"" + bme.readHumidity() + "\"}";*/
// Comment the previous line and uncomment the next line to publish temperature readings in Fahrenheit
String jsonObject = String("{\"value1\":\"") + (1.8 * bme.readTemperature() + 32) + "\",\"value2\":\"" + (bme.readPressure()/100.0F) + "\",\"value3\":\"" + bme.readHumidity() + "\"}";
Демонстрация
После внесения всех необходимых изменений загрузите код на ваш ESP32 или ESP8266. Убедитесь, что вы выбрали правильную плату и COM-порт.
Каждые 30 минут ESP32 или ESP8266 просыпается для снятия показаний датчиков и публикует показания в таблицу Google Sheets.
Чип ESP32 имеет встроенные часы, поэтому показания очень точны, и он публикует в таблицу каждые 30 минут. С другой стороны, ESP8266 публикует новые показания приблизительно каждые 28-29 минут.
Заключение
В этой статье мы показали вам, как публиковать показания датчиков с ESP32 или ESP8266 в таблицу Google Sheets с помощью платформы IFTTT. В качестве примера мы опубликовали показания с датчика BME280. Мы также использовали возможности глубокого сна (deep sleep) ESP для экономии энергии. Таким образом, ESP работает только тогда, когда нужно снять показания. Вы можете взять этот пример проекта и применить его к своим собственным проектам.
Обратите внимание, что этот метод имеет некоторые ограничения: во-первых, он использует сторонний сервис, и во-вторых, вам нужно быть осторожным с количеством запросов, которые вы делаете в день. Тем не менее, этот метод работает очень хорошо и прост в реализации.
Если вам нравится ESP32 и вы хотите узнать больше, обязательно ознакомьтесь с нашим курсом, посвящённым исключительно ESP32: Изучение ESP32 с Arduino IDE.
—
Данная статья является переводом материала с сайта Random Nerd Tutorials. Все права на оригинальный контент принадлежат автору — Rui Santos.