ESP32: публикация показаний датчиков на ThingSpeak (самый простой способ)

В этом руководстве вы узнаете, как отправлять показания датчиков с ESP32 на ThingSpeak. Для демонстрации мы будем использовать датчик BME280, но вы можете легко изменить примеры для использования любого другого датчика. Плата ESP32 будет программироваться с использованием ядра Arduino.

ESP32 публикация показаний датчиков на ThingSpeak самый простой способ 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.

Установка библиотеки ThingSpeak в Arduino IDE

Установка библиотек 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 к BME280

Рекомендуемое чтение: ESP32 Pinout Reference: Which GPIO pins should you use?

ThingSpeak — начало работы

Перейдите на ThingSpeak и нажмите кнопку «Get Started For Free» для создания новой учётной записи. Эта учётная запись связана с аккаунтом Mathworks. Если у вас уже есть аккаунт Mathworks, войдите с его помощью.

Создание нового канала

После подготовки учётной записи войдите, откройте вкладку «Channels» и выберите «My Channels».

ThingSpeak начало работы — вкладка My Channels

Нажмите кнопку «New Channel» для создания нового канала.

ESP32 ESP8266 NodeMCU ThingSpeak создание нового канала

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

Настройки нового канала ThingSpeak

Нажмите кнопку Save Channel, чтобы создать и сохранить канал.

ThingSpeak сохранение нового канала

Настройка графика

График можно настроить. Перейдите на вкладку Private View и нажмите на иконку редактирования.

Настройка графика ThingSpeak Private View

Вы можете задать заголовок графика, настроить цвет фона, оси X и Y, и многое другое.

Параметры поля ThingSpeak field 1 — настройки графика

Когда закончите, нажмите кнопку «Save».

API-ключ

Для отправки значений с ESP32 на ThingSpeak вам нужен Write API Key. Откройте вкладку «API Keys» и скопируйте Write API Key в безопасное место, он понадобится через некоторое время.

Thingspeak 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 ESP32 Serial Monitor

Перейдите в свою учётную запись ThingSpeak к только что созданному каналу, и вы увидите, что показания температуры публикуются и отображаются на графике.

График ThingSpeak с показаниями BME280 ESP32

Теперь вы можете получить доступ к этим показаниям из любой точки мира, войдя в свою учётную запись ThingSpeak.

Отправка нескольких полей (температура, влажность и давление)

В этом разделе вы узнаете, как отправлять данные в несколько полей — то есть отправлять более одного значения за раз — мы будем отправлять показания температуры, влажности и давления.

Включение нескольких полей — ThingSpeak

Сначала нужно создать дополнительные поля в вашей учётной записи ThingSpeak. Это просто. Перейдите в Channel Settings и добавьте столько полей, сколько вам нужно. В данном случае мы добавили ещё два поля: одно для влажности, другое для давления.

ThingSpeak добавление новых полей в настройках канала

Наконец, сохраните канал — нажмите кнопку Save Channel.

ThingSpeak сохранение канала

Теперь, если вы перейдёте на вкладку 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 и номер канала. После загрузки плата должна успешно подключиться и начать отправку данных:

ESP32 запись нескольких полей ThingSpeak Serial Monitor

Если вы перейдёте в свою учётную запись ThingSpeak, в разделе Private View вы увидите три графика с показаниями датчиков.

ESP32 публикация показаний датчиков на ThingSpeak — температура влажность давление

Заключение

В этом руководстве вы узнали, как публиковать показания датчика BME280 на ThingSpeak с помощью ESP32 и библиотеки thingspeak-arduino. Вы можете изменить примеры для отправки показаний с любых других датчиков или данных из любого другого источника. У нас есть руководства для самых популярных датчиков:

Вы можете визуализировать показания датчиков из любой точки мира, войдя в свою учётную запись ThingSpeak.

Библиотека, использованная в этом руководстве, предоставляет множество примеров, которые могут быть полезны — ознакомьтесь с примерами здесь или в Arduino IDE перейдите в File > Examples > ThingSpeak, и вы найдёте несколько примеров.

Надеемся, это руководство было полезным. Узнайте больше о ESP32 из наших ресурсов:

Примечание

Источник: ESP32 Publish Sensor Readings to ThingSpeak (easiest way) — Random Nerd Tutorials