Obsah:

Meteorologická stanice: ESP8266 s hlubokým spánkem, SQL, grafy podle baňky a vykreslování: 3 kroky
Meteorologická stanice: ESP8266 s hlubokým spánkem, SQL, grafy podle baňky a vykreslování: 3 kroky

Video: Meteorologická stanice: ESP8266 s hlubokým spánkem, SQL, grafy podle baňky a vykreslování: 3 kroky

Video: Meteorologická stanice: ESP8266 s hlubokým spánkem, SQL, grafy podle baňky a vykreslování: 3 kroky
Video: Метеостанция 2024, Červenec
Anonim
Meteorologická stanice: ESP8266 s hlubokým spánkem, SQL, grafy podle Flask & Plotly
Meteorologická stanice: ESP8266 s hlubokým spánkem, SQL, grafy podle Flask & Plotly

Bylo by zábavné znát teplotu, vlhkost nebo intenzitu světla na vašem balkoně? Vím, že bych. Vytvořil jsem tedy jednoduchou meteorologickou stanici pro sběr takových dat. Následující části jsou kroky, které jsem provedl při sestavování jednoho.

Začněme!

Krok 1: Meteostanice se senzory světla, teploty a vlhkosti

Meteorologická stanice se senzory světla, teploty a vlhkosti
Meteorologická stanice se senzory světla, teploty a vlhkosti
Meteorologická stanice se senzory světla, teploty a vlhkosti
Meteorologická stanice se senzory světla, teploty a vlhkosti
Meteorologická stanice se senzory světla, teploty a vlhkosti
Meteorologická stanice se senzory světla, teploty a vlhkosti
Meteorologická stanice se senzory světla, teploty a vlhkosti
Meteorologická stanice se senzory světla, teploty a vlhkosti

Když jsem plánoval stavbu meteorologické stanice, snil jsem o tom, že budu mít plnohodnotnou meteorologickou stanici, která bude mít rychlost větru, měření deště, sluneční spektrum s plným spektrem, ale ukázalo se, že to nebude levné a náklady na pořízení mohou skončit minimálně 100 $. Vzdal jsem se všech možností a začal jsem stavět jeden s více nebo méně $ 10. 10 $ jsou náklady na základní součásti meteorologické stanice jako níže uvedené části.

Zde jsou části:

1. Značka ESP8266 Wemos stojí na Aliexpressu 2,39 $. Doporučil bych značku Wemos, protože její EPS8266 se snáze programuje, aktualizuje a má 4 MB flash nebo více.

2. Wemos Charger-Boost Shield stojí $ 1,39 ks. To je další výhoda používání této značky. Má posilovací desku pro lithiovou baterii (jmenovité napětí = 3,7 V) na 5 V pro ESP8266. Deska je také dodávána s možností nabíjení s maximálním nabíjecím proudem = 1M.

*Poznámka: Existuje levnější možnost nabíjení/zesílení lithiové baterie. Tenhle stojí 1,77 $ za 5 ks. Když jsem však tuto desku použil pro ESP8266 (buď Wemosův, nebo holý ESP8266), režim hlubokého spánku ESP8266 spustil reset hned poté, co byl ESP8266 ve smyčce spánku-reset-spánku, což je velmi nepříjemné. Pokud víte, co se děje, pošlete mi prosím zprávu.

3. Wemos má také několik štítů na teplotu a vlhkost, ale budu stavět z jednotlivých komponent. Fotorezistor (nebo na světle závislý rezistor-ldr, levný), senzor svítivosti jako BH1780 nebo TSL2561 (asi 0,87-0,89c ks), teplotní senzor jako DS18B20 (každý 75c) a kombinace vlhkosti a teploty, jako je DHT22 (2,35 $ zde) nebo SHT21 (2,20 $ zde). Celkové náklady na senzor ~ 4 $.

4. Lithiová baterie. Zachránil jsem jeden z 7,4 V baterie Canon, což jsou dvě 3,7 V baterie v sérii nebo 18650 lithiová baterie. Každý 18650 stojí asi 5 $ za kus. Mám obrázek, který ukazuje stržení baterie z fotoaparátu. Buďte však opatrní, zkratování při řezání plastového krytu může způsobit extrémní teplo a popálení.

5. Deska plošných spojů, propojka, drát, pájení, váš čas, možná nějaké ladicí schopnosti.

Nechte součásti drátu dohromady podle výše uvedeného schématu.

Poté se podívejte na úkol v instalační smyčce. Je to prostě jeden běh úkolů a končí příkazem spánku.

neplatné nastavení () {Serial.begin (115200); Serial.println ("Počáteční uzel pojmenovaný" + řetězec (SENSORNAME)); setup_wifi (); zpoždění (100); Wire.begin (); pinMode (ldrPin, INPUT); SHT21.begin (); if (! tsl.begin ()) {Serial.print ("TSL2561 nebyl nalezen"); zatímco (1); } zpoždění (100); ldr = analogRead (ldrPin); tsl.enableAutoRange (true); tsl.setIntegrationTime (TSL2561_INTEGRATIONTIME_13MS); zpoždění (100); sensor_event_t událost; tsl.getEvent (& událost); if (event.light) lux = event.light; else Serial.println ("Přetížení senzoru");

h = SHT21.getHumidity ();

t = SHT21.getTemperature (); tempSensor.setWaitForConversion (false); tempSensor.begin (); zpoždění (100); if (tempSensor.getDeviceCount () == 0) {Serial.printf ("DS18x20 nebyl nalezen na pinu %d / n", ds18b20); Serial.flush (); zpoždění (1000); } zpoždění (100); tempSensor.requestTemperatures (); t18 = tempSensor.getTempCByIndex (0); Serial.printf ("\ nSvětlo: %d lux / t", lux); 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); zpoždění (100); client.setServer (mqtt_server, mqtt_port); client.setCallback (zpětné volání); znovu připojit (); zpoždění (100); ESP.deepSleep (3e8); // 300 milionů mikrosekund, 300 sekund, 5 minut; }

Během ladění nebo nastavení přihlaste ESP.deepsleep (), aby se sériové čtení zobrazovalo nepřetržitě. Zde je jako vždy umístěn celý kód pro nahrání do ESP8266 (GitHub).

Nezapomeňte nasadit propojku mezi RST a D0/GPIO16 pro spuštění probuzení po období hlubokého spánku.

Nyní je čas nahrát kód pomocí Arduino IDE do ESP8266.

Krok 2: MQTT: flexibilní médium pro publikování a odebírání dat

MQTT: flexibilní médium pro publikování a odebírání dat
MQTT: flexibilní médium pro publikování a odebírání dat
MQTT: flexibilní médium pro publikování a odebírání dat
MQTT: flexibilní médium pro publikování a odebírání dat

Nejprve se mi líbí používání MQTT k odesílání a přijímání dat přes různé senzory a klienty v mém domě. Důvodem je flexibilita odesílání neomezených dat kategorizovaných podle tématu a neomezené množství klientů k odběru jednoho tématu od makléře MQTT. Za druhé, nejsem způsobilý podrobně diskutovat o MQTT. S MQTT jsem se seznámil někdy loni (2017) při sledování návodů na nastavení meteorologické stanice a senzorů pomocí Node-RED. V každém případě se budu snažit vám poskytnout nějaké informace. Dalším dobrým místem pro začátek je Wikipedie.

Pokud nemáte čas si o teorii přečíst a chtěli jste nastavit brokera MQTT, zveřejnil jsem další tutoriál, jak to udělat. Vyhledejte tento příspěvek a přejděte dolů na krok 4.

Abych vysvětlil, co je v mém chápání Telemetrický transport front (MQTT), připravil jsem diagram, jak je uvedeno výše. Stručně řečeno, MQTT je standard ISO a produkt, jako je mosquitto a mosquitto-client, dva balíčky, které jsem použil pro sestavení MQTT brokera na Raspberry Pi, musí této normě vyhovovat. Zprostředkovatel MQTT se poté stane médiem pro vydavatele, do kterého budou zasílat zprávy, a předplatitelé k naslouchání cílovému tématu.

Kombinace knihovny Arduino PubSubclient s ArduinoJson díky svému tvůrci knolleary a bblanchon usnadňuje drotářům a vývojářům sadu nástrojů od senzorů po cílové zařízení nebo koncového klienta.

Pojďme dál s vytvořením databáze a zobrazením některých dat.

Krok 3: Uložte data na SQL a zobrazte je na webovém serveru

Uložte data na SQL a zobrazte je na webovém serveru
Uložte data na SQL a zobrazte je na webovém serveru
Uložte data na SQL a zobrazte je na webovém serveru
Uložte data na SQL a zobrazte je na webovém serveru

Sqlite3 jsem použil k vytvoření databáze pro webový server. Nainstalujte sqlite3 do Rapberry Pi podle:

sudo apt-get install sqlite3

vytvořil databázi a tabulku zadáním do terminálu:

meteorologická stanice sqlite3.db

VYTVOŘIT TABULKU data o počasí (id INT PRIMARY KEY, thetime DATETIME, ldr INT, tls2561 INT, ds18b20 REAL, tsht21 REAL, hsht21 REAL);

.exit // ukončí příkazový řádek sqlite a vrátí se do terminálu Linux

K poslechu tématu publikovaného meteorologickou stanicí jsem použil knihovnu Paho s Pythonem:

#! /usr/bin/python3# převzato 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.

Doporučuje: