Talaan ng mga Nilalaman:

Istasyon ng Panahon: ESP8266 Sa Malalim na Pagtulog, SQL, Graphing ni Flask & Plotly: 3 Hakbang
Istasyon ng Panahon: ESP8266 Sa Malalim na Pagtulog, SQL, Graphing ni Flask & Plotly: 3 Hakbang

Video: Istasyon ng Panahon: ESP8266 Sa Malalim na Pagtulog, SQL, Graphing ni Flask & Plotly: 3 Hakbang

Video: Istasyon ng Panahon: ESP8266 Sa Malalim na Pagtulog, SQL, Graphing ni Flask & Plotly: 3 Hakbang
Video: ESP8266 ESP01 WIFI Mobile Phone Control | LDmicro-Roboremo Programming 2024, Hulyo
Anonim
Istasyon ng Panahon: ESP8266 Na May Malalim na Pagtulog, SQL, Graphing ni Flask & Plotly
Istasyon ng Panahon: ESP8266 Na May Malalim na Pagtulog, SQL, Graphing ni Flask & Plotly

Nakatutuwa bang malaman ang temperatura, halumigmig, o gaanong ilaw sa iyong balkonahe? Alam kong gagawin ko. Kaya gumawa ako ng isang simpleng istasyon ng panahon upang mangolekta ng nasabing data. Ang mga sumusunod na seksyon ay ang mga hakbang na kinuha ko upang makabuo ng isa.

Magsimula na tayo!

Hakbang 1: Station ng Panahon na May Mga Sensor ng Magaan, Temperatura at Humidity

Istasyon ng Panahon Na May Mga Sensor ng Magaan, Temperatura at Humidity
Istasyon ng Panahon Na May Mga Sensor ng Magaan, Temperatura at Humidity
Istasyon ng Panahon Na May Mga Sensor ng Magaan, Temperatura at Humidity
Istasyon ng Panahon Na May Mga Sensor ng Magaan, Temperatura at Humidity
Istasyon ng Panahon Na May Mga Sensor ng Magaan, Temperatura at Humidity
Istasyon ng Panahon Na May Mga Sensor ng Magaan, Temperatura at Humidity
Istasyon ng Panahon Na May Mga Sensor ng Magaan, Temperatura at Humidity
Istasyon ng Panahon Na May Mga Sensor ng Magaan, Temperatura at Humidity

Nang balak kong magtayo ng isang istasyon ng panahon, nangangarap akong magkaroon ng isang ganap na istasyon ng panahon na may bilis ng hangin, pagsukat ng ulan, full-spectrum solar sensor, ngunit naging hindi ito mura, at maaaring matapos ang gastos sa pagbili hanggang sa $ 100. Sinuko ko ang buong mga pagpipilian at nagsimulang bumuo ng isa na may $ 10, higit pa o mas kaunti. Ang $ 10 ay ang gastos ng mga pangunahing bahagi ng istasyon ng panahon tulad ng mga bahagi sa ibaba.

Narito ang mga bahagi:

1. Ang tatak ng ESP8266 Wemos ay nagkakahalaga ng $ 2.39 mga pcs sa Aliexpress. Inirerekumenda ko ang tatak ng Wemos dahil ang EPS8266 nito ay mas madaling i-program, i-update, at magkaroon ng 4MB flash o higit pa.

2. Ang Wemos Charger-Boost Shield ay nagkakahalaga ng $ 1.39 pcs. Ito ay isa pang pakinabang upang magamit ang tatak na ito. Mayroon itong isang boost-up board para sa baterya ng Lithium (nominal boltahe = 3.7V) sa isang 5V para sa ESP8266. Ang board ay may kasamang pagpipilian sa pagsingil na may isang kasalukuyang pagsingil ng maximum = 1M.

* Tandaan: Mayroong isang mas murang opsyon para sa pag-charge / pagpapalakas ng baterya ng Lithium. Ang isang ito ay nagkakahalaga ng $ 1.77 para sa 5pcs. Gayunpaman, nang ginamit ko ang board na ito para sa ESP8266 (alinman sa Wemos's o isang hubad na ESP8266), ang mode ng deep-sleep ng ESP8266 ay nagpalitaw ng isang pag-reset pagkatapos na gawin ang ESP8266 sa isang loop ng sleep-reset-sleep, na kung saan ay nakakainis. Kung alam mo kung anong nangyayari, mangyaring inbox ako.

3. Ang Wemos ay mayroon ding maraming mga kalasag para sa temperatura at halumigmig ngunit magtatayo ako mula sa mga indibidwal na sangkap. Photoresistor (o light-dependant resistor - ldr, mura), isang sensor ng luminosity tulad ng BH1780 o TSL2561 (mga 0.87-0.89c pcs), isang sensor ng temperatura tulad ng DS18B20 (75c bawat isa), at isang combo ng temperatura at temperatura tulad ng DHT22 ($ 2.35 dito) o SHT21 ($ 2.20 dito). Isang kabuuang gastos para sa sensor ~ $ 4.

4. Baterya ng lithium. Iniligtas ko ang isa mula sa isang 7.4V Canon Battery na kung saan ay dalawang 3.7V na baterya sa serye o 18650 na baterya ng Lithium. Ang bawat 18650 ay nagkakahalaga ng halos $ 5 bawat piraso. Mayroon akong isang larawan ipakita ang luha-down ang camera baterya pack. Gayunpaman, mag-ingat, ang maikling pag-ikot kapag pinutol ang takip na plastik ay maaaring makabuo ng matinding init, at masunog.

5. PCB board, jumper, wire, paghihinang, iyong oras, marahil ilang mga kasanayan sa pag-debug.

Hayaan ang mga bahagi ng kawad na magkakasunod na sumusunod sa eskematiko sa itaas.

Pagkatapos, tingnan ang gawain sa loop ng pag-setup. Ito ay simpleng isang-run ng mga gawain at nagtatapos sa pamamagitan ng isang utos sa pagtulog.

void setup () {Serial.begin (115200); Serial.println ("Simula sa Node na pinangalanang" + String (SENSORNAME)); setup_wifi (); pagkaantala (100); Wire.begin (); pinMode (ldrPin, INPUT); SHT21.begin (); kung (! tsl.begin ()) {Serial.print ("hindi nahanap ang TSL2561"); habang (1); } pagkaantala (100); ldr = analogRead (ldrPin); tsl.enableAutoRange (totoo); tsl.setIntegrationTime (TSL2561_INTEGRATIONTIME_13MS); pagkaantala (100); kaganapan ng sensors_event_t; tsl.getEvent (& kaganapan); kung (event.light) lux = event.light; kung hindi man Serial.println ("Sensor overload");

h = SHT21.getHumidity ();

t = SHT21.getTemperature (); tempSensor.setWaitForConversion (false); tempSensor.begin (); pagkaantala (100); kung (tempSensor.getDeviceCount () == 0) {Serial.printf ("DS18x20 hindi natagpuan sa pin% d / n", ds18b20); Serial.flush (); pagkaantala (1000); } pagkaantala (100); tempSensor.requestTemperature (); t18 = tempSensor.getTempCByIndex (0); Serial.printf ("\ nLight:% 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); pagkaantala (100); client.setServer (mqtt_server, mqtt_port); client.setCallback (callback); ikonekta muli (); pagkaantala (100); ESP.deepS Sleep (3e8); // 300 milyong micro segundo, 300 segundo, 5 minuto; }

Sa panahon ng pag-debug o pag-set up, utusan ang ESP.deeps Sleep () upang patuloy na magpatuloy sa pagbasa ng Serial. Tulad ng dati, ang buong code upang mai-upload sa ESP8266 ay naka-host dito (GitHub).

Tandaan na ilagay sa jumper sa pagitan ng RST at D0 / GPIO16 para sa pag-agaw ng paggising pagkatapos ng isang panahon ng mahimbing na pagtulog.

Ngayon, oras upang mai-upload ang code gamit ang Arduino IDE sa ESP8266.

Hakbang 2: MQTT: isang Flexible Medium upang Mag-publish at Mag-subscribe ng Data

MQTT: isang Flexible Medium upang Mag-publish at Mag-subscribe ng Data
MQTT: isang Flexible Medium upang Mag-publish at Mag-subscribe ng Data
MQTT: isang Flexible Medium upang Mag-publish at Mag-subscribe ng Data
MQTT: isang Flexible Medium upang Mag-publish at Mag-subscribe ng Data

Una, nasisiyahan ako sa paggamit ng MQTT upang magpadala at makatanggap ng data sa iba't ibang mga sensor at kliyente sa aking tahanan. Iyon ay dahil ang kakayahang umangkop upang magpadala ng walang limitasyong data na ikinategorya ng isang paksa, at walang limitasyong mga kliyente upang mag-subscribe sa isang paksa mula sa isang MQTT broker. Pangalawa, hindi ako kwalipikadong talakayin nang malalim ang MQTT. Nalaman ko ang MQTT minsan noong nakaraang taon (2017) kapag sumusunod sa mga tutorial upang mag-set up ng isang istasyon ng panahon at mga sensor gamit ang Node-RED. Gayunpaman, susubukan ko ang aking makakaya upang maipakita sa iyo ang ilang impormasyon. Ang isa pang magandang lugar upang magsimula ay ang Wikipedia.

Kung wala kang oras upang mabasa ang tungkol sa teorya, at nais na mag-set up ng isang MQTT broker, nag-post ako ng isa pang tutorial upang magawa ito. Hanapin ang post na ito, at mag-scroll pababa sa Hakbang 4.

Upang maipaliwanag kung ano ang Mensahe ng Queue Telemetry Transport (MQTT) sa aking pag-unawa, naghanda ako ng isang diagram tulad ng nasa itaas. Sa madaling sabi, ang MQTT ay isang pamantayang ISO, at isang produkto tulad ng mosquitto at mosquitto-client, dalawang pakete na ginamit ko ang pagbuo ng MQTT broker sa isang Raspberry Pi, kailangang sumunod sa pamantayang iyon. Ang MQTT broker pagkatapos ay naging isang medium para sa mga publisher upang itulak ang isang mensahe sa at mga tagasuskribi upang makinig sa isang target na paksa.

Ang kumbinasyon ng Arduino PubSubclient library na may ArduinoJson, salamat sa tagalikha nito na knolleary at bblanchon, ay ginagawang madali para sa mga tinker at developer para sa isang hanay ng mga tool mula sa mga sensor hanggang sa isang target na kagamitan o isang end client.

Hayaang magpatuloy sa paglikha ng Database at ipakita ang ilang data.

Hakbang 3: I-save ang Data sa SQL at Ipakita ang mga Ito sa isang Web Server

I-save ang Data sa SQL at Ipakita ang mga Ito sa isang Web Server
I-save ang Data sa SQL at Ipakita ang mga Ito sa isang Web Server
I-save ang Data sa SQL at Ipakita ang mga Ito sa isang Web Server
I-save ang Data sa SQL at Ipakita ang mga Ito sa isang Web Server

Gumamit ako ng sqlite3 upang lumikha ng isang database para sa web server. I-install ang sqlite3 sa Rapberry Pi sa pamamagitan ng:

sudo apt-get install sqlite3

lumikha ng isang database at isang talahanayan sa pamamagitan ng pagta-type sa terminal:

sqlite3 weatherstation.db

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

.exit // upang lumabas sa linya ng utos ng sqlite at bumalik sa terminal ng Linux

Upang makinig sa isang paksang inilathala ng istasyon ng panahon, gumamit ako ng isang Paho library na may Python:

#! / usr / bin / python3 # pinagtibay mula sa: > # 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.

Inirerekumendang: