алгоритм актуален на 24.04.2024, операционная система Mac OS.
Как программировать модуль ESP8266 для управления встроенным на плате светодиодом, а также удаленный доступ к нему, мы проходили в предыдущем блоке.
Данная инструкция продвинет нас несколько дальше, где мы реализуем возможность создания домашней метеостанции на базе микроконтроллера ESP8266 и подключенного к нему датчика температуры, влажности и давления. Для подключения нам понадобится опыт с предыдущей статьи, датчик BME280, соединительные провода для подключения к ногам модуля и датчика.
Вид датчика:
Подключение* | Плата ESP8266 | Датчик BME280 |
---|---|---|
питание | G | GND |
питание | 3V | VCC |
управление | D1 | SCL |
управление | D2 | SDA |
Устройства подключены, теперь для корректной работы sketch необходимо установить библиотеку Adafruit BME280 Library:
Также для работы с датчиком BME280 необходимо узнать его адрес, так как он работает по I2C шине, которая позволяет подключать на нее множество различных датчиков, но с разными адресами.
Ниже предоставлен скетч для поиска подключенных датчиков к шине I2C на контактах D1
и D2
.
Копируем, вставляем, загружаем в компилятор следующий код:
#include <Wire.h>
void setup(){
Wire.begin(D2,D1);
Serial.begin(115200);
while (!Serial);
Serial.println("\nI2C Scanner");
}
void loop(){
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 8; address < 127; address++ ){
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0){
Serial.print("I2C device found at address 0x");
if (address<16)
Serial.print("0");
Serial.print(address,HEX);
Serial.println(" !");
nDevices++;
}
else if (error==4) {
Serial.print("Unknow error at address 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");
delay(5000);
}
Открываем «монитор порта» (Serial monitor), где при правильном подключении должен появиться адрес датчика, который подключен к модулю ESP8266:
0x76
. Так как мы подключили только один датчик к шине I2C значит адрес BME280 = 0x76
.
Если в «монитор порта» нет данных, то соответственно подключение некорректно, нужно искать причину.
Из возможных неполадок:
После того как адрес устройства найден и библиотеки установлены,
можем зайти в file -> examples -> adafruit BME280 Library -> bme280test
и установить скетч для модуля BME280.
Serial.begin(9600);
и меняем скорость последовательной связи с 9600 на 115200 baud, а также в status = bme.begin();
передаем адрес, который мы получили с предыдущего скетча-сканера. Теперь он должен выглядеть так: status = bme.begin(0x76);
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.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
unsigned long delayTime;
void setup() {
Serial.begin(115200);
while(!Serial); // time to get serial running
Serial.println(F("BME280 test"));
unsigned status;
// default settings
status = bme.begin(0x76);
// You can also pass in a Wire library object like &Wire2
// status = bme.begin(0x76, &Wire2)
if (!status) {
Serial.println("Could not find a valid BME280 sensor, check wiring, address, sensor ID!");
Serial.print("SensorID was: 0x"); Serial.println(bme.sensorID(),16);
Serial.print(" ID of 0xFF probably means a bad address, a BMP 180 or BMP 085\n");
Serial.print(" ID of 0x56-0x58 represents a BMP 280,\n");
Serial.print(" ID of 0x60 represents a BME 280.\n");
Serial.print(" ID of 0x61 represents a BME 680.\n");
while (1) delay(10);
}
Serial.println("-- Default Test --");
delayTime = 1000;
Serial.println();
}
void loop() {
printValues();
delay(delayTime);
}
void printValues() {
Serial.print("Temperature = ");
Serial.print(bme.readTemperature());
Serial.println(" °C");
Serial.print("Pressure = ");
Serial.print(bme.readPressure() / 100.0F);
Serial.println(" hPa");
Serial.print("Approx. Altitude = ");
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
Serial.println(" m");
Serial.print("Humidity = ");
Serial.print(bme.readHumidity());
Serial.println(" %");
Serial.println();
}
после чего прошиваем плату нажатием upload, открываем монитор порта, где видим показатели температуры, влажности, давления и приблизительной высоты.
В следующем разделе мы рассмотрим возможности сайта VizIoT. Зачем нам это нужно? В предыдущей статье мы подключили датчик BME280 и видели показания температуры, влажности и атмосферного давления в консоли. Однако такой способ отображения информации неудобен и не практичен. Чтобы было удобнее просматривать и анализировать данные нашей метеостанции, мы воспользуемся сервисом VizIoT. Используя VizIoT, мы получаем:
Эта платформа не только удовлетворяет домашние потребности, но также может быть полезным инструментом для бизнеса или других процессов. Она может использоваться для отображения и обработки данные о:
Вы можете отслеживать данные с помощью созданных вами панелей, анализировать информацию за любой период и управлять доступом к данным. Раздел диагностики позволяет анализировать все параметры, переданные приборами за определенный период времени.
Система поддерживает подключение множества устройств через протоколы MQTT и HTTP. В будущем планируется расширение возможностей VizIoT, включая добавление поддержки протокола LoRaWAN и создание новых виджетов, таких как: погода, манипуляторы (кнопки переключатели, слайдеры) и аудио/видео плеер. Также будет добавлен функционал обработки географических данных, например, отображение GPS точек сбора данных и треков передвижения датчиков.
Как подключить датчик BME280 к ESP8266 мы проходили выше, теперь перейдем к следующему этапу, где подключенный датчик будет передавать показатели температуры и влажности на удаленный сервер, с которого выведем параметры на экран. Для этого нам понадобится зайти на сайт app.VizIoT.com, зарегистрироваться или войти в сваю учетную запись. На странице «Устройства» создаем новое устройство с названием ESP8266+BME280 (название опциональное), после чего получаем ключ доступа и пароль к этому устройству.
Полученные данные (ключ и пароль) будем использовать в следующем скетче, который можно скопировать и вставить в Arduino IDE:
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
// Настройки WiFi
const char* ssid = "YOUR_WIFI_SSID"; // Замените на название вашей WiFi сети
const char* password = "YOUR_WIFI_PASSWORD"; // Замените на пароль вашей WiFi сети
//Ключ и пароль доступа VizIoT Устройства (можно узнать в настройках устройства)
const String VizIoT_Device_key = "YOUR_VIZIOT_DEVICE_KEY"; //Заменить на ключ вашего VizIoT устройства
const String VizIoT_Device_pass = "YOUR_VIZIOT_DEVICE_PASS"; //Заменить на пароль вашего VizIoT устройства
// Параметры для отправки данных на VizIoT.com
const String serverURL = "http://VizIoT.com/update";
// Инициализация датчика BME280
Adafruit_BME280 bme;
WiFiClient wifiClient;
HTTPClient http;
void setup() {
Serial.begin(115200);
Serial.println("Запуск ESP8266...");
// Инициализация датчика BME280
Wire.begin();
if (!bme.begin(0x76)) {
Serial.println("Датчик BME280 не найден!");
} else {
Serial.println("Датчик BME280 подключен");
}
// Подключение к WiFi
WiFi.begin(ssid, password);
Serial.print("Подключение к WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi подключен!");
}
void loop() {
// Чтение данных с датчика BME280
float temperature = bme.readTemperature();
float humidity = bme.readHumidity();
// Вывод данных в монитор порта
Serial.print("Температура: ");
Serial.print(temperature);
Serial.print("°C, Влажность: ");
Serial.print(humidity);
Serial.println("%");
// Формирование URL для отправки данных
String url = serverURL + "?key=" + VizIoT_Device_key + "&pass=" + VizIoT_Device_pass + "&temp=" + String(temperature, 2) + "&hum=" + String(humidity, 2);
// Отправка данных
http.begin(wifiClient, url);
int httpCode = http.GET();
if (httpCode > 0) {
String response = http.getString();
if (response == "OK") {
Serial.println("Данные успешно отправлены");
} else {
Serial.println("Во время отправки данных возникла ошибка");
Serial.println("Ответ сервера: " + response);
}
} else {
Serial.println("Во время отправки данных возникла ошибка");
Serial.println("Код ошибки: " + String(httpCode));
}
http.end();
delay(20000); // Отправка каждые 20 секунд
}
После установки скетча на модуль ESP8266, в консоли (монитор порта) должна появиться следующая информация:
Следующим шагом на сайте VizIoT, открываем страницу "Панели" и создаем панель с названием "Погодная станция":
В созданной панели добавляем виджеты. Нажмем на кнопку "Добавить виджет", затем нажмем "Создать виджет".
У виджета может быть множество параметров, в данном случае нам нужен только один параметр, а именно значение параметра temp от устройства ESP8266+BME280.
По умолчанию наша панель уже выбрана просто надо нажать кнопку "Сохранить".