Mục lục:

Trạm thời tiết: ESP8266 Với chế độ Ngủ sâu, SQL, Vẽ đồ thị bằng Flask & Plotly: 3 bước
Trạm thời tiết: ESP8266 Với chế độ Ngủ sâu, SQL, Vẽ đồ thị bằng Flask & Plotly: 3 bước

Video: Trạm thời tiết: ESP8266 Với chế độ Ngủ sâu, SQL, Vẽ đồ thị bằng Flask & Plotly: 3 bước

Video: Trạm thời tiết: ESP8266 Với chế độ Ngủ sâu, SQL, Vẽ đồ thị bằng Flask & Plotly: 3 bước
Video: [ESP8266]: HẸN GIỜ SỬ DỤNG WIFI VÀ FIREBASE 2024, Tháng mười một
Anonim
Trạm thời tiết: ESP8266 Với Ngủ sâu, SQL, Vẽ đồ thị bằng Flask & Plotly
Trạm thời tiết: ESP8266 Với Ngủ sâu, SQL, Vẽ đồ thị bằng Flask & Plotly

Điều đó có vui không khi biết nhiệt độ, độ ẩm hoặc cường độ ánh sáng trên ban công của bạn? Tôi biết tôi sẽ làm. Vì vậy, tôi đã tạo một trạm thời tiết đơn giản để thu thập dữ liệu như vậy. Các phần sau đây là các bước tôi đã thực hiện để xây dựng một.

Bắt đầu nào!

Bước 1: Trạm thời tiết với các cảm biến ánh sáng, nhiệt độ và độ ẩm

Trạm thời tiết có cảm biến ánh sáng, nhiệt độ và độ ẩm
Trạm thời tiết có cảm biến ánh sáng, nhiệt độ và độ ẩm
Trạm thời tiết có cảm biến ánh sáng, nhiệt độ và độ ẩm
Trạm thời tiết có cảm biến ánh sáng, nhiệt độ và độ ẩm
Trạm thời tiết có cảm biến ánh sáng, nhiệt độ và độ ẩm
Trạm thời tiết có cảm biến ánh sáng, nhiệt độ và độ ẩm
Trạm thời tiết có cảm biến ánh sáng, nhiệt độ và độ ẩm
Trạm thời tiết có cảm biến ánh sáng, nhiệt độ và độ ẩm

Khi tôi lên kế hoạch xây dựng một trạm thời tiết, tôi đã mơ ước có một trạm thời tiết chính thức có tốc độ gió, đo mưa, cảm biến năng lượng mặt trời toàn phổ, nhưng hóa ra, điều đó sẽ không hề rẻ và chi phí mua có thể kết thúc. lên ít nhất $ 100. Tôi đã từ bỏ các tùy chọn đầy đủ và bắt đầu xây dựng một cái với $ 10, nhiều hơn hoặc ít hơn. $ 10 là chi phí của các bộ phận cơ bản của trạm thời tiết như các bộ phận bên dưới.

Đây là các phần:

1. Thương hiệu ESP8266 Wemos có giá $ 2,39 chiếc trên Aliexpress. Tôi muốn giới thiệu thương hiệu Wemos vì EPS8266 của nó dễ lập trình, cập nhật hơn và có flash 4MB trở lên.

2. Wemos Charger-Boost Shield có giá $ 1,39 chiếc. Đây là một lợi ích khác khi sử dụng thương hiệu này. Nó có một bo mạch tăng cường cho pin Lithium (điện áp danh định = 3,7V) lên 5V cho ESP8266. Bo mạch cũng đi kèm với tùy chọn sạc với dòng sạc tối đa = 1M.

* Lưu ý: Có một tùy chọn rẻ hơn để sạc / tăng cường pin Lithium. Cái này có giá $ 1,77 cho 5 chiếc. Tuy nhiên, khi tôi sử dụng bảng này cho ESP8266 (của Wemos hoặc ESP8266 trần), chế độ ngủ sâu của ESP8266 đã kích hoạt thiết lập lại ngay sau khi đặt ESP8266 trong một vòng lặp của giấc ngủ-đặt lại-ngủ, điều này rất khó chịu. Nếu bạn biết chuyện gì đang xảy ra, hãy inbox cho tôi.

3. Wemos cũng có một số tấm chắn nhiệt độ và độ ẩm nhưng tôi sẽ xây dựng từ các thành phần riêng lẻ. Điện trở quang (hoặc điện trở phụ thuộc ánh sáng - ldr, giá rẻ), cảm biến độ sáng như BH1780 hoặc TSL2561 (khoảng 0,87-0,89c chiếc), cảm biến nhiệt độ chẳng hạn như DS18B20 (75c mỗi chiếc) và kết hợp độ ẩm và nhiệt độ như DHT22 ($ 2,35 tại đây) hoặc SHT21 ($ 2,20 tại đây). Tổng chi phí cho cảm biến ~ $ 4.

4. Pin Lithium. Tôi đã trục vớt được một chiếc từ Pin Canon 7,4V, là hai pin 3.7V mắc nối tiếp hoặc pin Lithium 18650. Mỗi chiếc 18650 có giá khoảng 5 đô la một chiếc. Tôi có một bức ảnh cho thấy bộ pin máy ảnh bị xé nhỏ. Tuy nhiên, hãy cẩn thận, đoản mạch khi cắt qua lớp vỏ nhựa có thể tạo ra nhiệt độ cực cao và gây bỏng.

5. Bảng mạch PCB, jumper, dây, hàn, thời gian của bạn, có thể một số kỹ năng gỡ lỗi.

Hãy để các thành phần dây với nhau theo sơ đồ trên.

Sau đó, hãy xem nhiệm vụ trong vòng lặp thiết lập. Nó chỉ đơn giản là một lần chạy các tác vụ và kết thúc bằng lệnh ngủ.

void setup () {Serial.begin (115200); Serial.println ("Nút bắt đầu có tên" + Chuỗi (SENSORNAME)); setup_wifi (); chậm trễ (100); Wire.begin (); pinMode (ldrPin, INPUT); SHT21.begin (); if (! tsl.begin ()) {Serial.print ("Không tìm thấy TSL2561"); trong khi (1); } delay (100); ldr = analogRead (ldrPin); tsl.enableAutoRange (true); tsl.setIntegrationTime (TSL2561_INTEGRATIONTIME_13MS); chậm trễ (100); sự_kiện cảm_tác; tsl.getEvent (& sự kiện); if (event.light) lux = event.light; else Serial.println ("Quá tải cảm biến");

h = SHT21.getHumidity ();

t = SHT21.getTempe Heat (); tempSensor.setWaitForConversion (sai); tempSensor.begin (); chậm trễ (100); if (tempSensor.getDeviceCount () == 0) {Serial.printf ("Không tìm thấy DS18x20 trên pin% d / n", ds18b20); Serial.flush (); chậm trễ (1000); } delay (100); tempSensor.requestTempe Nhiệt độ (); 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); chậm trễ (100); client.setServer (mqtt_server, mqtt_port); client.setCallback (gọi lại); kết nối lại (); chậm trễ (100); ESP.deepSleep (3e8); // 300 triệu micro giây, 300 giây, 5 phút; }

Trong khi gỡ lỗi hoặc thiết lập, hãy ra lệnh ESP.deepsleep () để đọc Serial liên tục. Như mọi khi, mã đầy đủ để tải lên ESP8266 được lưu trữ tại đây (GitHub).

Hãy nhớ đặt jumper giữa RST và D0 / GPIO16 để kích hoạt đánh thức sau một thời gian ngủ sâu.

Bây giờ, đã đến lúc tải mã bằng Arduino IDE lên ESP8266.

Bước 2: MQTT: Phương tiện linh hoạt để xuất bản và đăng ký dữ liệu

MQTT: Phương tiện linh hoạt để xuất bản và đăng ký dữ liệu
MQTT: Phương tiện linh hoạt để xuất bản và đăng ký dữ liệu
MQTT: Phương tiện linh hoạt để xuất bản và đăng ký dữ liệu
MQTT: Phương tiện linh hoạt để xuất bản và đăng ký dữ liệu

Đầu tiên, tôi ngày càng thích sử dụng MQTT để gửi và nhận dữ liệu qua các cảm biến và ứng dụng khách khác nhau trong nhà của mình. Đó là vì tính linh hoạt trong việc gửi dữ liệu không giới hạn được phân loại theo chủ đề và không giới hạn khách hàng đăng ký một chủ đề từ nhà môi giới MQTT. Thứ hai, tôi không đủ trình độ để thảo luận sâu về MQTT. Đôi khi tôi biết đến MQTT vào năm ngoái (2017) khi làm theo hướng dẫn thiết lập trạm thời tiết và cảm biến bằng Node-RED. Nhưng dù sao, tôi sẽ cố gắng hết sức để trình bày với bạn một số thông tin. Một nơi tốt để bắt đầu là Wikipedia.

Nếu bạn không có thời gian để đọc về lý thuyết và muốn thiết lập một nhà môi giới MQTT, tôi đã đăng một hướng dẫn khác chỉ để làm như vậy. Tra cứu bài đăng này và cuộn xuống Bước 4.

Để giải thích sự hiểu biết của tôi về Message Queueing Telemetry Transport (MQTT), tôi đã chuẩn bị một sơ đồ như trên. Tóm lại, MQTT là một tiêu chuẩn ISO và một sản phẩm như mosquitto và mosquitto-client, hai gói mà tôi đã sử dụng để xây dựng nhà môi giới MQTT trên Raspberry Pi, phải tuân theo tiêu chuẩn đó. Sau đó, nhà môi giới MQTT trở thành một phương tiện để các nhà xuất bản đưa thông điệp vào và người đăng ký lắng nghe một chủ đề mục tiêu.

Sự kết hợp của thư viện Arduino PubSubclient với ArduinoJson, nhờ vào trình tạo của nó và bblanchon, giúp người mày mò và nhà phát triển dễ dàng hơn cho một bộ công cụ từ cảm biến đến thiết bị mục tiêu hoặc máy khách cuối.

Hãy tiếp tục với việc tạo Cơ sở dữ liệu và hiển thị một số dữ liệu.

Bước 3: Lưu dữ liệu vào SQL và hiển thị chúng trên máy chủ web

Lưu dữ liệu vào SQL và hiển thị chúng trên máy chủ web
Lưu dữ liệu vào SQL và hiển thị chúng trên máy chủ web
Lưu dữ liệu vào SQL và hiển thị chúng trên máy chủ web
Lưu dữ liệu vào SQL và hiển thị chúng trên máy chủ web

Tôi đã sử dụng sqlite3 để tạo cơ sở dữ liệu cho máy chủ web. Cài đặt sqlite3 trong Rapberry Pi bằng cách:

sudo apt-get install sqlite3

đã tạo cơ sở dữ liệu và bảng bằng cách nhập vào thiết bị đầu cuối:

sqlite3 weatherstation.db

TẠO dữ liệu thời tiết BẢNG (id INT PRIMARY KEY, thetime DATETIME, ldr INT, tls2561 INT, ds18b20 REAL, tsht21 REAL, hsht21 REAL);

.exit // để thoát khỏi dòng lệnh sqlite và quay lại thiết bị đầu cuối Linux

Để nghe một chủ đề được xuất bản bởi trạm thời tiết, tôi đã sử dụng thư viện Paho với Python:

#! / usr / bin / python3 # được thông qua từ: > # 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.

Đề xuất: