Tartalomjegyzék:

Meteorológiai állomás: ESP8266 Mély alvással, SQL -sel, Flask grafikus ábrázolásával és ábrázolásával: 3 lépés
Meteorológiai állomás: ESP8266 Mély alvással, SQL -sel, Flask grafikus ábrázolásával és ábrázolásával: 3 lépés

Videó: Meteorológiai állomás: ESP8266 Mély alvással, SQL -sel, Flask grafikus ábrázolásával és ábrázolásával: 3 lépés

Videó: Meteorológiai állomás: ESP8266 Mély alvással, SQL -sel, Flask grafikus ábrázolásával és ábrázolásával: 3 lépés
Videó: #32 - Házi meteorológiai állomás építése - 1.rész 2024, November
Anonim
Meteorológiai állomás: ESP8266 Mély alvással, SQL -sel, Flask & Plotly grafikával
Meteorológiai állomás: ESP8266 Mély alvással, SQL -sel, Flask & Plotly grafikával

Jó lenne tudni az erkély hőmérsékletét, páratartalmát vagy fényerősségét? Tudom, hogy megtenném. Ezért készítettem egy egyszerű időjárás -állomást az ilyen adatok gyűjtésére. A következő szakaszok azok a lépések, amelyeket megtettem annak létrehozásához.

Lássunk neki!

1. lépés: Időjárás állomás fény-, hőmérséklet- és páratartalom -érzékelőkkel

Időjárás állomás fény-, hőmérséklet- és páratartalom -érzékelőkkel
Időjárás állomás fény-, hőmérséklet- és páratartalom -érzékelőkkel
Időjárás állomás fény-, hőmérséklet- és páratartalom -érzékelőkkel
Időjárás állomás fény-, hőmérséklet- és páratartalom -érzékelőkkel
Időjárás állomás fény-, hőmérséklet- és páratartalom -érzékelőkkel
Időjárás állomás fény-, hőmérséklet- és páratartalom -érzékelőkkel
Időjárás állomás fény-, hőmérséklet- és páratartalom -érzékelőkkel
Időjárás állomás fény-, hőmérséklet- és páratartalom -érzékelőkkel

Amikor időjárás-állomás építését terveztem, arról álmodtam, hogy lesz egy teljes körű időjárás-állomásom, amely rendelkezik szélsebességgel, esőméréssel, teljes spektrumú napelemes érzékelővel, de kiderült, hogy ez nem lesz olcsó, és a vásárlási költség véget érhet legalább 100 dollárt. Feladtam a teljes lehetőséget, és elkezdtem egyet építeni 10 dollárral, többé -kevésbé. 10 dollár az időjárás -állomás alapvető összetevőinek költsége, mint az alábbi részek.

Itt vannak a részek:

1. Az ESP8266 Wemos márka 2,39 dollárba kerül az Aliexpressen. Ajánlom a Wemos márkát, mert az EPS8266 -ot könnyebb programozni, frissíteni, és 4 MB flash vagy több van benne.

2. A Wemos Charger-Boost Shield ára 1,39 dollár. Ez egy másik előnye a márka használatának. Feltöltőtáblával rendelkezik a lítium akkumulátor számára (névleges feszültség = 3,7 V) 5 V-ig az ESP8266 esetén. A tábla töltési opcióval is rendelkezik, maximális töltési áram = 1M.

*Megjegyzés: Van egy olcsóbb lehetőség a lítium akkumulátor töltésére/feltöltésére. Ez 1,77 dollárba kerül 5 db -ért. Amikor azonban ezt a táblát az ESP8266-hoz használtam (akár Wemos, akár csupasz ESP8266-hoz), az ESP8266 mély alvás üzemmódja azonnal visszaállítást indított, miután az ESP8266-ot alvó-visszaállító-alvó ciklusban készítette, ami nagyon bosszantó. Ha tudja, mi történt, kérem, írjon nekem.

3. A Wemos -nak is van több pajzsa a hőmérséklet és a páratartalom ellen, de én az egyes alkatrészekből fogok építeni. Fotorezisztor (vagy fényfüggő ellenállás-ldr, olcsó), fényerő-érzékelő, például BH1780 vagy TSL2561 (kb. 0,87-0,89 c db), hőmérséklet-érzékelő, például DS18B20 (mindegyik 75c), valamint páratartalom és hőmérséklet kombináció, mint pl. DHT22 ($ 2,35 itt) vagy SHT21 ($ 2,20 itt). Az érzékelő teljes költsége ~ 4 USD.

4. Lítium akkumulátor. Az egyiket egy 7,4 V -os Canon akkumulátorból mentettem ki, amely két soros 3,7 V -os akkumulátor vagy 18650 lítium akkumulátor. Mindegyik 18650 darab körülbelül 5 dollárba kerül. Van egy képem, amely a kamera akkumulátorának lebontását mutatja. Legyen azonban óvatos, a rövidzárlat a műanyag burkolat átvágásakor extrém hőt és égést okozhat.

5. NYÁK lap, jumper, huzal, forrasztás, az időd, esetleg némi hibakeresési készség.

Hagyja, hogy a huzal alkatrészei együtt kövessék a fenti sémát.

Ezután keresse meg a feladatot a beállítási ciklusban. Ez egyszerűen egy feladat, és alvásparanccsal ér véget.

void setup () {Serial.begin (115200); Serial.println ("Kezdő csomópont névvel" + String (SENSORNAME)); setup_wifi (); késleltetés (100); Wire.begin (); pinMode (ldrPin, INPUT); SHT21.begin (); if (! tsl.begin ()) {Serial.print ("A TSL2561 nem található"); míg (1); } késleltetés (100); ldr = analóg olvasás (ldrPin); tsl.enableAutoRange (igaz); tsl.setIntegrationTime (TSL2561_INTEGRATIONTIME_13MS); késleltetés (100); sensors_event_t esemény; tsl.getEvent (& event); if (esemény.fény) lux = esemény.fény; else Serial.println ("Érzékelő túlterhelés");

h = SHT21.getHumidity ();

t = SHT21.getTemperature (); tempSensor.setWaitForConversion (hamis); tempSensor.begin (); késleltetés (100); if (tempSensor.getDeviceCount () == 0) {Serial.printf ("A DS18x20 nem található a %d / n tűn", ds18b20); Serial.flush (); késleltetés (1000); } késleltetés (100); tempSensor.requestTemperatures (); t18 = tempSensor.getTempCByIndex (0); Serial.printf ("\ nFény: %d lux / t", lux); Serial.printf ("LDR: %d /1024 / t", ldr); Soros.printf ("T: %0.2f *C / t", t); Serial.printf ("H:%0.2f / t", h); Serial.printf ("HIC: %0.2f / t", hic); késleltetés (100); client.setServer (mqtt_szerver, mqtt_port); client.setCallback (visszahívás); újracsatlakozás (); késleltetés (100); ESP.deepSleep (3e8); // 300 millió mikro másodperc, 300 másodperc, 5 perc; }

Hibakeresés vagy beállítás közben adja ki az ESP.deepsleep () parancsot, hogy folyamatosan legyen soros leolvasás. Mint mindig, az ESP8266 -ba feltöltendő teljes kód itt található (GitHub).

Ne felejtse el felvenni az áthidalót az RST és a D0/GPIO16 között, hogy a mély alvás után felébredjen.

Most ideje feltölteni a kódot az Arduino IDE segítségével az ESP8266 -ba.

2. lépés: MQTT: Rugalmas közeg az adatok közzétételéhez és előfizetéséhez

MQTT: Rugalmas közeg az adatok közzétételéhez és előfizetéséhez
MQTT: Rugalmas közeg az adatok közzétételéhez és előfizetéséhez
MQTT: Rugalmas közeg az adatok közzétételéhez és előfizetéséhez
MQTT: Rugalmas közeg az adatok közzétételéhez és előfizetéséhez

Először is egyre jobban szeretem használni az MQTT -t az otthoni különböző érzékelőkön és ügyfeleken keresztül történő adatok küldésére és fogadására. Ennek oka az a rugalmasság, hogy korlátlan mennyiségű adatot küldhet egy témakör szerint, és korlátlan számú ügyfél, hogy feliratkozzon egy témára az MQTT brókerétől. Másodszor, nem vagyok alkalmas az MQTT részletes tárgyalására. Tavaly (2017) néha megismertem az MQTT-t, amikor oktatóanyagokat követtem az időjárás állomás és az érzékelők beállításához a Node-RED használatával. Mindenesetre minden tőlem telhetőt megteszek, hogy bemutassak néhány információt. Egy másik jó kiindulópont a Wikipédia.

Ha nincs ideje olvasni az elméletről, és szeretne létrehozni egy MQTT brókert, csak egy másik oktatóanyagot tettem közzé. Keresse meg ezt a bejegyzést, és görgessen le a 4. lépéshez.

Annak megmagyarázására, hogy mi az üzenet -sorba állító telemetriai szállítás (MQTT) az én értelmezésemben, elkészítettem egy diagramot a fentiek szerint. Dióhéjban, az MQTT egy ISO szabvány, és egy olyan terméknek, mint a szúnyog és a szúnyogkliens, két csomagnak, amelyet egy Raspberry Pi-n lévő MQTT brókernek használtam, meg kell felelnie ennek a szabványnak. Az MQTT bróker ezután a megjelenítők médiumává válik, hogy üzenetet küldjön, és az előfizetők meghallgassák a célt.

Az Arduino PubSubclient könyvtár és az ArduinoJson kombinációja, a létrehozó knolleary és a bblanchon segítségével, megkönnyíti a barkácsolók és a fejlesztők számára az eszközkészletet az érzékelőktől a célberendezésekig vagy a végső ügyfelekig.

Haladjunk tovább az adatbázis létrehozásával, és jelenítsünk meg néhány adatot.

3. lépés: Mentse az adatokat az SQL -be, és jelenítse meg őket egy webszerveren

Mentse az adatokat SQL -be és jelenítse meg őket egy webszerveren
Mentse az adatokat SQL -be és jelenítse meg őket egy webszerveren
Mentse az adatokat SQL -be és jelenítse meg őket egy webszerveren
Mentse az adatokat SQL -be és jelenítse meg őket egy webszerveren

Az sqlite3 segítségével adatbázisokat készítettem a webszerverhez. Telepítse az sqlite3 programot a Rapberry Pi programba:

sudo apt-get install sqlite3

létrehozott egy adatbázist és egy táblázatot a terminálba beírva:

sqlite3 időjárásállomás.db

TÁBLÁZAT LÉTREHOZÁSA időjárási adatok (id INT PRIMARY KEY, the time DATETIME, ldr INT, tls2561 INT, ds18b20 REAL, tsht21 REAL, hsht21 REAL);

.exit // az sqlite parancssorból való kilépéshez és a Linux terminálhoz való visszatéréshez

A meteorológiai állomás által közzétett téma meghallgatásához egy Paho könyvtárat használtam Python segítségével:

#! /usr/bin/python3# átvéve innen: > # 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.

Ajánlott: