Sadržaj:

Meteorološka stanica: ESP8266 s dubokim snom, SQL, grafički prikaz po boci i plotografiji: 3 koraka
Meteorološka stanica: ESP8266 s dubokim snom, SQL, grafički prikaz po boci i plotografiji: 3 koraka

Video: Meteorološka stanica: ESP8266 s dubokim snom, SQL, grafički prikaz po boci i plotografiji: 3 koraka

Video: Meteorološka stanica: ESP8266 s dubokim snom, SQL, grafički prikaz po boci i plotografiji: 3 koraka
Video: Weather station,❄️🌫️⛈️🌨️🌨️🌤️#arduino #nodemcu #electronics 2024, Juli
Anonim
Meteorološka stanica: ESP8266 s dubokim mirovanjem, SQL, grafički prikaz po boci i plocici
Meteorološka stanica: ESP8266 s dubokim mirovanjem, SQL, grafički prikaz po boci i plocici

Bi li bilo zabavno znati temperaturu, vlažnost ili intenzitet svjetla na vašem balkonu? Znam da bih. Zato sam napravio jednostavnu meteorološku stanicu za prikupljanje takvih podataka. Sljedeći odjeljci su koraci koje sam poduzeo da bih ih izgradio.

Hajde da počnemo!

Korak 1: Meteorološka stanica sa senzorima svjetlosti, temperature i vlažnosti

Meteorološka stanica sa senzorima svjetlosti, temperature i vlažnosti
Meteorološka stanica sa senzorima svjetlosti, temperature i vlažnosti
Meteorološka stanica sa senzorima svjetlosti, temperature i vlažnosti
Meteorološka stanica sa senzorima svjetlosti, temperature i vlažnosti
Meteorološka stanica sa senzorima svjetlosti, temperature i vlažnosti
Meteorološka stanica sa senzorima svjetlosti, temperature i vlažnosti
Meteorološka stanica sa senzorima svjetlosti, temperature i vlažnosti
Meteorološka stanica sa senzorima svjetlosti, temperature i vlažnosti

Kad sam planirao izgradnju meteorološke stanice, sanjao sam da imam potpunu meteorološku stanicu koja ima brzinu vjetra, mjerenje kiše, solarni senzor punog spektra, ali pokazalo se da to neće biti jeftino, a troškovi kupnje mogli bi prestati za najmanje 100 USD. Odustao sam od svih mogućnosti i počeo graditi jednu sa manje -više 10 dolara. 10 USD je cijena osnovnih komponenti meteorološke stanice kao donjih dijelova.

Evo dijelova:

1. Brend ESP8266 Wemos košta 2,39 USD po komadu na Aliexpressu. Preporučio bih Wemos marku jer je njen EPS8266 lakše programirati, ažurirati i imati flash od 4 MB ili više.

2. Wemos Charger-Boost Shield košta 1,39 USD po kom. Ovo je još jedna prednost korištenja ove marke. Ima ploču za povećanje snage za litijumsku bateriju (nominalni napon = 3,7 V) na 5 V za ESP8266. Ploča takođe dolazi sa opcijom punjenja sa maksimalnom strujom punjenja = 1M.

*Napomena: Postoji jeftinija opcija za punjenje/pojačavanje litijumske baterije. Ovaj košta 1,77 USD za 5 komada. Međutim, kada sam koristio ovu ploču za ESP8266 (bilo Wemosovu ili golu ESP8266), način dubokog sna ESP8266 pokrenuo je resetiranje odmah nakon što je ESP8266 bio u petlji sleep-reset-sleep, što je vrlo neugodno. Ako znate šta se dešava, javite mi se u inbox.

3. Wemos takođe ima nekoliko štitova za temperaturu i vlažnost, ali ja ću graditi od pojedinačnih komponenti. Fotootpornik (ili otpornik ovisan o svjetlu-ldr, jeftino), senzor za osvjetljenje poput BH1780 ili TSL2561 (oko 0,87-0,89 c kom), temperaturni senzor kao što je DS18B20 (po 75 c svaki) i kombinacija vlažnosti i temperature, npr. DHT22 (2,35 USD ovdje) ili SHT21 (2,20 USD ovdje). Ukupna cijena senzora ~ 4 USD.

4. Litijumska baterija. Jednu sam spasio iz 7,4V Canon baterije, dvije serijske baterije od 3,7V ili litijumske baterije 18650. Svaki 18650 košta oko 5 USD po komadu. Imam sliku koja prikazuje rušenje baterije fotoaparata. Budite ipak oprezni, kratki spoj pri rezanju kroz plastični poklopac mogao bi proizvesti iznimnu toplinu i izgorjeti.

5. PCB ploča, kratkospojnik, žica, lemljenje, vaše vrijeme, možda neke vještine otklanjanja grešaka.

Neka žičane komponente slijede gornju shemu.

Zatim potražite zadatak u petlji za postavljanje. To je jednostavno jednokratni rad zadataka i završava naredbom za spavanje.

void setup () {Serial.begin (115200); Serial.println ("Ime početnog čvora" + niz (SENSORNAME)); setup_wifi (); kašnjenje (100); Wire.begin (); pinMode (ldrPin, INPUT); SHT21.begin (); if (! tsl.begin ()) {Serial.print ("TSL2561 nije pronađen"); while (1); } kašnjenje (100); ldr = analogRead (ldrPin); tsl.enableAutoRange (true); tsl.setIntegrationTime (TSL2561_INTEGRATIONTIME_13MS); kašnjenje (100); sensors_event_t događaj; tsl.getEvent (& event); if (event.light) lux = event.light; else Serial.println ("Preopterećenje senzora");

h = SHT21.getHumidity ();

t = SHT21.getTemperature (); tempSensor.setWaitForConversion (false); tempSensor.begin (); kašnjenje (100); if (tempSensor.getDeviceCount () == 0) {Serial.printf ("DS18x20 nije pronađen na pin %d / n", ds18b20); Serial.flush (); kašnjenje (1000); } kašnjenje (100); tempSensor.requestTemperatures (); t18 = tempSensor.getTempCByIndex (0); Serial.printf ("\ nSvjetlo: %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); kašnjenje (100); client.setServer (mqtt_server, mqtt_port); client.setCallback (povratni poziv); ponovno spojiti (); kašnjenje (100); ESP.deepSleep (3e8); // 300 miliona mikro sekundi, 300 sekundi, 5 minuta; }

Tokom otklanjanja grešaka ili postavljanja, naredite ESP.deepsleep () za stalno očitavanje serijskog broja. Kao i uvijek, cijeli kôd za učitavanje na ESP8266 nalazi se ovdje (GitHub).

Ne zaboravite staviti kratkospojnik između RST i D0/GPIO16 za aktiviranje buđenja nakon perioda dubokog sna.

Sada je vrijeme za učitavanje koda pomoću Arduino IDE -a na ESP8266.

Korak 2: MQTT: fleksibilan medij za objavljivanje i pretplatu podataka

MQTT: fleksibilan medij za objavljivanje i pretplatu podataka
MQTT: fleksibilan medij za objavljivanje i pretplatu podataka
MQTT: fleksibilan medij za objavljivanje i pretplatu podataka
MQTT: fleksibilan medij za objavljivanje i pretplatu podataka

Prvo, sve više volim koristiti MQTT za slanje i primanje podataka preko različitih senzora i klijenata u mojoj kući. To je zbog fleksibilnosti slanja neograničenih podataka kategoriziranih po temi i neograničenih klijenata da se pretplate na jednu temu od MQTT brokera. Drugo, nisam kvalifikovan da detaljno raspravljam o MQTT-u. MQTT sam ponekad upoznao prošle godine (2017.) kada sam slijedio upute za postavljanje meteorološke stanice i senzora koristeći Node-RED. U svakom slučaju, potrudit ću se da vam predočim neke informacije. Još jedno dobro mjesto za početak je Wikipedia.

Ako nemate vremena za čitanje o teoriji, a htjeli ste postaviti MQTT brokera, objavio sam još jedan vodič samo zato. Potražite ovaj post i pomaknite se dolje do koraka 4.

Da bih objasnio šta je telemetrijski transport poruka čekanja u redu poruka (MQTT) po mom razumijevanju, pripremio sam gornji dijagram. Ukratko, MQTT je ISO standard, a proizvod kao što su komarac protiv komaraca i komarac protiv klijenata, dva paketa koje sam koristio za izradu brokera MQTT na Raspberry Pi-u, moraju biti u skladu s tim standardom. MQTT posrednik tada postaje medij za izdavače da ubace poruku i pretplatnike da slušaju ciljanu temu.

Kombinacija Arduino PubSubclient biblioteke s ArduinoJsonom, zahvaljujući svom tvorcu knolleary i bblanchon, olakšava tinkerima i programerima skup alata od senzora do ciljane opreme ili krajnjeg klijenta.

Nastavite s kreiranjem baze podataka i prikažite neke podatke.

Korak 3: Spremite podatke u SQL i prikažite ih na web poslužitelju

Spremite podatke u SQL i prikažite ih na web poslužitelju
Spremite podatke u SQL i prikažite ih na web poslužitelju
Spremite podatke u SQL i prikažite ih na web poslužitelju
Spremite podatke u SQL i prikažite ih na web poslužitelju

Koristio sam sqlite3 za kreiranje baze podataka za web poslužitelj. Instalirajte sqlite3 u Rapberry Pi:

sudo apt-get install sqlite3

stvorio bazu podataka i tablicu upisivanjem u terminal:

sqlite3 weatherstation.db

CREATE TABLE weatherdata (id INT PRIMARY KEY, thetime DATETIME, ldr INT, tls2561 INT, ds18b20 REAL, tsht21 REAL, hsht21 REAL);

.exit // za izlaz iz sqlite naredbenog retka i povratak na Linux terminal

Da bih poslušao temu koju je objavila meteorološka stanica, koristio sam Paho biblioteku s Pythonom:

#! /usr/bin/python3# usvojeno iz: > # 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.

Preporučuje se: