Агуулгын хүснэгт:

Цаг уурын станц: ESP8266 нь гүн нойртой, SQL, колбо ба графикаар зураглах: 3 алхам
Цаг уурын станц: ESP8266 нь гүн нойртой, SQL, колбо ба графикаар зураглах: 3 алхам

Видео: Цаг уурын станц: ESP8266 нь гүн нойртой, SQL, колбо ба графикаар зураглах: 3 алхам

Видео: Цаг уурын станц: ESP8266 нь гүн нойртой, SQL, колбо ба графикаар зураглах: 3 алхам
Видео: Обзор домашняя метеостанция с выносным беспроводным датчиком 2024, Арваннэгдүгээр
Anonim
Цаг уурын станц: ESP8266 нь гүн нойртой, SQL, колбон ба графикаар зурагдсан
Цаг уурын станц: ESP8266 нь гүн нойртой, SQL, колбон ба графикаар зурагдсан

Тагтныхаа температур, чийгшил, гэрлийн эрчмийг мэдэх нь хөгжилтэй байх болов уу? Би чадна гэдгээ мэдэж байна. Тиймээс би ийм өгөгдлийг цуглуулахын тулд цаг агаарын энгийн станц хийсэн. Дараах хэсгүүд нь нэгийг бүтээхэд миний хийсэн алхамууд юм.

Эхэлцгээе!

Алхам 1: Гэрэл, температур, чийгшил мэдрэгч бүхий цаг уурын станц

Гэрэл, температур, чийгшил мэдрэгч бүхий цаг уурын станц
Гэрэл, температур, чийгшил мэдрэгч бүхий цаг уурын станц
Гэрэл, температур, чийгшил мэдрэгч бүхий цаг уурын станц
Гэрэл, температур, чийгшил мэдрэгч бүхий цаг уурын станц
Гэрэл, температур, чийгшил мэдрэгч бүхий цаг уурын станц
Гэрэл, температур, чийгшил мэдрэгч бүхий цаг уурын станц
Гэрэл, температур, чийгшил мэдрэгч бүхий цаг уурын станц
Гэрэл, температур, чийгшил мэдрэгч бүхий цаг уурын станц

Би цаг уурын станц барихаар төлөвлөж байхдаа салхины хурд, борооны хэмжилт, нарны спектрийн бүрэн спектр бүхий цаг агаарын бүрэн станцтай болохыг мөрөөдөж байсан боловч энэ нь тийм ч хямд биш бөгөөд худалдан авалтын зардал дуусч магадгүй юм. хамгийн багадаа 100 доллар. Би бүрэн сонголтуудаас татгалзаж, бага багаар 10 доллараар бүтээж эхлэв. 10 доллар бол доорх хэсгүүдийн хувьд цаг уурын станцын үндсэн бүрэлдэхүүн хэсгүүдийн өртөг юм.

Энд хэсгүүд байна:

1. ESP8266 Wemos брэнд нь Aliexpress дээр 2.39 $ үнэтэй. EPS8266 нь 4MB ба түүнээс дээш хэмжээтэй флаш програмчлах, шинэчлэх, ашиглахад илүү хялбар байдаг тул би Wemos брэндийг санал болгож байна.

2. Wemos Charger-Boost Shield 1.39 ширхэг үнэтэй. Энэ брэндийг ашиглах бас нэг давуу тал юм. Энэ нь лити батерейг (нэрлэсэн хүчдэл = 3.7V) ESP8266-ийн 5V хүртэл нэмэгдүүлэх самбартай. Удирдах зөвлөл нь хамгийн их цэнэглэх гүйдэл = 1М цэнэглэх сонголттой ирдэг.

*Тэмдэглэл: Лити батерейг цэнэглэх/өсгөх хямд сонголт байдаг. Энэ нь 5 ширхэгийн хувьд 1.77 долларын үнэтэй. Гэсэн хэдий ч, би энэ самбарыг ESP8266 (Wemos эсвэл нүцгэн ESP8266) дээр ашиглах үед ESP8266-ийн гүн нойрны горим нь ESP8266-ийг унтах-дахин унтуулах горимд хийсний дараа дахин тохируулах ажлыг эхлүүлсэн бөгөөд энэ нь маш ядаргаатай юм. Хэрэв та юу болсныг мэдэж байгаа бол над руу ирсэн имэйл бичээрэй.

3. Wemos нь температур, чийгшлийг хамгаалах хэд хэдэн бамбайтай боловч би бие даасан бүрэлдэхүүн хэсгүүдээс бүтээх гэж байна. Фоторезистор (эсвэл гэрлээс хамааралтай эсэргүүцэл-ldr, хямд), BH1780 эсвэл TSL2561 гэх мэт гэрэлтэх мэдрэгч (ойролцоогоор 0.87-0.89c ширхэг), DS18B20 (тус бүр 75c) гэх мэт температур мэдрэгч, чийгшил ба температурын хослол. DHT22 (энд 2.35 доллар) эсвэл SHT21 (энд 2.20 доллар). Мэдрэгчийн нийт зардал ~ 4 доллар.

4. Лити батерей. Би 7.4V Canon батерейгаас авав, энэ нь 3.7V цуврал хоёр батерей эсвэл 18650 лити зай юм. 18650 нэг ширхэг нь ойролцоогоор 5 долларын үнэтэй. Надад камерын батерейны хайрцгийг эвдэж байгааг харуулсан зураг байна. Хуванцар тагийг таслахдаа богино холболт хийх нь хэт халалт үүсгэж, түлэгдэх аюултайг анхаараарай.

5. ПХБ -ийн самбар, холбогч, утас, гагнуур, таны цаг, магадгүй зарим дибаг хийх ур чадвар.

Дээрх схемийн дагуу утаснуудын бүрэлдэхүүн хэсгүүдийг хамтад нь нийлүүлье.

Дараа нь тохиргооны гогцоон дахь даалгаврыг хайж олоорой. Энэ бол зүгээр л нэг удаагийн ажил бөгөөд унтах тушаалаар дуусдаг.

void setup () {Serial.begin (115200); Serial.println ("Эхлэх цэг" нэртэй + String (SENSORNAME)); setup_wifi (); саатал (100); Wire.begin (); pinMode (ldrPin, INPUT); SHT21. эхлэх (); if (! tsl.begin ()) {Serial.print ("TSL2561 олдсонгүй"); байхад (1); } саатал (100); ldr = analogRead (ldrPin); tsl.enableAutoRange (үнэн); tsl.setIntegrationTime (TSL2561_INTEGRATIONTIME_13MS); саатал (100); sensors_event_t үйл явдал; tsl.getEvent (& үйл явдал); if (event.light) lux = event.light; else Serial.println ("Мэдрэгчийн хэт ачаалал");

h = SHT21.getHumidity ();

t = SHT21.getTemperature (); tempSensor.setWaitForConversion (худал); tempSensor.begin (); саатал (100); if (tempSensor.getDeviceCount () == 0) {Serial.printf ("DS18x20 pin %d / n дээр олдсонгүй", ds18b20); Serial.flush (); саатал (1000); } саатал (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); саатал (100); client.setServer (mqtt_server, mqtt_port); client.setCallback (буцааж залгах); дахин холбох (); саатал (100); ESP.deepSleep (3e8); // 300 сая микро секунд, 300 секунд, 5 минут; }

Алдааг олж засварлах эсвэл тохируулах явцад ESP.deepsleep () дээр цуваа уншилтыг тасралтгүй хийхийг тушаана уу. Урьдын адил ESP8266 руу байршуулах бүрэн кодыг энд байрлуулсан болно (GitHub).

Удаан унтсаны дараа сэрэхийн тулд RST ба D0/GPIO16 хооронд холбогчийг өмсөхөө мартуузай.

Одоо Arduino IDE ашиглан ESP8266 руу код оруулах цаг болжээ.

Алхам 2: MQTT: Мэдээллийг нийтлэх, захиалах уян хатан хэрэгсэл

MQTT: Мэдээллийг нийтлэх, захиалах уян хатан хэрэгсэл
MQTT: Мэдээллийг нийтлэх, захиалах уян хатан хэрэгсэл
MQTT: Мэдээллийг нийтлэх, захиалах уян хатан хэрэгсэл
MQTT: Мэдээллийг нийтлэх, захиалах уян хатан хэрэгсэл

Нэгдүгээрт, би MQTT -ийг ашиглан гэрийнхээ янз бүрийн мэдрэгч, үйлчлүүлэгчидээс өгөгдөл илгээх, хүлээн авах дуртай болж байна. Энэ нь сэдвээр ангилсан хязгааргүй өгөгдлийг илгээх уян хатан байдал, MQTT брокероос нэг сэдвийг захиалах хязгааргүй үйлчлүүлэгчидтэй холбоотой юм. Хоёрдугаарт, би MQTT-ийг гүнзгий хэлэлцэх чадваргүй байна. Заримдаа өнгөрсөн жил (2017) MQTT-ийг Node-RED ашиглан цаг уурын станц, мэдрэгчийг тохируулах хичээлүүдийг дагаж байхдаа мэддэг болсон. Ямар ч байсан би танд ямар нэгэн мэдээлэл өгөхийг хичээх болно. Эхлэх өөр нэг сайн газар бол Википедиа юм.

Хэрэв танд онолын талаар унших цаг байхгүй бөгөөд MQTT брокер байгуулахыг хүсч байсан бол үүнийг хийхийн тулд би өөр нэг хичээл оруулсан болно. Энэ бичлэгийг хайгаад 4 -р алхам руу доош гүйлгэнэ үү.

Миний ойлголтоор Message Queuing телеметрийн тээвэр (MQTT) гэж юу болохыг тайлбарлахын тулд би дээрх диаграмыг бэлтгэсэн. Товчхондоо MQTT бол ISO стандарт бөгөөд шумуул, шумуул-үйлчлүүлэгч гэх мэт бүтээгдэхүүн, би Raspberry Pi дээр MQTT брокер хийсэн хоёр багц нь энэхүү стандартыг дагаж мөрдөх ёстой. MQTT брокер нь хэвлэн нийтлэгчдэд мессеж оруулах, захиалагчдыг зорилтот сэдвийг сонсох хэрэгсэл болж өгдөг.

Arduino PubSubclient номын санг ArduinoJson -тэй хослуулсан нь түүнийг зохион бүтээгч knolleary болон bblanchon -ийн ачаар мэдрэгчээс зорилтот төхөөрөмж эсвэл эцсийн үйлчлүүлэгч хүртэлх багаж хэрэгслийг ашиглахад хялбар болгодог.

Өгөгдлийн сан үүсгэж, зарим өгөгдлийг харуулцгаая.

Алхам 3: Өгөгдлийг SQL дээр хадгалж, тэдгээрийг вэб сервер дээр харуулах

Өгөгдлийг SQL дээр хадгалж, тэдгээрийг вэб сервер дээр харуулах
Өгөгдлийг SQL дээр хадгалж, тэдгээрийг вэб сервер дээр харуулах
Өгөгдлийг SQL дээр хадгалж, тэдгээрийг вэб сервер дээр харуулах
Өгөгдлийг SQL дээр хадгалж, тэдгээрийг вэб сервер дээр харуулах

Би вэб серверийн мэдээллийн сан үүсгэхийн тулд sqlite3 -ийг ашигласан. Sqlite3 -ийг Rapberry Pi дээр дараах байдлаар суулгаарай.

sudo apt-get sqlite3-ийг суулгаарай

терминал руу бичиж өгөгдлийн сан, хүснэгт үүсгэв.

sqlite3 цаг уурын станц.db

Хүснэгтийн цаг агаарын мэдээллийг үүсгэх (id INT PRIMARY KEY, DATETIME, ldr INT, tls2561 INT, ds18b20 REAL, tsht21 REAL, hsht21 REAL);

.exit // sqlite командын мөрөөс гараад Linux терминал руу буцна уу

Цаг уурын станцын нийтэлсэн сэдвийг сонсохын тулд би Python програмтай Paho номын санг ашигласан.

#! /usr/bin/python3# хүлээн авсан: > # 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.

Зөвлөмж болгож буй: