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

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

ESP8266 NodeMCU: публикация показаний датчиков в ThingSpeak самый простой способ Arduino IDE Core

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

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

Обзор проекта

Существует множество способов отправки показаний датчиков в ThingSpeak. В этом руководстве мы будем использовать один из самых простых способов — с помощью библиотеки thingspeak-arduino. Эта библиотека предоставляет методы для простой публикации показаний датчиков в одно или несколько полей. Вы можете ознакомиться с примерами библиотеки на её странице GitHub.

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

Мы рассмотрим, как публиковать в одно поле и как публиковать в несколько полей.

Подготовка Arduino IDE

Для этого руководства мы будем программировать ESP8266 с использованием ядра Arduino. Поэтому убедитесь, что дополнение ESP8266 установлено в вашей Arduino IDE:

Если вы хотите программировать ESP8266 с использованием VS Code с расширением PlatformIO, следуйте этому руководству:

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

Для отправки показаний датчиков в ThingSpeak мы будем использовать библиотеку thingspeak-arduino. Вы можете установить эту библиотеку через менеджер библиотек Arduino. Перейдите в Sketch > Include Library > Manage Libraries… и найдите «ThingSpeak» в менеджере библиотек. Установите библиотеку ThingSpeak от MathWorks.

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

Установка библиотек BME280

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

Вы можете установить библиотеки через менеджер библиотек Arduino. Перейдите в 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 к вашему ESP8266.

Необходимые компоненты

Для выполнения этого руководства вам понадобятся следующие компоненты:

Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

Схема подключения

Мы будем использовать связь I2C с модулем датчика BME280. Для этого подключите датчик к стандартным выводам ESP8266 SCL (GPIO 5) и SDA (GPIO 4), как показано на следующей схеме.

ESP8266 NodeMCU BME280 схема подключения температура влажность давление

Рекомендуемое чтение: Справочник по выводам ESP8266: какие GPIO выводы следует использовать?

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

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

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

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

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

Нажмите кнопку «New Channel», чтобы создать новый канал.

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

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

ThingSpeak редактирование и добавление нового канала настройки конфигурация

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

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

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

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

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

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

ThingSpeak параметры графика field 1 настройки сохранение

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

API-ключ

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

ThingSpeak Write API Key генерация нового ключа

ESP8266: публикация показаний датчиков в 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/esp8266-nodemcu-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 <ESP8266WiFi.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 ESP8266 I2C (GPIO 4 = SDA, GPIO 5 = 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 <ESP8266WiFi.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 на стандартных выводах ESP8266.

Adafruit_BME280 bme; //BME280 connect to ESP8266 I2C (GPIO 4 = SDA, GPIO 5 = SCL)

Функция initBME() инициализирует датчик BME280.

void initBME(){
  if (!bme.begin(0x76)) {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }
}

В setup() инициализируйте монитор последовательного порта:

Serial.begin(115200);  //Initialize serial

Инициализируйте датчик BME280.

initBME();

Установите ESP8266 в режим 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.");
}

Получите новое показание температуры и выведите его в монитор последовательного порта:

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-ключа, загрузите код на вашу плату.

Откройте монитор последовательного порта на скорости 115200 бод и нажмите встроенную кнопку RST. Через 30 секунд он должен подключиться к Wi-Fi и начать публикацию показаний в ThingSpeak.

Публикация показаний температуры в ThingSpeak ESP8266 NodeMCU монитор последовательного порта

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

ThingSpeak график показаний BME280 ESP8266 NodeMCU

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

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

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

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

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

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

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

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

Теперь, если вы перейдёте на вкладку Private View, вы должны увидеть три графика. Отредактируйте вновь созданные графики, добавив заголовок и подписи осей.

ESP8266: запись нескольких полей в ThingSpeak – код

Следующий код отправляет несколько полей в ThingSpeak (температуру, влажность и давление от датчика BME280).

/*
  Adapted from WriteSingleField Example from ThingSpeak Library (Mathworks)
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete project details at https://RandomNerdTutorials.com/esp8266-nodemcu-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 <ESP8266WiFi.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;
String myStatus = "";

// Create a sensor object
Adafruit_BME280 bme; //BME280 connect to ESP8266 I2C (GPIO 4 = SDA, GPIO 5 = 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 и номер канала. После загрузки он должен успешно подключиться и отправить показания:

ESP8266 NodeMCU запись нескольких полей ThingSpeak монитор последовательного порта

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

ESP8266 NodeMCU публикация отправка показаний датчиков в ThingSpeak демонстрация самый простой способ

Заключение

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

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

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

Узнайте больше о ESP8266 из наших ресурсов:

Спасибо за чтение.