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



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

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

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

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

Данные о погоде на экране

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

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

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

Готовый корпус

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

Солнечная панель 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 ей не страшны.

Полезное:  Регулятор оборотов однофазных электродвигателей 220В


Оцените: (2 - 5,00 из 5)
Загрузка...

НАЖМИТЕ ТУТ И ОТКРОЙТЕ КОММЕНТАРИИ