Spisu treści:
- Krok 1: Stacja pogodowa z czujnikami światła, temperatury i wilgotności
- Krok 2: MQTT: elastyczne medium do publikowania i subskrybowania danych
- Krok 3: Zapisz dane w SQL i wyświetl je na serwerze WWW
Wideo: Stacja pogodowa: ESP8266 z głębokim uśpieniem, SQL, wykresami Flask&Plotly: 3 kroki
2024 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2024-01-30 11:28
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
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
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
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:
Stacja pogodowa NaTaLia: stacja pogodowa zasilana energią słoneczną Arduino Wykonana we właściwy sposób: 8 kroków (ze zdjęciami)
Stacja pogodowa NaTaLia: Stacja pogodowa zasilana energią słoneczną Arduino Wykonana we właściwy sposób: po roku udanej pracy w 2 różnych lokalizacjach dzielę się planami projektu stacji pogodowej zasilanej energią słoneczną i wyjaśniam, jak ewoluował w system, który może naprawdę przetrwać przez długi czas okresy z energii słonecznej. Jeśli obserwujesz
Stacja pogodowa DIY i stacja czujników WiFi: 7 kroków (ze zdjęciami)
DIY Stacja pogodowa i stacja z czujnikami WiFi: W tym projekcie pokażę Ci, jak stworzyć stację pogodową wraz ze stacją czujników WiFi. Stacja czujnikowa mierzy lokalne dane dotyczące temperatury i wilgotności i przesyła je przez Wi-Fi do stacji pogodowej. Stacja pogodowa wyświetla następnie t
ESP8266 NodeMCU + LM35 + Blynk (stacja pogodowa IOT / cyfrowy czujnik temperatury): 4 kroki
ESP8266 NodeMCU + LM35 + Blynk (stacja pogodowa IOT / cyfrowy czujnik temperatury): Cześć chłopaki! W tej instrukcji nauczymy się, jak łączyć czujnik LM35 z NodeMCU i wyświetlać te informacje o temperaturze przez Internet na smartfonie z aplikacją Blynk. (Również w tym projekcie będziemy używać widżetu SuperChart w Bl
Stacja pogodowa Wemos D1 Mini (Plug & Play): 4 kroki
Stacja pogodowa Wemos D1 Mini (Plug & Play): Ten projekt dotyczy najprostszej możliwej stacji pogodowej opartej na WeMos D1 Mini. Wybieram WeMos D1 Mini, ponieważ ma zalety:1. można go zaprogramować i uruchomić bez podłączania zewnętrznych modułów, wystarczy użyć kabla USB.2. nie potrzebujesz regulacji napięcia
Stacja pogodowa ESP8266, BMP280, MQTT: 4 kroki
Stacja pogodowa ESP8266, BMP280, MQTT: To poprowadzi Cię przez tworzenie prostej stacji pogodowej z dobrą dokładnością. Tutaj używamy płytki rozwojowej ESP8266 WIFI, aby podłączyć czujnik do Internetu, aby zapisać dane. Dużo smaków istnieje i zadziała, a ja użyję tego, który mam