Проект погодной станции на ESP32
Микроконтроллер ESP32, обладающий возможностями коммуникации по WiFi и Bluetooth, набирает популярность, и на его основе уже создаются различные полезные электронные устройства и оборудование. Его очень высокая (среди микроконтроллеров) вычислительная мощность, потрясающий дополнительный функционал и довольно низкая цена позволяют применять ESP32 в достаточно сложных проектах.

На базе ESP32 благодаря его возможностям беспроводной связи можно самостоятельно создать несложную, но в то же время весьма функциональную погодную станцию, которая может быть качественнее и дешевле погодной станции на основе Arduino и ESP8266.
Проект погодной станции на ESP32
Данный проект предполагает то, что эта погодная станция будет автономной, то есть будет питаться не от сети, а от энергии солнца благодаря встроенным солнечным панелям. Таким образом, ее без проблем можно будет поместить на балкон или на веранду частного дома. Из разновидности модулей с микроконтроллером здесь используется FireBeetle ESP32 IOT компании DFRobot. В него без проблем можно загружать код из Arduino IDE. Все физические параметры считываются датчиком BME280. Необходимая энергия обеспечивается двумя солнечными панелями на 6 В, которые могут предоставлять 2 Вт мощности. Эти солнечные ячейки будут подключены параллельно. Полученная энергии хранится в литиево-ионной аккумуляторной батарее напряжением 3.7 В с емкостью 1000 мАч. Модуль Solar Lipo Charger от DFRobot будет отвечать за управление питанием.
Схема подключения ESP32 и других элементов погодной станции

Микроконтроллер FireBeetle ESP32 IOT питается от батареи 3.7V, которая подключается к зарядному устройству Solar Lipo. Солнечные элементы подключены к портам PWR In. Порты Vcc и GND микроконтроллера FireBeetle ESP32 IOT подключены к портам Vout зарядного устройства Solar Lipo. Питание BME280 обеспечивается напряжением 3.3 В от микроконтроллера Firebeetle ESP32 IOT. Связь осуществляется через линии I2C (SDA / SCL).
Код ESP32 для работы погодной станции
Чтобы использовать приведенный ниже код, следует внести в него небольшие изменения. Во-первых, следует отметить, что программа использует сервис Thingspeak.com, поэтому сначала нужно зарегистрироваться в нем и получить API. Затем этот API следует ввести вместо YOUR_API_KEY в качестве значения для переменной api_key. Также можно изменить значение переменной TIME_TO_SLEEP для изменения интервала перехода в режим сна.
#include <WiFi.h>
#include <WiFiMulti.h>
WiFiMulti WiFiMulti;
const char* ssid = "YOUR_SSID"; // имя сети WiFi
const char* password = "YOUR_WIFI_PASSWORD"; // пароль сети WiFi
const char* host = "api.thingspeak.com";
String api_key = "YOUR_API_KEY"; // ключ API
// библиотека датчика BME280
#include <DFRobot_BME280.h>
#define SEA_LEVEL_PRESSURE 1013.25f
DFRobot_BME280 bme; //I2C
float temp, pressure, hum, alt; //переменные датчика BME280
// библиотека для перевода ESP32 в режим сна
#include "esp_deep_sleep.h"
#define uS_TO_m_FACTOR 60000000 // Коэффициент преобразования микросекунд в минуты
#define TIME_TO_SLEEP 1 // время через которое ESP32 перейдет в режим сна
void setup() {
Serial.begin(115200);
delay(10);
Connect_to_Wifi();
if (!bme.begin()) {
Serial.println("No sensor device found, check line or address!");
}
delay(100);
Get_Values();
Send_Data();
esp_deep_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_m_FACTOR);
Serial.println("Going to sleep now");
esp_deep_sleep_start();
}
void loop() {
}
void Get_Values()
{
temp = bme.temperatureValue();
delay(100);
pressure = bme.pressureValue() / 100.0F;
hum = bme.humidityValue();
alt = bme.altitudeValue(SEA_LEVEL_PRESSURE);
delay(100);
Serial.println("Collect data");
Serial.print("Temperature :");
Serial.print(temp);
Serial.println(" C");
Serial.print("Pressure:");
Serial.print(pressure);
Serial.println(" hPa");
Serial.print("Humidity :");
Serial.print(hum);
Serial.println(" %");
Serial.print("Approx. Altitude:");
Serial.print(alt);
Serial.println(" m");
Serial.println("------END------");
BME280_Sleep();
}
void Connect_to_Wifi()
{
WiFiMulti.addAP(ssid, password);
Serial.println();
Serial.println();
Serial.print("Wait for WiFi... ");
while (WiFiMulti.run() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void Send_Data()
{
Serial.println("Prepare to send data");
WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
return;
}
else
{
String data_to_send = api_key;
data_to_send += "&field1=";
data_to_send += String(temp);
data_to_send += "&field2=";
data_to_send += String(hum);
data_to_send += "&field3=";
data_to_send += String(pressure);
data_to_send += "\r\n\r\n";
client.print("POST /update HTTP/1.1\n");
client.print("Host: api.thingspeak.com\n");
client.print("Connection: close\n");
client.print("X-THINGSPEAKAPIKEY: " + api_key + "\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(data_to_send.length());
client.print("\n\n");
client.print(data_to_send);
delay(1000);
}
client.stop();
}
void BME280_Sleep()
{
//Serial.println("BME280 to Sleep mode");
Wire.beginTransmission(0x77);
Wire.write((uint8_t)BME280_REGISTER_CONTROL);
Wire.write((uint8_t)0b00);
Wire.endTransmission();
}
© digitrode.ru