Это запись о том, как я получил температуру, влажность и давление с BME280 и отправил их напрямую в Graphite через WiFi-соединение ESP32.
Я не буду объяснять Graphite или Grafana.
Что использовалось в этот раз
Название товара | Место покупки |
---|---|
ESP-32S | AliExpress Amazon 楽天 |
BME280 | AliExpress Amazon 楽天 |
Схема подключения
BME280 подключается к ESP-32S по I2C.
На ESP-32S GPIO21 является SDA, а GPIO22 является SCL.
ESP-32S | BME280 |
---|---|
3.3V | VIN |
GND | GND |
GPIO21 | SDA |
GPIO22 | SCL |
Содержание
- Подключение к WiFi
- Запрос к NTP-серверу для получения времени
- Создание таймера для отправки данных каждые 1 секунду
Код
#include <Arduino.h>
#include <WiFi.h>
#include <Wire.h>
#include <Adafruit_BME280.h>
#include <Ticker.h>
#include <WiFiUdp.h>
#include <time.h>
// Wifi
const char SSID[] = "";
const char PASSWORD[] = "";
// NTP Server
const char NTP_SERVER[] = "ntp.nict.jp";
// Graphite
IPAddress graphite(192,168,0,10);
// Tricker
Ticker ticker;
bool flagTicker = false;
// Датчик BME280
Adafruit_BME280 bme;
void setTicker() {
flagTicker = true;
}
// UDP
WiFiUDP udp;
void setup() {
Serial.begin(115200);
while (!Serial);
if (!bme.begin(0x76)) {
Serial.println("Ошибка датчика BME280!");
while (1);
}
// Подключение к WiFi
WiFi.begin(SSID, PASSWORD);
Serial.print("Подключение к WiFi");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(100);
}
IPAddress ipaddr, gateway;
ipaddr = WiFi.localIP();
gateway = WiFi.gatewayIP();
Serial.println("WiFi подключено.");
Serial.print("IPAddr:");
Serial.println(ipaddr);
Serial.print("Шлюз:");
Serial.println(gateway);
// NTP
configTime(9 * 3600L, 0, NTP_SERVER);
// мс
struct timeval tv;
int ms = 0;
while(1) {
if (gettimeofday(&tv, NULL) != 0) {
Serial.println("Ошибка gettimeofday.");
}else{
ms = tv.tv_usec / 1000LL;
}
if(ms == 0) {
ticker.attach_ms(1000, setTicker);
Serial.println("Установлено тактирование");
break;
}
}
}
void send() {
time_t now;
time(&now);
udp.beginPacket(graphite, 2003);
udp.println("sec.esp32.temperature " + String(bme.readTemperature()) + " " + now);
udp.println("sec.esp32.humidity " + String(bme.readHumidity()) + " " + now);
udp.println("sec.esp32.pressure " + String(bme.readPressure() / 100) + " " + now);
udp.endPacket();
}
void loop() {
if(flagTicker) {
send();
flagTicker = false;
}
}
Используемые библиотеки
Создание графиков в Grafana
С помощью ESP32 были получены данные с датчика BME280 и накоплены в Graphite (go-carbon) через WiFi, после чего они были
визуализированы в Grafana.
Данные добавляются каждую секунду, что позволяет получать достаточно актуальные данные.
Потребляемая мощность также не превышает 0,5 Вт, что делает сбор данных в доме очень удобным.