Satura rādītājs:

Meteoroloģiskā stacija: ESP8266 ar dziļu miegu, SQL, grafiku ar kolbu un zīmējumu: 3 soļi
Meteoroloģiskā stacija: ESP8266 ar dziļu miegu, SQL, grafiku ar kolbu un zīmējumu: 3 soļi

Video: Meteoroloģiskā stacija: ESP8266 ar dziļu miegu, SQL, grafiku ar kolbu un zīmējumu: 3 soļi

Video: Meteoroloģiskā stacija: ESP8266 ar dziļu miegu, SQL, grafiku ar kolbu un zīmējumu: 3 soļi
Video: Arduino Nano, BME280 и SSD1306 OLED-метеостанция 2024, Jūlijs
Anonim
Meteoroloģiskā stacija: ESP8266 ar dziļu miegu, SQL, Glashing by Flask & Plotly
Meteoroloģiskā stacija: ESP8266 ar dziļu miegu, SQL, Glashing by Flask & Plotly

Vai būtu jautri uzzināt jūsu balkona temperatūru, mitrumu vai gaismas intensitāti? Es zinu, ka gribētu. Tāpēc es izveidoju vienkāršu laika staciju, lai savāktu šādus datus. Nākamās sadaļas ir soļi, ko es veicu, lai to izveidotu.

Sāksim!

1. solis: laika stacija ar gaismas, temperatūras un mitruma sensoriem

Meteoroloģiskā stacija ar gaismas, temperatūras un mitruma sensoriem
Meteoroloģiskā stacija ar gaismas, temperatūras un mitruma sensoriem
Meteoroloģiskā stacija ar gaismas, temperatūras un mitruma sensoriem
Meteoroloģiskā stacija ar gaismas, temperatūras un mitruma sensoriem
Meteoroloģiskā stacija ar gaismas, temperatūras un mitruma sensoriem
Meteoroloģiskā stacija ar gaismas, temperatūras un mitruma sensoriem
Meteoroloģiskā stacija ar gaismas, temperatūras un mitruma sensoriem
Meteoroloģiskā stacija ar gaismas, temperatūras un mitruma sensoriem

Kad es plānoju būvēt meteoroloģisko staciju, es sapņoju, ka man ir pilnvērtīga meteostacija, kurā ir vēja ātrums, lietus mērīšana, pilna spektra saules sensors, bet izrādījās, ka tas nebūtu lēti, un pirkuma izmaksas varētu beigties vismaz $ 100. Es atteicos no visām iespējām un sāku to veidot ar 10 USD, vairāk vai mazāk. 10 ASV dolāri ir laika stacijas pamata sastāvdaļu izmaksas, kā norādīts zemāk.

Šeit ir daļas:

1. ESP8266 Wemos zīmols Aliexpress maksā 2,39 USD. Es ieteiktu zīmolu Wemos, jo tā EPS8266 ir vieglāk ieprogrammēt, atjaunināt un tam ir 4 MB zibatmiņa vai vairāk.

2. Wemos Charger-Boost Shield maksā 1,39 USD. Šī ir vēl viena priekšrocība šī zīmola izmantošanai. Tam ir palielinājuma plāksne litija akumulatoram (nominālais spriegums = 3,7 V) līdz 5 V ESP8266. Plātnei ir arī uzlādes iespēja ar maksimālo uzlādes strāvu = 1M.

*Piezīme: ir lētāka litija akumulatora uzlādes/palielināšanas iespēja. Šis maksā 1,77 USD par 5 gab. Tomēr, kad es izmantoju šo dēli ESP8266 (vai nu Wemos, vai tukšam ESP8266), ESP8266 dziļā miega režīms aktivizēja atiestatīšanu uzreiz pēc ESP8266 izveides miega-atiestatīšanas miega režīmā, kas ir ļoti kaitinoši. Ja jūs zināt, kas notiek, lūdzu, iesūtiet man.

3. Wemos ir arī vairāki vairogi temperatūrai un mitrumam, bet es būvēšu no atsevišķiem komponentiem. Fotorezistors (vai no gaismas atkarīgs rezistors-ldr, lēti), spilgtuma sensors, piemēram, BH1780 vai TSL2561 (apmēram 0,87-0,89 c gab), temperatūras sensors, piemēram, DS18B20 (katrs 75 c), un mitruma un temperatūras kombinācija, piemēram, DHT22 ($ 2,35 šeit) vai SHT21 ($ 2,20 šeit). Sensora kopējās izmaksas ~ 4 USD.

4. Litija baterija. Es izglābu vienu no 7,4 V Canon akumulatora, kas ir divi sērijveida 3,7 V akumulatori vai 18650 litija akumulators. Katrs 18650 maksā apmēram 5 USD gabalā. Man ir attēls, kurā redzama kameras akumulatora bloka nojaukšana. Tomēr esiet piesardzīgs, īssavienojums, griežot cauri plastmasas vākam, var radīt ārkārtēju karstumu un sadedzināt.

5. PCB plate, džemperis, stieple, lodēšana, jūsu laiks, varbūt dažas atkļūdošanas prasmes.

Ļaujiet vadu komponentiem kopā ievērot iepriekš minēto shēmu.

Pēc tam meklējiet uzdevumu iestatīšanas cilpā. Tas ir tikai viens uzdevumu izpilde un beidzas ar miega komandu.

void setup () {Serial.begin (115200); Serial.println ("Sākuma mezgls nosaukts" + virkne (SENSORNAME)); setup_wifi (); kavēšanās (100); Wire.begin (); pinMode (ldrPin, INPUT); SHT21.sākas (); if (! tsl.begin ()) {Serial.print ("TSL2561 nav atrasts"); kamēr (1); } kavēšanās (100); ldr = analogRead (ldrPin); tsl.enableAutoRange (true); tsl.setIntegrationTime (TSL2561_INTEGRATIONTIME_13MS); kavēšanās (100); sensor_event_t notikums; tsl.getEvent (& notikums); ja (notikums.gaismā) lux = notikums.gaismā; else Serial.println ("Sensora pārslodze");

h = SHT21.getHumidity ();

t = SHT21.getTemperature (); tempSensor.setWaitForConversion (nepatiess); tempSensor.begin (); kavēšanās (100); if (tempSensor.getDeviceCount () == 0) {Serial.printf ("DS18x20 nav atrasts uz pin %d / n", ds18b20); Serial.flush (); kavēšanās (1000); } kavēšanās (100); tempSensor.requestTemperatures (); t18 = tempSensor.getTempCByIndex (0); Serial.printf ("\ nGaisma: %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); kavēšanās (100); client.setServer (mqtt_server, mqtt_port); client.setCallback (atzvanīšana); atjaunot savienojumu (); kavēšanās (100); ESP.deepSleep (3e8); // 300 miljoni mikrosekundes, 300 sekundes, 5 minūtes; }

Atkļūdošanas vai iestatīšanas laikā izsūtiet komandu ESP.deepsleep (), lai nepārtraukti būtu sērijas rādījums. Kā vienmēr, šeit (GitHub) tiek mitināts viss kods, ko augšupielādēt ESP8266.

Neaizmirstiet uzvilkt džemperi starp RST un D0/GPIO16, lai aktivizētu pamošanos pēc dziļa miega perioda.

Tagad ir laiks augšupielādēt kodu, izmantojot Arduino IDE, uz ESP8266.

2. darbība: MQTT: elastīga vide datu publicēšanai un abonēšanai

MQTT: elastīga vide datu publicēšanai un abonēšanai
MQTT: elastīga vide datu publicēšanai un abonēšanai
MQTT: elastīga vide datu publicēšanai un abonēšanai
MQTT: elastīga vide datu publicēšanai un abonēšanai

Pirmkārt, man arvien vairāk patīk izmantot MQTT, lai nosūtītu un saņemtu datus no dažādiem sensoriem un klientiem savās mājās. Tas ir tāpēc, ka elastība var nosūtīt neierobežotus datus, kas klasificēti pēc tēmas, un neierobežots klientu skaits, lai abonētu vienu tēmu no MQTT brokera. Otrkārt, es neesmu kvalificēts, lai padziļināti apspriestu MQTT. Iepazinos ar MQTT dažreiz pagājušajā gadā (2017. gadā), kad sekoju pamācībām, lai izveidotu laika staciju un sensorus, izmantojot Node-RED. Jebkurā gadījumā es darīšu visu iespējamo, lai sniegtu jums informāciju. Vēl viena laba vieta, kur sākt, ir Wikipedia.

Ja jums nav laika lasīt par teoriju un vēlaties izveidot MQTT brokeri, es ievietoju citu pamācību, lai to izdarītu. Atrodiet šo ziņu un ritiniet uz leju līdz 4. darbībai.

Lai paskaidrotu, kas manā izpratnē ir ziņu rindas telemetrijas transports (MQTT), es sagatavoju diagrammu, kā norādīts iepriekš. Īsumā, MQTT ir ISO standarts, un tādam produktam kā moskītu un moskītu klients, diviem manis izmantotajiem iepakojumiem, kas izveido MQTT brokeri Raspberry Pi, ir jāatbilst šim standartam. Pēc tam MQTT brokeris kļūst par līdzekli izdevējiem, lai ievietotu ziņu, un abonenti - klausīties mērķa tēmu.

Arduino PubSubclient bibliotēkas kombinācija ar ArduinoJson, pateicoties tās veidotājam knolleary un bblanchon, atvieglo meistariem un izstrādātājiem rīku komplektu no sensoriem līdz mērķa aprīkojumam vai gala klientam.

Ļaujiet turpināt darbu, izveidojot datu bāzi un parādot dažus datus.

3. darbība: saglabājiet datus SQL un parādiet tos tīmekļa serverī

Saglabājiet datus SQL un parādiet tos tīmekļa serverī
Saglabājiet datus SQL un parādiet tos tīmekļa serverī
Saglabājiet datus SQL un parādiet tos tīmekļa serverī
Saglabājiet datus SQL un parādiet tos tīmekļa serverī

Es izmantoju sqlite3, lai izveidotu tīmekļa servera datu bāzi. Instalējiet sqlite3 Rapberry Pi:

sudo apt-get install sqlite3

izveidoja datubāzi un tabulu, ierakstot terminālī:

sqlite3 laika apstākļi.db

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

.exit // lai izietu no komandrindas sqlite un atgrieztos Linux terminālī

Lai klausītos meteostacijas publicēto tēmu, es izmantoju Paho bibliotēku ar Python:

#! /usr/bin/python3# pieņemts no: > # 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.

Ieteicams: