Turinys:

Meteorologinė stotis: ESP8266 su giliu miego režimu, SQL, grafinis kolbos ir grafinis grafikas: 3 žingsniai
Meteorologinė stotis: ESP8266 su giliu miego režimu, SQL, grafinis kolbos ir grafinis grafikas: 3 žingsniai

Video: Meteorologinė stotis: ESP8266 su giliu miego režimu, SQL, grafinis kolbos ir grafinis grafikas: 3 žingsniai

Video: Meteorologinė stotis: ESP8266 su giliu miego režimu, SQL, grafinis kolbos ir grafinis grafikas: 3 žingsniai
Video: Weather Station with ESP8266-WiFi 2024, Liepa
Anonim
Orų stotis: ESP8266 su giliu miego režimu, SQL, „Flask & Plotly“grafika
Orų stotis: ESP8266 su giliu miego režimu, SQL, „Flask & Plotly“grafika

Ar būtų smagu sužinoti temperatūrą, drėgmę ar šviesos intensyvumą jūsų balkone? Žinau, kad norėčiau. Taigi aš sukūriau paprastą orų stotį tokiems duomenims surinkti. Tolesniuose skyriuose aprašomi žingsniai, kuriuos aš ėmiausi kurdamas.

Pradėkime!

1 žingsnis: orų stotis su šviesos, temperatūros ir drėgmės jutikliais

Orų stotis su šviesos, temperatūros ir drėgmės jutikliais
Orų stotis su šviesos, temperatūros ir drėgmės jutikliais
Orų stotis su šviesos, temperatūros ir drėgmės jutikliais
Orų stotis su šviesos, temperatūros ir drėgmės jutikliais
Orų stotis su šviesos, temperatūros ir drėgmės jutikliais
Orų stotis su šviesos, temperatūros ir drėgmės jutikliais
Orų stotis su šviesos, temperatūros ir drėgmės jutikliais
Orų stotis su šviesos, temperatūros ir drėgmės jutikliais

Kai planavau statyti orų stotį, svajojau turėti visavertę orų stotį, kurioje būtų vėjo greitis, lietaus matavimas, viso spektro saulės jutiklis, bet paaiškėjo, kad tai nebus pigu, o pirkimo kaina gali baigtis pakils bent 100 USD. Aš atsisakiau visų variantų ir pradėjau kurti vieną su 10 USD, daugiau ar mažiau. 10 USD yra pagrindinių orų stoties komponentų kaina, kaip nurodyta toliau.

Čia yra dalys:

1. ESP8266 „Wemos“prekės ženklas „Aliexpress“kainuoja 2,39 USD. Aš rekomenduočiau „Wemos“prekės ženklą, nes jo EPS8266 yra lengviau programuojamas, atnaujinamas ir turi 4 MB ar daugiau blykstės.

2. „Wemos Charger-Boost Shield“kainuoja 1,39 USD. Tai dar vienas šio prekės ženklo pranašumas. Jame yra papildoma ličio baterijos plokštė (vardinė įtampa = 3,7 V) iki 5 V, skirta ESP8266. Plokštėje taip pat yra įkrovimo galimybė, kurios maksimali įkrovimo srovė = 1M.

*Pastaba: yra pigesnė ličio baterijos įkrovimo/padidinimo galimybė. Tai kainuoja 1,77 USD už 5 vnt. Tačiau kai aš naudojau šią plokštę ESP8266 („Wemos“arba plikam ESP8266), ESP8266 gilaus miego režimas suaktyvino atstatymą iškart po to, kai padarėte ESP8266 miego-atstatymo-miego cikle, o tai labai erzina. Jei žinote, kas vyksta, parašykite man.

3. „Wemos“taip pat turi keletą skydų temperatūrai ir drėgmei, bet aš ketinu kurti iš atskirų komponentų. Fotorezistorius (arba nuo šviesos priklausantis rezistorius-ldr, pigus), šviesumo jutiklis, toks kaip BH1780 arba TSL2561 (apie 0,87-0,89 c vnt.), Temperatūros jutiklis, pvz., DS18B20 (kiekvienas 75c), ir drėgmės bei temperatūros derinys, pvz. DHT22 (čia 2,35 USD) arba SHT21 (2,20 USD čia). Bendra jutiklio kaina ~ 4 USD.

4. Ličio baterija. Vieną išgelbėjau iš 7,4 V „Canon“baterijos, kuri yra dvi nuoseklios 3,7 V baterijos arba 18650 ličio baterijos. Kiekvienas 18650 kainuoja apie 5 USD už vienetą. Turiu nuotrauką, kurioje pavaizduotas fotoaparato akumuliatoriaus blokas. Tačiau būkite atsargūs, trumpas jungimas pjaunant plastikinį dangtelį gali sukelti didžiulę šilumą ir sudeginti.

5. PCB plokštė, trumpiklis, viela, litavimas, jūsų laikas, galbūt kai kurie derinimo įgūdžiai.

Leiskite vielos komponentams kartu laikytis aukščiau pateiktos schemos.

Tada ieškokite užduoties sąrankos cikle. Tai tiesiog vienas užduočių vykdymas ir baigiasi miego komanda.

void setup () {Serial.begin (115200); Serial.println ("Pradinis mazgas pavadintas" + eilutė (SENSORNAME)); „setup_wifi“(); vėlavimas (100); Wire.begin (); pinMode (ldrPin, INPUT); SHT21.begin (); if (! tsl.begin ()) {Serial.print ("TSL2561 nerastas"); tuo tarpu (1); } uždelsimas (100); ldr = analogRead (ldrPin); tsl.enableAutoRange (tiesa); tsl.setIntegrationTime (TSL2561_INTEGRATIONTIME_13MS); vėlavimas (100); sensor_event_t įvykis; tsl.getEvent (& event); jei (įvykio šviesa) liuksas = įvykis.šviesa; else Serial.println ("Jutiklio perkrova");

h = SHT21.getHumidity ();

t = SHT21.getTemperature (); tempSensor.setWaitForConversion (klaidinga); tempSensor.begin (); vėlavimas (100); if (tempSensor.getDeviceCount () == 0) {Serial.printf ("DS18x20 nerastas kaištyje %d / n", ds18b20); Serial.flush (); vėlavimas (1000); } uždelsimas (100); tempSensor.requestTemperatures (); t18 = tempSensor.getTempCByIndex (0); Serial.printf ("\ nŠviesa: %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); vėlavimas (100); client.setServer (mqtt_server, mqtt_port); client.setCallback (atšaukimas); prisijungti iš naujo (); vėlavimas (100); ESP.deepSleep (3e8); // 300 milijonų mikro sekundžių, 300 sekundžių, 5 minučių; }

Derindami arba nustatydami nurodykite ESP.deepsleep (), kad serijinis nuskaitymas būtų nuolatinis. Kaip visada, visas kodas, kurį reikia įkelti į ESP8266, yra priglobtas čia („GitHub“).

Nepamirškite uždėti trumpiklio tarp RST ir D0/GPIO16, kad suaktyvintumėte po tam tikro gilaus miego laikotarpio.

Dabar laikas įkelti kodą naudojant „Arduino IDE“į ESP8266.

2 žingsnis: MQTT: lanksti terpė duomenims skelbti ir prenumeruoti

MQTT: lanksti terpė skelbti ir prenumeruoti duomenis
MQTT: lanksti terpė skelbti ir prenumeruoti duomenis
MQTT: lanksti terpė skelbti ir prenumeruoti duomenis
MQTT: lanksti terpė skelbti ir prenumeruoti duomenis

Pirma, aš vis labiau mėgstu naudoti MQTT, kad galėčiau siųsti ir gauti duomenis iš įvairių namų jutiklių ir klientų. Taip yra todėl, kad galima lanksčiai siųsti neribotus duomenis, suskirstytus pagal temą, ir neribotą klientų skaičių užsisakyti vieną temą iš MQTT brokerio. Antra, nesu kvalifikuotas išsamiai aptarti MQTT. Praėjusiais metais (2017 m.) Kartais susipažinau su MQTT, kai sekiau pamokas, kaip sukurti orų stotį ir jutiklius naudojant „Node-RED“. Bet kokiu atveju, aš pasistengsiu jums pateikti šiek tiek informacijos. Kita gera vieta pradėti yra „Wikipedia“.

Jei neturite laiko skaityti apie teoriją ir norite įsteigti MQTT brokerį, aš paskelbiau kitą vadovėlį, kad tai padarytumėte. Peržiūrėkite šį įrašą ir slinkite žemyn iki 4 veiksmo.

Norėdami paaiškinti, kas, mano supratimu, yra pranešimų eilės telemetrijos transportas (MQTT), aš paruošiau diagramą, kaip nurodyta aukščiau. Trumpai tariant, MQTT yra ISO standartas, o toks produktas kaip uodai ir uodai-klientas, du paketai, kuriuos naudojau, sukūrė „MQTT“brokerį „Raspberry Pi“, turi atitikti šį standartą. Tada „MQTT“brokeris tampa terpė leidėjams, norintiems nusiųsti pranešimą, o abonentams - klausytis tikslinės temos.

„Arduino PubSubclient“bibliotekos ir „ArduinoJson“bibliotekos derinys, sukurtas naudojant „knolleary“ir „bblanchon“, palengvina meistrams ir kūrėjams įrankių rinkinį nuo jutiklių iki tikslinės įrangos ar galutinio kliento.

Leiskite toliau kurti duomenų bazę ir rodyti kai kuriuos duomenis.

3 veiksmas: išsaugokite duomenis SQL ir rodykite juos žiniatinklio serveryje

Išsaugokite duomenis SQL ir rodykite juos žiniatinklio serveryje
Išsaugokite duomenis SQL ir rodykite juos žiniatinklio serveryje
Išsaugokite duomenis SQL ir rodykite juos žiniatinklio serveryje
Išsaugokite duomenis SQL ir rodykite juos žiniatinklio serveryje

Norėdami sukurti žiniatinklio serverio duomenų bazę, naudoju sqlite3. Įdiekite „sqlite3“į „Rapberry Pi“:

sudo apt-get install sqlite3

sukūrė duomenų bazę ir lentelę, įvesdami terminalą:

sqlite3 oro stotis.db

KURTI LENTELĖS orų duomenis (ID INT PIRMINIS RAKTAS, laikas DATETIME, ldr INT, tls2561 INT, ds18b20 REAL, tsht21 REAL, hsht21 REAL);

.exit // išeiti iš komandinės eilutės sqlite ir grįžti į Linux terminalą

Norėdami klausytis orų stoties paskelbtos temos, aš naudoju „Paho“biblioteką su „Python“:

#! /usr/bin/python3# priimtas iš: > # 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.

Rekomenduojamas: