ESP8266 NodeMCU: публикация показаний датчиков в ThingSpeak (самый простой способ)
В этом руководстве вы узнаете, как отправлять показания датчиков с платы ESP8266 NodeMCU в ThingSpeak. Для демонстрации мы будем использовать датчик BME280, но вы можете легко модифицировать примеры для использования любого другого датчика. Плата ESP8266 будет программироваться с использованием ядра Arduino.
ThingSpeak позволяет публиковать показания ваших датчиков на своём веб-сайте и отображать их на графиках с метками времени. Затем вы можете получить доступ к вашим данным из любой точки мира.
У нас есть аналогичное руководство для платы ESP32: ESP32: публикация показаний датчиков в ThingSpeak (самый простой способ)
Обзор проекта
Существует множество способов отправки показаний датчиков в ThingSpeak. В этом руководстве мы будем использовать один из самых простых способов — с помощью библиотеки thingspeak-arduino. Эта библиотека предоставляет методы для простой публикации показаний датчиков в одно или несколько полей. Вы можете ознакомиться с примерами библиотеки на её странице GitHub.
Для примера мы будем использовать датчик BME280, но вы можете использовать любой другой датчик (вам нужно будет модифицировать код).
Примечание
Рекомендуемое чтение: ESP8266 с датчиком BME280 используя Arduino IDE (давление, температура, влажность).
Мы рассмотрим, как публиковать в одно поле и как публиковать в несколько полей.
Подготовка Arduino IDE
Для этого руководства мы будем программировать ESP8266 с использованием ядра Arduino. Поэтому убедитесь, что дополнение ESP8266 установлено в вашей Arduino IDE:
Если вы хотите программировать ESP8266 с использованием VS Code с расширением PlatformIO, следуйте этому руководству:
Установка библиотеки ThingSpeak
Для отправки показаний датчиков в ThingSpeak мы будем использовать библиотеку thingspeak-arduino. Вы можете установить эту библиотеку через менеджер библиотек Arduino. Перейдите в Sketch > Include Library > Manage Libraries… и найдите «ThingSpeak» в менеджере библиотек. Установите библиотеку ThingSpeak от MathWorks.
Установка библиотек 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: какие GPIO выводы следует использовать?
ThingSpeak – начало работы
Перейдите на ThingSpeak и нажмите кнопку «Get Started For Free», чтобы создать новый аккаунт. Этот аккаунт связан с аккаунтом Mathworks. Поэтому, если у вас уже есть аккаунт Mathworks, вам следует войти с этим аккаунтом.
Создание нового канала
После того как ваш аккаунт будет готов, войдите в систему, откройте вкладку «Channels» и выберите «My Channels».
Нажмите кнопку «New Channel», чтобы создать новый канал.
Введите имя для вашего канала и добавьте описание. В этом примере мы будем публиковать только температуру. Если вы хотите публиковать несколько показаний (например, влажность и давление), вы можете включить больше полей.
Нажмите кнопку Save Channel, чтобы создать и сохранить ваш канал.
Настройка графика
График можно настроить. Перейдите на вкладку Private View и нажмите на значок редактирования.
Вы можете дать заголовок вашему графику, настроить цвет фона, оси x и y, и многое другое.
Когда закончите, нажмите кнопку «Save».
API-ключ
Для отправки значений с ESP8266 в ThingSpeak вам нужен Write API Key (ключ API для записи). Откройте вкладку «API Keys» и скопируйте 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 к каналу, который вы только что создали, и вы увидите показания температуры, публикуемые и отображаемые на графике.
Теперь вы можете получить доступ к этим показаниям из любой точки мира, войдя в свой аккаунт ThingSpeak.
Отправка нескольких полей (температура, влажность и давление)
В этом разделе вы узнаете, как отправлять несколько полей — то есть отправлять более одного значения за раз — мы будем отправлять показания температуры, влажности и давления.
Включение нескольких полей – ThingSpeak
Сначала вам нужно создать больше полей в вашем аккаунте ThingSpeak. Это просто. Вам нужно перейти в Channel Settings и добавить столько полей, сколько хотите. В данном случае мы добавили ещё два поля: одно для влажности и другое для давления.
Наконец, сохраните канал — нажмите кнопку Save Channel.
Теперь, если вы перейдёте на вкладку 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 и номер канала. После загрузки он должен успешно подключиться и отправить показания:
Если вы перейдёте в свой аккаунт ThingSpeak на вкладку Private View, вы увидите три графика с показаниями датчиков.
Заключение
В этом руководстве вы узнали, как публиковать показания датчика BME280 в ThingSpeak, используя ESP8266 и библиотеку arduino-thingspeak. Вы можете изменить примеры для отправки показаний любого другого датчика или данных из любого другого источника. У нас есть руководства для самых популярных датчиков:
ESP8266 DHT11/DHT22 веб-сервер температуры и влажности с Arduino IDE
ESP8266 с BME280 используя Arduino IDE (давление, температура, влажность)
ESP8266 датчик температуры DS18B20 с Arduino IDE (одиночный, множественный, веб-сервер)
Вы можете визуализировать показания датчиков из любого места, войдя в свой аккаунт ThingSpeak.
Библиотека, используемая в этом руководстве, предоставляет несколько примеров, которые могут быть полезны — ознакомьтесь с примерами здесь или в вашей Arduino IDE перейдите в File > Examples > ThingSpeak, и вы найдёте несколько примеров.
Узнайте больше о ESP8266 из наших ресурсов:
Спасибо за чтение.