Spisu treści:

Stacja pogodowa: ESP8266 z głębokim uśpieniem, SQL, wykresami Flask&Plotly: 3 kroki
Stacja pogodowa: ESP8266 z głębokim uśpieniem, SQL, wykresami Flask&Plotly: 3 kroki

Wideo: Stacja pogodowa: ESP8266 z głębokim uśpieniem, SQL, wykresami Flask&Plotly: 3 kroki

Wideo: Stacja pogodowa: ESP8266 z głębokim uśpieniem, SQL, wykresami Flask&Plotly: 3 kroki
Wideo: Stacja Pogodowa za 25zł (na ESP8266) 2024, Lipiec
Anonim
Stacja pogodowa: ESP8266 z głębokim uśpieniem, SQL, wykresami Flask&Plotly
Stacja pogodowa: ESP8266 z głębokim uśpieniem, SQL, wykresami Flask&Plotly

Czy fajnie byłoby poznać temperaturę, wilgotność lub natężenie światła na swoim balkonie? Wiem, że bym to zrobił. Zrobiłem więc prostą stację pogodową do zbierania takich danych. Poniższe sekcje to kroki, które podjąłem, aby je zbudować.

Zacznijmy!

Krok 1: Stacja pogodowa z czujnikami światła, temperatury i wilgotności

Stacja pogodowa z czujnikami światła, temperatury i wilgotności
Stacja pogodowa z czujnikami światła, temperatury i wilgotności
Stacja pogodowa z czujnikami światła, temperatury i wilgotności
Stacja pogodowa z czujnikami światła, temperatury i wilgotności
Stacja pogodowa z czujnikami światła, temperatury i wilgotności
Stacja pogodowa z czujnikami światła, temperatury i wilgotności
Stacja pogodowa z czujnikami światła, temperatury i wilgotności
Stacja pogodowa z czujnikami światła, temperatury i wilgotności

Kiedy planowałem zbudować stację pogodową, marzyłem, aby mieć pełnoprawną stację pogodową, która ma prędkość wiatru, pomiar deszczu, czujnik nasłonecznienia o pełnym spektrum, ale okazało się, że tanio nie będzie, a koszt zakupu mógłby się skończyć co najmniej 100 dolarów. Zrezygnowałem z pełnych opcji i zacząłem budować jedną za mniej więcej 10 USD. 10 USD to koszt podstawowych elementów stacji pogodowej, takich jak części poniżej.

Oto części:

1. Marka ESP8266 Wemos kosztuje na Aliexpress 2,39 USD. Polecam markę Wemos, ponieważ jej EPS8266 jest łatwiejszy do zaprogramowania, aktualizacji i ma 4 MB pamięci flash lub więcej.

2. Wemos Charger-Boost Shield kosztuje 1,39 USD. To kolejna zaleta korzystania z tej marki. Posiada płytkę boost-up dla baterii litowej (napięcie nominalne = 3,7V) do 5V dla ESP8266. Płyta posiada również opcję ładowania z maksymalnym prądem ładowania = 1M.

*Uwaga: Istnieje tańsza opcja ładowania/doładowania baterii litowej. Ten kosztuje 1,77 USD za 5 sztuk. Jednak, gdy użyłem tej płyty do ESP8266 (albo Wemos'a, albo gołego ESP8266), tryb głębokiego uśpienia ESP8266 wyzwolił reset zaraz po wykonaniu ESP8266 w pętli snu-resetu-snu, co jest bardzo denerwujące. Jeśli wiesz, co się dzieje, proszę o skrzynkę odbiorczą.

3. Wemos ma też kilka osłon na temperaturę i wilgotność, ale zamierzam budować z poszczególnych elementów. Fotorezystor (lub rezystor zależny od światła -- ldr, tani), czujnik jasności, taki jak BH1780 lub TSL2561 (około 0,87-0,89c szt), czujnik temperatury, taki jak DS18B20 (po 75c), oraz kombinacja wilgotności i temperatury, taka jak DHT22 (2,35 USD tutaj) lub SHT21 (2,20 USD tutaj). Całkowity koszt czujnika ~ 4 USD.

4. Bateria litowa. Uratowałem jedną z baterii Canon 7,4 V, która jest dwiema bateriami 3,7 V połączonymi szeregowo lub baterią litową 18650. Każdy 18650 kosztuje około 5 dolarów za sztukę. Mam zdjęcie przedstawiające rozerwanie akumulatora aparatu. Należy jednak zachować ostrożność, zwarcie podczas przecinania plastikowej osłony może generować ekstremalne ciepło i palić się.

5. Płytka drukowana, zworka, drut, lutowanie, twój czas, może jakieś umiejętności debugowania.

Połącz elementy z drutu zgodnie z powyższym schematem.

Następnie poszukaj zadania w pętli konfiguracji. Jest to po prostu jeden przebieg zadań i kończy się poleceniem uśpienia.

void setup() { Serial.begin(115200); Serial.println("Węzeł początkowy o nazwie " + String(NAZWACZUJNIKA)); setup_wifi(); opóźnienie (100); Wire.początek(); pinMode(ldrPin, INPUT); SHT21.początek(); if(!tsl.begin()) { Serial.print("TSL2561 nie znaleziono"); natomiast(1); } opóźnienie(100); ldr = odczyt analogowy(ldrPin); tsl.enableAutoRange(prawda); tsl.setIntegrationTime (TSL2561_INTEGRATIONTIME_13MS); opóźnienie (100); sensor_event_t zdarzenie; tsl.getEvent(&event); if (zdarzenie.światło) luks = wydarzenie.światło; else Serial.println("Przeciążenie czujnika");

h = SHT21.getHumidity();

t = SHT21.getTemperature(); tempSensor.setWaitForConversion(false); tempSensor.początek(); opóźnienie (100); if (tempSensor.getDeviceCount() == 0) { Serial.printf("DS18x20 nie znaleziono na pinie %d\n", ds18b20); Serial.flush(); opóźnienie (1000); } opóźnienie(100); tempSensor.requestTemperatures(); t18 = tempSensor.getTempCByIndex(0); Serial.printf("\nŚwiatło: %d luks\t", luks); Serial.printf("LDR: %d/1024\t", ldr); Serial.printf("T: %0.2f *C\t", t); Serial.printf("H:%0.2f \t", h); Serial.printf("HIC: %0.2f \t", hic); opóźnienie (100); klient.setServer(mqtt_server, mqtt_port); klient.setCallback(oddzwanianie); na nowo połączyć(); opóźnienie (100); ESP.deepSleep(3e8); // 300 milionów mikrosekund, 300 sekund, 5 minut; }

Podczas debugowania lub konfiguracji wydaj polecenie ESP.deepsleep(), aby mieć ciągły odczyt szeregowy. Jak zawsze, pełny kod do przesłania do ESP8266 jest hostowany tutaj (GitHub).

Pamiętaj, aby założyć zworkę między RST a D0/GPIO16, aby wywołać budzenie po okresie głębokiego snu.

Teraz czas na wgranie kodu za pomocą Arduino IDE do ESP8266.

Krok 2: MQTT: elastyczne medium do publikowania i subskrybowania danych

MQTT: elastyczne medium do publikowania i subskrybowania danych
MQTT: elastyczne medium do publikowania i subskrybowania danych
MQTT: elastyczne medium do publikowania i subskrybowania danych
MQTT: elastyczne medium do publikowania i subskrybowania danych

Po pierwsze, coraz bardziej lubię używać MQTT do wysyłania i odbierania danych z różnych czujników i klientów w moim domu. Dzieje się tak, ponieważ elastyczność wysyłania nieograniczonej ilości danych skategoryzowanych według tematu i nieograniczona liczba klientów do subskrybowania jednego tematu od brokera MQTT. Po drugie, nie mam kwalifikacji do szczegółowego omawiania MQTT. Poznałem MQTT czasami w zeszłym roku (2017), kiedy śledziłem samouczki, aby skonfigurować stację pogodową i czujniki za pomocą Node-RED. W każdym razie postaram się przedstawić wam kilka informacji. Kolejnym dobrym miejscem do rozpoczęcia jest Wikipedia.

Jeśli nie masz czasu na czytanie o teorii i chciałeś założyć brokera MQTT, opublikowałem kolejny samouczek właśnie w tym celu. Wyszukaj ten post i przewiń w dół do kroku 4.

Aby wyjaśnić czym w moim rozumieniu jest Message Queuing Telemetry Transport (MQTT) przygotowałem diagram jak powyżej. W skrócie, MQTT jest standardem ISO, a produkt taki jak mosquitto i mosquitto-client, dwa pakiety, których użyłem do budowy brokera MQTT na Raspberry Pi, muszą być zgodne z tym standardem. Broker MQTT staje się wtedy medium, w którym wydawcy mogą wysyłać wiadomości, a subskrybenci słuchać tematu docelowego.

Połączenie biblioteki Arduino PubSubclient z ArduinoJson, dzięki jej twórcy knolleary i bblanchon, ułatwia majsterkowiczom i programistom zestaw narzędzi od czujników po sprzęt docelowy lub klienta końcowego.

Przejdźmy do tworzenia bazy danych i wyświetlania niektórych danych.

Krok 3: Zapisz dane w SQL i wyświetl je na serwerze WWW

Zapisuj dane w SQL i wyświetlaj je na serwerze WWW
Zapisuj dane w SQL i wyświetlaj je na serwerze WWW
Zapisuj dane w SQL i wyświetlaj je na serwerze WWW
Zapisuj dane w SQL i wyświetlaj je na serwerze WWW

Użyłem sqlite3 do stworzenia bazy danych dla serwera WWW. Zainstaluj sqlite3 w Rapberry Pi przez:

sudo apt-get zainstaluj sqlite3

utworzył bazę danych i tabelę, wpisując w terminalu:

stacja pogodowa sqlite3.db

CREATE TABLE dane pogodowe (id INT PRIMARY KEY, czas DATETIME, ldr INT, tls2561 INT, ds18b20 REAL, tsht21 REAL, hsht21 REAL);

.exit //aby wyjść z wiersza poleceń sqlite i wrócić do terminala Linux

Aby posłuchać tematu opublikowanego przez stację pogodową, użyłem biblioteki Paho z Pythonem:

#! /usr/bin/python3# przejęty z: > # binh nguyen, august 04, 2018, from time import localtime, strftime, sleep import paho.mqtt.client as mqtt import sqlite3, json

mqtt_topic = 'balcony/weatherstation'

mqtt_username = "johndoe" mqtt_password = "password" dbfile = "/path/to/databse/weatherstation.db" mqtt_broker_ip = '192.168.1.50'

# the callback for when the client receives a connack response from the server.

def on_connect(client, userdata, flags, rc): print("connected with result code "+str(rc)) client.subscribe(mqtt_topic) # the callback for when a publish message is received from the server. def on_message(client, userdata, msg): thetime = strftime("%y-%m-%d %h:%m:%s", localtime())

topic = msg.topic

payload = json.dumps(msg.payload.decode('utf-8')) sql_cmd = sql_cmd = """insert into weatherdata values ({0}, '{1}', {2[ldr]}, {2[tsl2561]}, {2[ds18b20]}, {2[tsht21]}, {2[hsht21]})""".format(none, time_, payload) writetodb(sql_cmd) print(sql_cmd) return none

def writetodb(sql_cmd):

conn = sqlite3.connect(dbfile) cur = conn.cursor() cur.execute(sql_command) conn.commit()

client = mqtt.client()

client.on_connect = on_connect client.on_message = on_message client.username_pw_set(username=mqtt_username, password=mqtt_password) client.connect(mqtt_broker_ip, 1883, 60) sleep(1) client.loop_forever()

to display data from use another sql command to query data from the database such as:

sql_command = """ select * from weatherdata order by thetime desc limit 1000;"

this sql command is included in the app.py that uses flask framework and plotty to make a web server and plotting a graph.

the complete code is hosted on the github.

if the esp8266 cannot read the ds18b20, it assigned a value of -127 as the temperature which skews the relative range of other readable temperatures. i cleaned up those values by set a null value to those equals to -127:

sqlite3 weatherstation.db

sqlite3> update weatherdata set ds18b20 = null where ds18b20 = -127;

to set up an environment for this mini web server, i used the shared libraries on raspberry pi. a virtualenv is a better option if the web server is hosted on a powerful computer. start the web server by:

python3 app.py

press control + c to stop the server.

the web server is set to auto-refreshed for every 60 seconds. you can change the interval in index.html file:

battery performance:

i did not measure the current between the normal state or sleep state of esp8266. many others did so. the first google search turned to this page. the normal state of esp8266 consumes about 100ma depends on the rate of transmitting and wifi activity. the deep-sleep state needs in the range of micro a, which a thousand times less.

for 5-minute interval between sleeping and waking up, one single lithium 18650 (2000mah) could fuel my weather station for 12 days. the same battery only enough for esp 8266 ran less than a day with a normal working state. the one i took from the camera battery pack (did not know the capacity) was enough to run the weather station with deep sleep for 5-6 days.

thank you for spending time with me to this end.

Zalecana: