Sadržaj:

Meteorološka postaja: ESP8266 s dubokim mirovanjem, SQL, grafički prikaz prema tikvici i plocici: 3 koraka
Meteorološka postaja: ESP8266 s dubokim mirovanjem, SQL, grafički prikaz prema tikvici i plocici: 3 koraka

Video: Meteorološka postaja: ESP8266 s dubokim mirovanjem, SQL, grafički prikaz prema tikvici i plocici: 3 koraka

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

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

Započnimo!

Korak 1: Meteorološka stanica sa senzorima svjetla, 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 izgraditi meteorološku stanicu, 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 bi bilo jeftino, a troškovi kupnje mogli bi prestati barem 100 USD. Odustao sam od svih mogućnosti i počeo graditi jednu s manje -više 10 dolara. 10 USD je trošak osnovnih komponenti meteorološke postaje kao donji dijelovi.

Evo dijelova:

1. Marka ESP8266 Wemos košta 2,39 USD po kom na Aliexpressu. Preporučio bih robnu marku Wemos jer je njezin EPS8266 lakše programirati, ažurirati i imati flash memorije 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 pojačavanje litijeve baterije (nominalni napon = 3,7 V) na 5 V za ESP8266. Ploča također dolazi s opcijom punjenja s maksimalnom strujom punjenja = 1M.

*Napomena: Postoji jeftinija opcija za punjenje/pojačavanje litijeve baterije. Ovaj košta 1,77 USD za 5 komada. Međutim, kada sam ovu ploču koristio za ESP8266 (bilo Wemosov ili goli 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 što se događa, javite mi se u inbox.

3. Wemos također ima nekoliko štitova za temperaturu i vlagu, ali napravit ću ih od pojedinačnih komponenti. Fotootpornik (ili otpornik ovisan o svjetlu-ldr, jeftino), osjetnik svjetline kao što je BH1780 ili TSL2561 (oko 0,87-0,89 c kom), temperaturni osjetnik poput DS18B20 (svaki po 75 c) i kombinacija vlažnosti i temperature, npr. DHT22 (2,35 USD ovdje) ili SHT21 (2,20 USD ovdje). Ukupni trošak za senzor ~ 4 USD.

4. Litijeva baterija. Jednu sam spasio iz 7.4V Canon baterije, dvije serijske baterije od 3.7V ili 18650 litijske baterije. 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 pogrešaka.

Neka žice zajedno 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 milijuna mikro sekundi, 300 sekundi, 5 minuta; }

Tijekom ispravljanja pogreš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 svom domu. To je zbog fleksibilnosti slanja neograničenih podataka kategoriziranih po temi i neograničenih klijenata da se pretplate na jednu temu od posrednika MQTT. Drugo, nisam kvalificiran za dublje raspravljanje o MQTT-u. MQTT sam ponekad upoznao prošle godine (2017.) kada sam slijedio upute za postavljanje meteorološke postaje i senzora pomoću Node-RED-a. U svakom slučaju, potrudit ću se predočiti vam neke podatke. 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 4. koraka.

Da bih objasnio što je telemetrijski transport poruka čekanja u redu poruka (MQTT) po mom shvaćanju, pripremio sam gornji dijagram. Ukratko, MQTT je ISO standard, a proizvod kao što je komarac protiv komaraca i komarac protiv komaraca, dva paketa koja 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 u koje će poslati poruku, a pretplatnici za slušanje ciljane teme.

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

Idemo dalje s izradom baze podataka i prikazom nekih podataka.

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 stvaranje 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

IZRADI TABLICU vremenske podatke (id INT PRIMARNI KLJUČ, vrijeme 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 postaja, koristio sam Paho biblioteku s Pythonom:

#! /usr/bin/python3# preuzeto 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čeni: