WI-FI метеостанция на модуле ESP

Вот несложная метеостанция, которую можно себе сделать для возможности передавать данные о погоде через интернет. Устройство создано на базе wi-fi модуля ESP8266-07, дисплея OLED 0.96″, датчики HTU21d и BMP280, зарядное TP4056, солнечная панель 2 Вт, li-ion батарея 2000 мА/ч, стабилизатор MCP1700 и немного пассивных радиоэлементов. ESP программирование в Arduino.



Принципиальная схема метеостанции

WI-FI метеостанция на модуле ESP
Электрическая схема WI-FI метеостанции на модуле ESP

Датчик погодных условий работает в цикле периодического пробуждения из режима “сна”, каждые 30 минут. После выхода, он подключается к сети wi-fi, считывает датчики и напряжение аккумулятора, после чего отправляет данные на серверы Thingspeak и Blynk, затем обновляет данные на дисплее и снова впадает в сон.

WI-FI метеостанция на модуле ESP
Данные о погоде на экране

Во время работы средний ток потребления метеостанцией около 80 мА, в режиме сна ток падает до 3 мА, причём большую часть потребляет OLED дисплей.

Конструкция самодельной метеостанции

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



WI-FI метеостанция на модуле ESP
Готовый корпус

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

WI-FI метеостанция на модуле ESP
Солнечная панель 2 ватта

Управляющая программа

Если вы находитесь в зоне действия двух или более доступных сети wi-fi, то вот решение подключения через модуль ESP:

#include <ESP8266WiFi.h>

const char* ssid1 = “ssid_sieci_1”;
const char* password1 = “haslo_sieci_1”;
const char* ssid2 = “ssid_sieci_2”;
const char* password2 = “haslo_sieci_2”;
const char* ssid3 = “ssid_sieci_3”;
const char* password3 = “haslo_sieci_3”;
const char* ssid4 = “ssid_sieci_4”;
const char* password4 = “haslo_sieci_4”;
const char* ssid5 = “ssid_sieci_5”;
const char* password5 = “haslo_sieci_5″;
const byte Czas_max_timeout = 30;

word timeout = 0;
byte Status_polaczenia = 0;

void setup() {
Serial.begin(115200);
delay(10);
}
//*********************************************************************************************************
void loop() {
Wlacz_wifi();
Skanuj_wifi();
Wykonaj_zadanie();
Rozlacz_wifi_i_wylacz();
delay(5000);
}
//*********************************************************************************************************
void Wykonaj_zadanie() {
if (Status_polaczenia == 1){
Serial.println(” “);
Serial.println(“Wykonuje zadanie”);
}
}
//*********************************************************************************************************

void Wlacz_wifi() {
Serial.println(” “);
Serial.println(“Wlaczam WIFI”);
WiFi.forceSleepWake();
delay(100);
}
//*********************************************************************************************************
void Rozlacz_wifi_i_wylacz() {
Serial.println(” “);
Serial.println(“Rozlaczam WIFI”);
WiFi.disconnect();
Status_polaczenia = 0;
WiFi.forceSleepBegin();
Serial.println(“Wylaczam WIFI w celu oszczedzania energii”);
Serial.println(” “);
Serial.println(” “);
Serial.println(” “);
}
//*********************************************************************************************************
void Polacz_z_wifi(){
timeout = 0;
for (int timeout=0; timeout <= Czas_max_timeout; timeout++){
if (WiFi.status() != WL_CONNECTED) {delay(200);Serial.print(“.”);}
else
{timeout = Czas_max_timeout;Status_polaczenia = 1;Serial.print(” Polaczono”);}
if (timeout == Czas_max_timeout && Status_polaczenia == 0) {Serial.print(“TIMEOUT”);WiFi.disconnect();}
}
}
//*********************************************************************************************************
void Skanuj_wifi(){
byte znana_siec = 0;
byte Dostepna_siec_1 = 0;
byte Dostepna_siec_2 = 0;
byte Dostepna_siec_3 = 0;
byte Dostepna_siec_4 = 0;
byte Dostepna_siec_5 = 0;

Serial.println(“Skanowanie dostepnych sieci WIFI”);

int n = WiFi.scanNetworks();
if (n == 0){
Serial.println(“Nie znaleziono zadnych sieci!”);
}
else
{
Serial.print(“Znaleziono “);
Serial.print(n);
Serial.print(” sieci WIFI”);

for (int i = 0; i < n; ++i){
if ( WiFi.SSID(i) == ssid1 && Dostepna_siec_1 == 0) {znana_siec++;Dostepna_siec_1 = 1;}
if ( WiFi.SSID(i) == ssid2 && Dostepna_siec_2 == 0) {znana_siec++;Dostepna_siec_2 = 1;}
if ( WiFi.SSID(i) == ssid3 && Dostepna_siec_3 == 0) {znana_siec++;Dostepna_siec_3 = 1;}
if ( WiFi.SSID(i) == ssid4 && Dostepna_siec_4 == 0) {znana_siec++;Dostepna_siec_4 = 1;}
if ( WiFi.SSID(i) == ssid5 && Dostepna_siec_5 == 0) {znana_siec++;Dostepna_siec_5 = 1;}
}
Serial.print(” w tym “);
Serial.print(znana_siec);
Serial.print(” dostepnych znanych sieci”);
Status_polaczenia = 0;

if (Dostepna_siec_1 == 1 && Status_polaczenia == 0) {WiFi.begin(ssid1, password1);Serial.println(” “);Serial.print(“Laczenie z (1) “);Serial.print(ssid1);Polacz_z_wifi();}
if (Dostepna_siec_2 == 1 && Status_polaczenia == 0) {WiFi.begin(ssid2, password2);Serial.println(” “);Serial.print(“Laczenie z (2) “);Serial.print(ssid2);Polacz_z_wifi();}
if (Dostepna_siec_3 == 1 && Status_polaczenia == 0) {WiFi.begin(ssid3, password3);Serial.println(” “);Serial.print(“Laczenie z (3) “);Serial.print(ssid3);Polacz_z_wifi();}
if (Dostepna_siec_4 == 1 && Status_polaczenia == 0) {WiFi.begin(ssid4, password4);Serial.println(” “);Serial.print(“Laczenie z (4) “);Serial.print(ssid4);Polacz_z_wifi();}
if (Dostepna_siec_5 == 1 && Status_polaczenia == 0) {WiFi.begin(ssid5, password5);Serial.println(” “);Serial.print(“Laczenie z (5) “);Serial.print(ssid5);Polacz_z_wifi();}
}
}

Тут процессор сам выбирает себе сеть, с которой он свяжется и передаст данные о погоде. Система работает уже более 1 года. Морозы до -20C ей не страшны.

Полезное на сайте:
Контроллер вентиляции в туалете или ванной