ESP32: публикация показаний датчиков на ThingSpeak (самый простой способ)
В этом руководстве вы узнаете, как отправлять показания датчиков с ESP32 на ThingSpeak. Для демонстрации мы будем использовать датчик BME280, но вы можете легко изменить примеры для использования любого другого датчика. Плата ESP32 будет программироваться с использованием ядра Arduino.
ThingSpeak позволяет публиковать показания ваших датчиков на своём веб-сайте и отображать их на графиках с временными метками. Затем вы можете получить доступ к своим данным из любой точки мира.
У нас есть аналогичное руководство для платы ESP8266: ESP8266 NodeMCU Publish Sensor Readings to ThingSpeak (easiest way)
Обзор проекта
Существует множество способов отправки показаний датчиков на ThingSpeak. В этом руководстве мы используем один из самых простых способов — библиотеку thingspeak-arduino. Эта библиотека предоставляет методы для удобной публикации показаний датчиков в одно или несколько полей. Вы можете ознакомиться с примерами библиотеки на её странице GitHub.
Для примера мы используем датчик BME280, но вы можете использовать любой другой датчик (нужно изменить код).
Рекомендуемое чтение: ESP32 with BME280 Sensor using Arduino IDE (Pressure, Temperature, Humidity).
Мы рассмотрим, как публиковать данные в одно поле и как публиковать в несколько полей.
Подготовка Arduino IDE
Для этого руководства мы будем программировать ESP32 с использованием ядра Arduino. Убедитесь, что у вас установлен аддон ESP32 в Arduino IDE:
Если вы хотите программировать ESP32 с помощью VS Code с расширением PlatformIO, следуйте этому руководству:
Установка библиотеки ThingSpeak
Для отправки показаний датчиков на ThingSpeak мы будем использовать библиотеку thingspeak-arduino. Вы можете установить эту библиотеку через Arduino Library Manager. Перейдите в Sketch > Include Library > Manage Libraries… и найдите «ThingSpeak» в Library Manager. Установите библиотеку ThingSpeak от MathWorks.
Установка библиотек BME280
Как упоминалось ранее, мы будем публиковать показания датчика BME280. Поэтому вам также необходимо установить библиотеки для работы с датчиком BME280.
Вы можете установить библиотеки с помощью Arduino Library Manager. Перейдите в Sketch > Include Library > Manage Libraries и найдите название библиотеки.
Установка библиотек (VS Code + PlatformIO)
Если вы используете VS Code с расширением PlatformIO, скопируйте следующее в файл platformio.ini для подключения библиотек.
lib_deps = mathworks/ThingSpeak@^2.0.0
adafruit/Adafruit Unified Sensor @ ^1.1.4
adafruit/Adafruit BME280 Library @ ^2.1.2
Сборка схемы
Для демонстрации отправки данных на ThingSpeak мы будем отправлять показания с датчика BME280. Поэтому вам нужно подключить датчик BME280 к ESP32.
Необходимые компоненты
Для выполнения этого руководства вам понадобятся следующие компоненты:
Вы можете использовать ссылки выше или перейти на MakerAdvisor.com/tools для поиска всех компонентов по лучшей цене!
Схема подключения
Мы будем использовать I2C-связь с модулем датчика BME280. Для этого подключите датчик к стандартным выводам ESP32 SCL (GPIO 22) и SDA (GPIO 21), как показано на следующей схеме.
Рекомендуемое чтение: ESP32 Pinout Reference: Which GPIO pins should you use?
ThingSpeak — начало работы
Перейдите на ThingSpeak и нажмите кнопку «Get Started For Free» для создания новой учётной записи. Эта учётная запись связана с аккаунтом Mathworks. Если у вас уже есть аккаунт Mathworks, войдите с его помощью.
Создание нового канала
После подготовки учётной записи войдите, откройте вкладку «Channels» и выберите «My Channels».
Нажмите кнопку «New Channel» для создания нового канала.
Введите имя для вашего канала и добавьте описание. В этом примере мы будем публиковать только температуру. Если вы хотите публиковать несколько показаний (например, влажность и давление), вы можете включить дополнительные поля, как будет показано далее в этом руководстве.
Нажмите кнопку Save Channel, чтобы создать и сохранить канал.
Настройка графика
График можно настроить. Перейдите на вкладку Private View и нажмите на иконку редактирования.
Вы можете задать заголовок графика, настроить цвет фона, оси X и Y, и многое другое.
Когда закончите, нажмите кнопку «Save».
API-ключ
Для отправки значений с ESP32 на ThingSpeak вам нужен Write API Key. Откройте вкладку «API Keys» и скопируйте Write API Key в безопасное место, он понадобится через некоторое время.
ESP32: публикация показаний на ThingSpeak — код
Скопируйте следующий код в Arduino IDE (или в файл main.cpp, если вы используете PlatformIO).
/*
Adapted from WriteSingleField Example from ThingSpeak Library (Mathworks)
Rui Santos & Sara Santos - Random Nerd Tutorials
Complete project details at https://RandomNerdTutorials.com/esp32-thingspeak-publish-arduino/
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
#include <WiFi.h>
#include "ThingSpeak.h"
#include <Adafruit_BME280.h>
#include <Adafruit_Sensor.h>
const char* ssid = "REPLACE_WITH_YOUR_SSID"; // your network SSID (name)
const char* password = "REPLACE_WITH_YOUR_PASSWORD"; // your network password
WiFiClient client;
unsigned long myChannelNumber = X;
const char * myWriteAPIKey = "XXXXXXXXXXXXXXXX";
// Timer variables
unsigned long lastTime = 0;
unsigned long timerDelay = 30000;
// Variable to hold temperature readings
float temperatureC;
//uncomment if you want to get temperature in Fahrenheit
//float temperatureF;
// Create a sensor object
Adafruit_BME280 bme; //BME280 connect to ESP32 I2C (GPIO 21 = SDA, GPIO 22 = SCL)
void initBME(){
if (!bme.begin(0x76)) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
}
}
void setup() {
Serial.begin(115200); //Initialize serial
initBME();
WiFi.mode(WIFI_STA);
ThingSpeak.begin(client); // Initialize ThingSpeak
}
void loop() {
if ((millis() - lastTime) > timerDelay) {
// Connect or reconnect to WiFi
if(WiFi.status() != WL_CONNECTED){
Serial.print("Attempting to connect");
while(WiFi.status() != WL_CONNECTED){
WiFi.begin(ssid, password);
delay(5000);
}
Serial.println("\nConnected.");
}
// Get a new temperature reading
temperatureC = bme.readTemperature();
Serial.print("Temperature (ºC): ");
Serial.println(temperatureC);
//uncomment if you want to get temperature in Fahrenheit
/*temperatureF = 1.8 * bme.readTemperature() + 32;
Serial.print("Temperature (ºF): ");
Serial.println(temperatureF);*/
// Write to ThingSpeak. There are up to 8 fields in a channel, allowing you to store up to 8 different
// pieces of information in a channel. Here, we write to field 1.
int x = ThingSpeak.writeField(myChannelNumber, 1, temperatureC, myWriteAPIKey);
//uncomment if you want to get temperature in Fahrenheit
//int x = ThingSpeak.writeField(myChannelNumber, 1, temperatureF, myWriteAPIKey);
if(x == 200){
Serial.println("Channel update successful.");
}
else{
Serial.println("Problem updating channel. HTTP error code " + String(x));
}
lastTime = millis();
}
}
Чтобы код заработал, вам нужно вставить учётные данные вашей сети в следующие переменные:
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
Вам нужно указать номер канала, в который вы публикуете данные. Если у вас создан только один канал в ThingSpeak, номер канала — 1. В противном случае вы можете увидеть номер канала на вкладке Private View.
unsigned long myChannelNumber = 1;
Наконец, вам нужно вставить Write API Key, полученный на предыдущих шагах:
const char * myWriteAPIKey = "XXXXXXXXXXXXXXXX";
Как работает код
Сначала нужно подключить необходимые библиотеки.
#include <WiFi.h>
#include "ThingSpeak.h"
#include <Adafruit_BME280.h>
#include <Adafruit_Sensor.h>
Вставьте учётные данные вашей сети в следующие переменные:
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
Создайте Wi-Fi клиент для подключения к ThingSpeak.
WiFiClient client;
Укажите номер вашего канала и Write API Key:
unsigned long myChannelNumber = 1;
const char * myWriteAPIKey = "XXXXXXXXXXXXXXXX";
В переменной timerDelay укажите, как часто вы хотите публиковать показания. В данном случае мы публикуем показания каждые 30 секунд (30000 миллисекунд). Вы можете изменить это время задержки.
unsigned long lastTime = 0;
unsigned long timerDelay = 30000;
Переменная temperatureC хранит значение температуры в градусах Цельсия.
float temperatureC;
Если вы хотите получить температуру в градусах Фаренгейта, раскомментируйте следующую строку.
//float temperatureF;
Создайте объект Adafruit_BME280 с именем bme на стандартных выводах ESP32.
Adafruit_BME280 bme; //BME280 connect to ESP32 I2C (GPIO 21 = SDA, GPIO 22 = SCL)
Функция initBME() инициализирует датчик BME280.
void initBME(){
if (!bme.begin(0x76)) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
}
}
В setup() инициализируйте Serial Monitor:
Serial.begin(115200); //Initialize serial
Инициализируйте датчик BME280.
initBME();
Установите ESP32 в режим Wi-Fi станции:
WiFi.mode(WIFI_STA);
Инициализируйте ThingSpeak:
ThingSpeak.begin(client); // Initialize ThingSpeak
В loop() подключитесь или переподключитесь к Wi-Fi в случае потери соединения:
// Connect or reconnect to WiFi
if(WiFi.status() != WL_CONNECTED){
Serial.print("Attempting to connect");
while(WiFi.status() != WL_CONNECTED){
WiFi.begin(ssid, password);
delay(5000);
}
Serial.println("\nConnected.");
}
Получите новое показание температуры и выведите его в Serial Monitor:
temperatureC = bme.readTemperature();
Раскомментируйте следующие строки, если хотите получить температуру в градусах Фаренгейта.
/*temperatureF = 1.8 * bme.readTemperature() + 32;
Serial.print("Temperature (ºC): ");
Serial.println(temperatureF);*/
Наконец, запишите данные в ThingSpeak. Вы можете использовать метод writeField(), который принимает следующие аргументы:
номер канала;
номер поля (в нашем случае у нас только одно поле);
значение, которое вы хотите опубликовать (temperatureC или temperatureF);
ваш Write API Key.
Эта функция возвращает код 200, если публикация показаний прошла успешно.
int x = ThingSpeak.writeField(myChannelNumber, 1, temperatureC, myWriteAPIKey);
if(x == 200){
Serial.println("Channel update successful.");
}
else{
Serial.println("Problem updating channel. HTTP error code " + String(x));
}
Если вы хотите публиковать показания в градусах Фаренгейта, раскомментируйте следующую строку в коде:
//int x = ThingSpeak.writeField(myChannelNumber, 1, temperatureF, myWriteAPIKey);
Демонстрация
После ввода учётных данных сети, номера канала и API-ключа загрузите код на плату.
Откройте Serial Monitor с бодрейтом 115200 и нажмите встроенную кнопку RST. Через 30 секунд плата должна подключиться к Wi-Fi и начать публикацию показаний на ThingSpeak.
Перейдите в свою учётную запись ThingSpeak к только что созданному каналу, и вы увидите, что показания температуры публикуются и отображаются на графике.
Теперь вы можете получить доступ к этим показаниям из любой точки мира, войдя в свою учётную запись ThingSpeak.
Отправка нескольких полей (температура, влажность и давление)
В этом разделе вы узнаете, как отправлять данные в несколько полей — то есть отправлять более одного значения за раз — мы будем отправлять показания температуры, влажности и давления.
Включение нескольких полей — ThingSpeak
Сначала нужно создать дополнительные поля в вашей учётной записи ThingSpeak. Это просто. Перейдите в Channel Settings и добавьте столько полей, сколько вам нужно. В данном случае мы добавили ещё два поля: одно для влажности, другое для давления.
Наконец, сохраните канал — нажмите кнопку Save Channel.
Теперь, если вы перейдёте на вкладку Private View, вы увидите три графика. Отредактируйте вновь созданные графики, добавив заголовок и подписи осей.
ESP32: запись нескольких полей в ThingSpeak — код
Следующий код отправляет несколько полей в ThingSpeak (температуру, влажность и давление с датчика BME280).
/*
Adapted from Example from ThingSpeak Library (Mathworks)
Rui Santos & Sara Santos - Random Nerd Tutorials
Complete project details at https://RandomNerdTutorials.com/esp32-thingspeak-publish-arduino/
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
#include <WiFi.h>
#include "ThingSpeak.h"
#include <Adafruit_BME280.h>
#include <Adafruit_Sensor.h>
const char* ssid = "REPLACE_WITH_YOUR_SSID"; // your network SSID (name)
const char* password = "REPLACE_WITH_YOUR_PASSWORD"; // your network password
WiFiClient client;
unsigned long myChannelNumber = X;
const char * myWriteAPIKey = "XXXXXXXXXXXXXXXX";
// Timer variables
unsigned long lastTime = 0;
unsigned long timerDelay = 30000;
// Variable to hold temperature readings
float temperatureC;
float humidity;
float pressure;
//uncomment if you want to get temperature in Fahrenheit
//float temperatureF;
// Create a sensor object
Adafruit_BME280 bme; //BME280 connect to ESP32 I2C (GPIO 21 = SDA, GPIO 22 = SCL)
void initBME(){
if (!bme.begin(0x76)) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
}
}
void setup() {
Serial.begin(115200); //Initialize serial
initBME();
WiFi.mode(WIFI_STA);
ThingSpeak.begin(client); // Initialize ThingSpeak
}
void loop() {
if ((millis() - lastTime) > timerDelay) {
// Connect or reconnect to WiFi
if(WiFi.status() != WL_CONNECTED){
Serial.print("Attempting to connect");
while(WiFi.status() != WL_CONNECTED){
WiFi.begin(ssid, password);
delay(5000);
}
Serial.println("\nConnected.");
}
// Get a new temperature reading
temperatureC = bme.readTemperature();
Serial.print("Temperature (ºC): ");
Serial.println(temperatureC);
humidity = bme.readHumidity();
Serial.print("Humidity (%): ");
Serial.println(humidity);
pressure = bme.readPressure() / 100.0F;
Serial.print("Pressure (hPa): ");
Serial.println(pressure);
//uncomment if you want to get temperature in Fahrenheit
/*temperatureF = 1.8 * bme.readTemperature() + 32;
Serial.print("Temperature (ºF): ");
Serial.println(temperatureF);*/
// set the fields with the values
ThingSpeak.setField(1, temperatureC);
//ThingSpeak.setField(1, temperatureF);
ThingSpeak.setField(2, humidity);
ThingSpeak.setField(3, pressure);
// Write to ThingSpeak. There are up to 8 fields in a channel, allowing you to store up to 8 different
// pieces of information in a channel. Here, we write to field 1.
int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
if(x == 200){
Serial.println("Channel update successful.");
}
else{
Serial.println("Problem updating channel. HTTP error code " + String(x));
}
lastTime = millis();
}
}
Этот код очень похож на предыдущий, но отправляет данные в несколько полей. Рассмотрим основные отличия.
Сначала создайте переменные для хранения показаний датчиков:
float temperatureC;
float humidity;
float pressure;
В loop() получите новые показания температуры, влажности и давления:
// Get a new temperature reading
temperatureC = bme.readTemperature();
Serial.print("Temperature (ºC): ");
Serial.println(temperatureC);
humidity = bme.readHumidity();
Serial.print("Humidity (%): ");
Serial.println(humidity);
pressure = bme.readPressure() / 100.0F;
Serial.print("Pressure (hPa): ");
Serial.println(pressure);
Вам нужно присвоить значение каждому полю. Если вы создали поля, как мы, первое поле соответствует температуре, второе — влажности, третье — давлению. Следующие строки присваивают соответствующие значения каждому полю с помощью метода setField() — он принимает в качестве аргументов номер поля и значение:
// set the fields with the values
ThingSpeak.setField(1, temperatureC);
//ThingSpeak.setField(1, temperatureC);
ThingSpeak.setField(2, humidity);
ThingSpeak.setField(3, pressure);
Наконец, используйте метод writeFields() и передайте в качестве аргументов номер канала и Write API Key:
int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
Демонстрация
Загрузите предыдущий код на плату — не забудьте вставить учётные данные сети, Write API Key и номер канала. После загрузки плата должна успешно подключиться и начать отправку данных:
Если вы перейдёте в свою учётную запись ThingSpeak, в разделе Private View вы увидите три графика с показаниями датчиков.
Заключение
В этом руководстве вы узнали, как публиковать показания датчика BME280 на ThingSpeak с помощью ESP32 и библиотеки thingspeak-arduino. Вы можете изменить примеры для отправки показаний с любых других датчиков или данных из любого другого источника. У нас есть руководства для самых популярных датчиков:
ESP32 with DHT11/DHT22 Temperature and Humidity Sensor using Arduino IDE
ESP32: BME680 Environmental Sensor using Arduino IDE (Gas, Pressure, Humidity, Temperature)
ESP32 DS18B20 Temperature Sensor with Arduino IDE (Single, Multiple, Web Server)
Вы можете визуализировать показания датчиков из любой точки мира, войдя в свою учётную запись ThingSpeak.
Библиотека, использованная в этом руководстве, предоставляет множество примеров, которые могут быть полезны — ознакомьтесь с примерами здесь или в Arduino IDE перейдите в File > Examples > ThingSpeak, и вы найдёте несколько примеров.
Надеемся, это руководство было полезным. Узнайте больше о ESP32 из наших ресурсов:
Примечание
Источник: ESP32 Publish Sensor Readings to ThingSpeak (easiest way) — Random Nerd Tutorials