Isi kandungan:

Stesen Cuaca: ESP8266 Dengan Tidur Dalam, SQL, Membuat Grafik oleh Flask & Plotly: 3 Langkah
Stesen Cuaca: ESP8266 Dengan Tidur Dalam, SQL, Membuat Grafik oleh Flask & Plotly: 3 Langkah

Video: Stesen Cuaca: ESP8266 Dengan Tidur Dalam, SQL, Membuat Grafik oleh Flask & Plotly: 3 Langkah

Video: Stesen Cuaca: ESP8266 Dengan Tidur Dalam, SQL, Membuat Grafik oleh Flask & Plotly: 3 Langkah
Video: Monitoring Kondisi Cuaca Meliputi Kecepatan dan Arah Angin, Suhu, Arduino, WEB (Weather Monitoring) 2024, Julai
Anonim
Stesen Cuaca: ESP8266 Dengan Tidur Dalam, SQL, Membuat Grafik oleh Flask & Plotly
Stesen Cuaca: ESP8266 Dengan Tidur Dalam, SQL, Membuat Grafik oleh Flask & Plotly

Adakah itu menyenangkan untuk mengetahui suhu, kelembapan, atau intensiti cahaya di balkoni anda? Saya tahu saya akan. Oleh itu, saya membuat stesen cuaca sederhana untuk mengumpulkan data tersebut. Bahagian berikut adalah langkah yang saya ambil untuk membuatnya.

Mari kita mulakan!

Langkah 1: Stesen Cuaca Dengan Sensor Cahaya, Suhu dan Kelembapan

Stesen Cuaca Dengan Sensor Cahaya, Suhu dan Kelembapan
Stesen Cuaca Dengan Sensor Cahaya, Suhu dan Kelembapan
Stesen Cuaca Dengan Sensor Cahaya, Suhu dan Kelembapan
Stesen Cuaca Dengan Sensor Cahaya, Suhu dan Kelembapan
Stesen Cuaca Dengan Sensor Cahaya, Suhu dan Kelembapan
Stesen Cuaca Dengan Sensor Cahaya, Suhu dan Kelembapan
Stesen Cuaca Dengan Sensor Cahaya, Suhu dan Kelembapan
Stesen Cuaca Dengan Sensor Cahaya, Suhu dan Kelembapan

Semasa saya merancang untuk membina stesen cuaca, saya bermimpi untuk memiliki stesen cuaca lengkap yang mempunyai kelajuan angin, pengukuran hujan, sensor solar spektrum penuh, tetapi ternyata, itu tidak murah, dan kos pembelian dapat berakhir naik sekurang-kurangnya $ 100. Saya melepaskan pilihan penuh dan mula membinanya dengan $ 10, lebih kurang. $ 10 adalah kos komponen asas stesen cuaca seperti bahagian di bawah.

Berikut adalah bahagian-bahagiannya:

1. Jenama ESP8266 Wemos berharga $ 2.39 pcs di Aliexpress. Saya akan mengesyorkan jenama Wemos kerana EPS8266nya lebih mudah diprogramkan, dikemas kini, dan mempunyai denyar 4MB atau lebih.

2. Wemos Charger-Boost Shield berharga $ 1.39 pcs. Ini adalah satu lagi faedah untuk menggunakan jenama ini. Ia mempunyai papan peningkatan untuk bateri Lithium (voltan nominal = 3.7V) hingga 5V untuk ESP8266. Papan ini juga dilengkapi dengan pilihan pengecasan dengan arus pengecasan maksimum = 1M.

* Catatan: Terdapat pilihan yang lebih murah untuk pengisian / peningkatan bateri Lithium. Yang ini berharga $ 1.77 untuk 5 keping. Walau bagaimanapun, ketika saya menggunakan papan ini untuk ESP8266 (sama ada Wemos atau ESP8266 yang telanjang), mod tidur nyenyak ESP8266 memicu reset semula setelah menjadikan ESP8266 dalam gelung tidur-set semula-tidur, yang sangat menjengkelkan. Sekiranya anda tahu apa yang berlaku, sila masukkan saya.

3. Wemos juga mempunyai beberapa pelindung untuk suhu dan kelembapan tetapi saya akan membina dari komponen individu. Photoresistor (atau perintang bergantung cahaya - ldr, murah), sensor cahaya seperti BH1780 atau TSL2561 (kira-kira 0.87-0.89c pcs), sensor suhu seperti DS18B20 (masing-masing 75c), dan kombo kelembapan dan suhu seperti DHT22 ($ 2.35 di sini) atau SHT21 ($ 2.20 di sini). Jumlah kos untuk sensor ~ $ 4.

4. Bateri litium. Saya menyelamatkannya dari Bateri Canon 7.4V yang merupakan dua bateri 3.7V bersiri atau bateri Lithium 18650. Setiap 18650 berharga kira-kira $ 5 setiap satu. Saya mempunyai gambar menunjukkan pek bateri kamera meruntuhkan. Berhati-hatilah, litar pintas ketika memotong penutup plastik boleh menghasilkan panas yang melampau, dan terbakar.

5. Papan PCB, pelompat, wayar, pematerian, masa anda, mungkin beberapa kemahiran menyahpepijat.

Biarkan komponen wayar bersama-sama mengikuti skema di atas.

Kemudian, cari tugas dalam gelung persediaan. Ini hanya satu tugas dan dijalankan dengan perintah tidur.

persediaan tidak sah () {Serial.begin (115200); Serial.println ("Memulakan Node bernama" + String (SENSORNAME)); persediaan_wifi (); kelewatan (100); Wire.begin (); pinMode (ldrPin, INPUT); SHT21.begin (); jika (! tsl.begin ()) {Serial.print ("TSL2561 tidak dijumpai"); sementara (1); } kelewatan (100); ldr = analogRead (ldrPin); tsl.enableAutoRange (benar); tsl.setIntegrationTime (TSL2561_INTEGRATIONTIME_13MS); kelewatan (100); acara sensors_event_t; tsl.getEvent (& acara); jika (event.light) lux = event.light; lain Serial.println ("Sensor overload");

h = SHT21.getHumidity ();

t = SHT21.getTemperature (); tempSensor.setWaitForConversion (palsu); tempSensor.begin (); kelewatan (100); if (tempSensor.getDeviceCount () == 0) {Serial.printf ("DS18x20 tidak dijumpai pada pin% d / n", ds18b20); Serial.flush (); kelewatan (1000); } kelewatan (100); tempSensor.requestTemperatures (); 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); kelewatan (100); client.setServer (mqtt_server, mqtt_port); client.setCallback (panggilan balik); sambung semula (); kelewatan (100); ESP.deepSleep (3e8); // 300 juta mikro saat, 300 saat, 5 minit; }

Semasa melakukan penyahpepijatan atau penyiapan, perintah ESP.deepsleep () agar pembacaan Serial berterusan. Seperti biasa, kod penuh untuk dimuat naik ke ESP8266 dihoskan di sini (GitHub).

Ingatlah untuk memakai jumper antara RST dan D0 / GPIO16 kerana memicu terjaga setelah tidur nyenyak.

Sekarang, masa untuk memuat naik kod menggunakan Arduino IDE ke ESP8266.

Langkah 2: MQTT: Medium Fleksibel untuk Menerbitkan dan Melanggan Data

MQTT: Medium Fleksibel untuk Menerbitkan dan Melanggan Data
MQTT: Medium Fleksibel untuk Menerbitkan dan Melanggan Data
MQTT: Medium Fleksibel untuk Menerbitkan dan Melanggan Data
MQTT: Medium Fleksibel untuk Menerbitkan dan Melanggan Data

Pertama, saya semakin gemar menggunakan MQTT untuk menghantar dan menerima data di pelbagai sensor dan pelanggan di rumah saya. Ini kerana fleksibiliti untuk mengirim data tanpa had yang dikategorikan oleh topik, dan pelanggan tanpa had untuk melanggan satu topik dari broker MQTT. Kedua, saya tidak layak untuk membincangkan MQTT secara mendalam. Kadang-kadang saya mengenali MQTT tahun lalu (2017) ketika mengikuti tutorial untuk membina stesen cuaca dan sensor menggunakan Node-RED. Bagaimanapun, saya akan berusaha sebaik mungkin untuk menyampaikan beberapa maklumat kepada anda. Satu lagi tempat yang baik untuk memulakan ialah Wikipedia.

Sekiranya anda tidak mempunyai masa untuk membaca mengenai teori tersebut, dan ingin menubuhkan broker MQTT, saya menyiarkan tutorial lain untuk melakukannya. Cari catatan ini, dan tatal ke bawah ke Langkah 4.

Untuk menjelaskan apa itu Pengangkutan Telemetri Antrian Mesej (MQTT) dalam pemahaman saya, saya menyediakan rajah seperti di atas. Ringkasnya, MQTT adalah standard ISO, dan produk seperti mosquitto dan mosquitto-client, dua paket yang saya gunakan untuk membina broker MQTT pada Raspberry Pi, harus mematuhi standard tersebut. Broker MQTT kemudian menjadi media bagi penerbit untuk memasukkan mesej ke dalam dan pelanggan untuk mendengarkan topik sasaran.

Gabungan perpustakaan Arduino PubSubclient dengan ArduinoJson, terima kasih kepada knolleary dan bblanchon penciptanya, memudahkan para pengguna dan pengembang untuk sekumpulan alat dari sensor ke peralatan sasaran atau pelanggan akhir.

Mari teruskan dengan membuat Pangkalan Data dan memaparkan beberapa data.

Langkah 3: Simpan Data ke SQL dan Paparkannya di Pelayan Web

Simpan Data ke SQL dan Paparkannya di Pelayan Web
Simpan Data ke SQL dan Paparkannya di Pelayan Web
Simpan Data ke SQL dan Paparkannya di Pelayan Web
Simpan Data ke SQL dan Paparkannya di Pelayan Web

Saya menggunakan sqlite3 untuk membuat pangkalan data untuk pelayan web. Pasang sqlite3 di Rapberry Pi dengan:

sudo apt-get install sqlite3

membuat pangkalan data dan jadual dengan menaip ke terminal:

sqlite3 weatherstation.db

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

.exit // untuk keluar dari baris arahan sqlite dan kembali ke terminal Linux

Untuk mendengar topik yang diterbitkan oleh stesen cuaca, saya menggunakan perpustakaan Paho dengan Python:

#! / usr / bin / python3 # diterima pakai dari: > # 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.

Disyorkan: