Mündəricat:

Hava İstasyonu: ESP8266 ilə Dərin Yuxu, SQL, Şüşə Qrafiki və Plotly: 3 addım
Hava İstasyonu: ESP8266 ilə Dərin Yuxu, SQL, Şüşə Qrafiki və Plotly: 3 addım

Video: Hava İstasyonu: ESP8266 ilə Dərin Yuxu, SQL, Şüşə Qrafiki və Plotly: 3 addım

Video: Hava İstasyonu: ESP8266 ilə Dərin Yuxu, SQL, Şüşə Qrafiki və Plotly: 3 addım
Video: Hava İstasyonu V3 webserver (ESP8266) 2024, Noyabr
Anonim
Hava İstasyonu: ESP8266 Dərin Yuxu, SQL, Şüşə və Plotly ilə Qrafik
Hava İstasyonu: ESP8266 Dərin Yuxu, SQL, Şüşə və Plotly ilə Qrafik

Balkonunuzdakı temperaturu, rütubəti və ya işığın intensivliyini bilmək əyləncəli olarmı? Biləcəyimi bilirəm. Belə məlumatları toplamaq üçün sadə bir hava stansiyası hazırladım. Aşağıdakı bölmələr, birini qurmaq üçün atdığım addımlardır.

Gəlin başlayaq!

Addım 1: İşıq, Temperatur və Rütubət Sensorlu Hava İstasyonu

İşıq, Temperatur və Rütubət Sensorlu Hava İstasyonu
İşıq, Temperatur və Rütubət Sensorlu Hava İstasyonu
İşıq, Temperatur və Rütubət Sensorlu Hava İstasyonu
İşıq, Temperatur və Rütubət Sensorlu Hava İstasyonu
İşıq, Temperatur və Rütubət Sensorlu Hava İstasyonu
İşıq, Temperatur və Rütubət Sensorlu Hava İstasyonu
İşıq, Temperatur və Rütubət Sensorlu Hava İstasyonu
İşıq, Temperatur və Rütubət Sensorlu Hava İstasyonu

Bir hava stansiyası qurmağı planlaşdıranda külək sürəti, yağış ölçümü, tam spektrli günəş sensoru olan tam hüquqlu bir hava stansiyasına sahib olmağı xəyal edirdim, amma bunun ucuz olmayacağını və satınalma xərclərinin bitə biləcəyini bilirdim. ən az 100 dollar. Tam seçimlərdən imtina etdim və az və ya çoxu 10 dollar olan bir tikinti etməyə başladım. Aşağıdakı hissələr kimi hava stansiyasının əsas komponentlərinin qiyməti 10 dollardır.

İşdə hissələr:

1. ESP8266 Wemos markasının qiyməti Aliexpress -də 2.39 dollardır. Wemos markasını tövsiyə edərdim, çünki EPS8266 -nı proqramlaşdırmaq, yeniləmək və 4MB flaş və ya daha çoxuna sahib olmaq daha asandır.

2. Wemos Charger-Boost Shield-in qiyməti 1.39 dollardır. Bu markanı istifadə etməyin başqa bir faydasıdır. Lityum batareya (nominal gərginlik = 3.7V) üçün ESP8266 üçün 5V-a qədər gücləndirici lövhə malikdir. Lövhədə eyni zamanda maksimum şarj cərəyanı = 1M olan şarj imkanı da var.

*Qeyd: Lityum batareyanın doldurulması/artırılması üçün daha ucuz bir seçim var. Bunun 5 ədəd üçün 1.77 dollara başa gəlir. Bununla birlikdə, bu lövhəni ESP8266 (ya Wemos və ya çılpaq ESP8266) üçün istifadə etdiyim zaman, ESP8266-nın dərin yuxu rejimi, ESP8266-nı yuxu sıfırlama-yuxu döngəsinə düzəltdikdən dərhal sonra sıfırlamağa səbəb oldu, bu da çox əsəbidir. Nə baş verdiyini bilirsinizsə, mənə inboxa yazın.

3. Wemos -un da temperatur və rütubət üçün bir neçə qalxanı var, ancaq fərdi komponentlərdən quracağam. Fotoresistor (və ya işığa bağlı olan rezistor-ldr, ucuz), BH1780 və ya TSL2561 (təxminən 0.87-0.89c ədəd) kimi bir parlaqlıq sensoru, DS18B20 (hər biri 75c) kimi bir temperatur sensoru və nəm və temperatur kombinasiyası DHT22 (burada 2.35 dollar) və ya SHT21 (burada 2.20 dollar). Sensorun ümumi dəyəri ~ 4 dollar.

4. Lityum batareya. Birini 7.4V Canon Batareyasından iki ədəd 3.7V seriyalı və ya 18650 Lityum batareyadan xilas etdim. Hər 18650 -nin hər biri təxminən 5 dollara başa gəlir. Kameranın batareya paketinin yıxıldığını göstərən bir şəklim var. Ehtiyatlı olun, plastik qapağı kəsərkən qısa qapanma həddindən artıq istiyə səbəb ola bilər və yanmağa səbəb ola bilər.

5. PCB lövhəsi, tullanan, tel, lehimləmə, vaxtınız, bəlkə də bəzi ayıklama bacarıqları.

Tel komponentləri birlikdə yuxarıdakı sxemə uyğun olsun.

Sonra, quraşdırma döngəsindəki vəzifəni axtarın. Bu, sadəcə bir tapşırıqdır və yuxu əmri ilə başa çatır.

void setup () {Serial.begin (115200); Serial.println ("Başlanğıc Node" + String (SENSORNAME)); setup_wifi (); gecikmə (100); Wire.begin (); pinMode (ldrPin, GİRİŞ); SHT21.başla (); əgər (! tsl.begin ()) {Serial.print ("TSL2561 tapılmadı"); isə (1); } gecikmə (100); ldr = analogRead (ldrPin); tsl.enableAutoRange (doğru); tsl.setIntegrationTime (TSL2561_INTEGRATIONTIME_13MS); gecikmə (100); sensors_event_t hadisəsi; tsl.getEvent (& hadisə); əgər (hadisə.işığı) lux = hadisə.işığı; else Serial.println ("Sensorun həddən artıq yüklənməsi");

h = SHT21.getHumidity ();

t = SHT21.getTemperature (); tempSensor.setWaitForConversion (yalan); tempSensor.begin (); gecikmə (100); əgər (tempSensor.getDeviceCount () == 0) {Serial.printf ("DS18x20 %d / n pinində tapılmadı", ds18b20); Serial.flush (); gecikmə (1000); } gecikmə (100); tempSensor.requestTemperatures (); t18 = tempSensor.getTempCByIndex (0); Serial.printf ("\ nİşıq: %d lüks / t", lüks); 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); gecikmə (100); client.setServer (mqtt_server, mqtt_port); client.setCallback (geri zəng); yenidən bağlayın (); gecikmə (100); ESP.deepSleep (3e8); // 300 milyon mikro saniyə, 300 saniyə, 5 dəqiqə; }

Hata ayıklama və ya qurma zamanı, ESP.deepsleep () -ə əmr verin ki, davamlı olaraq Serial oxunsun. Həmişə olduğu kimi, ESP8266 -ya yükləmək üçün tam kod burada yerləşdirilir (GitHub).

Dərin yuxudan sonra yuxudan oyanmaq üçün RST və D0/GPIO16 arasındakı tullanan geyinməyi unutmayın.

İndi Arduino IDE -dən istifadə edərək kodu ESP8266 -ya yükləməyin vaxtı gəldi.

Addım 2: MQTT: Verilənləri dərc etmək və abunə etmək üçün çevik bir vasitə

MQTT: Verilənləri dərc etmək və abunə etmək üçün çevik bir vasitədir
MQTT: Verilənləri dərc etmək və abunə etmək üçün çevik bir vasitədir
MQTT: Verilənləri dərc etmək və abunə etmək üçün çevik bir vasitədir
MQTT: Verilənləri dərc etmək və abunə etmək üçün çevik bir vasitədir

Birincisi, evimdəki müxtəlif sensorlar və müştərilər arasında məlumat göndərmək və almaq üçün MQTT -dən istifadə etməyi sevirəm. Bunun səbəbi, bir mövzuya görə kateqoriyalara bölünmüş məhdudiyyətsiz məlumat göndərmək və MQTT brokerindən bir mövzuya abunə olmaq üçün limitsiz müştərilərin olmasıdır. İkincisi, MQTT-ni dərindən müzakirə edə bilmərəm. MQTT-ni bəzən keçən il (2017) Node-RED istifadə edərək bir hava stansiyası və sensorlar qurmaq üçün dərsləri izləyərkən öyrəndim. Hər halda, sizə bəzi məlumatları təqdim etməyə çalışacağam. Başlamaq üçün başqa bir yaxşı yer Vikipediyadır.

Teoriya haqqında oxumağa vaxtınız yoxdursa və bir MQTT brokeri qurmaq istəsəniz, bunun üçün başqa bir dərslik yerləşdirdim. Bu yazını axtarın və 4 -cü addıma keçin.

Anlayışımda Message Queuing Telemetry Transport (MQTT) nə olduğunu izah etmək üçün yuxarıdakı kimi bir diaqram hazırladım. Bir sözlə, MQTT bir ISO standartıdır və ağcaqanad və ağcaqanad-müştəri kimi bir məhsul, Raspberry Pi üzərində MQTT broker qurduğum iki paket bu standarta uyğun olmalıdır. MQTT brokeri daha sonra nəşriyyatçıların mesaj göndərməsi və abunəçilərin hədəf mövzunu dinləməsi üçün bir vasitə halına gəlir.

Arduino PubSubclient kitabxanasının ArduinoJson ilə birləşməsi, yaradıcısı knolleary və bblanchon sayəsində, tinkers və inkişaf etdiricilərdən sensorlardan hədəf avadanlıqlarına və ya son müştəriyə qədər alətlər dəstini asanlaşdırır.

Verilənlər bazası yaratmağa davam edək və bəzi məlumatları göstərək.

Addım 3: Verilənləri SQL -də Saxlayın və Veb Serverdə Göstərin

Verilənləri SQL -də saxlayın və Veb Serverdə Göstərin
Verilənləri SQL -də saxlayın və Veb Serverdə Göstərin
Verilənləri SQL -də saxlayın və Veb Serverdə Göstərin
Verilənləri SQL -də saxlayın və Veb Serverdə Göstərin

Veb server üçün bir verilənlər bazası yaratmaq üçün sqlite3 istifadə etdim. Sqlite3 -ü Rapberry Pi -də quraşdırın:

sudo apt-get sqlite3 quraşdırın

terminala yazaraq bir verilənlər bazası və bir cədvəl yaratdı:

sqlite3 hava istasyonu.db

Cədvəl hava məlumatlarını yaradın (id INT PRIMARY KEY, DATETIME vaxtı, ldr INT, tls2561 INT, ds18b20 REAL, tsht21 REAL, hsht21 REAL);

.exit // sqlite əmr satırından çıxmaq və Linux terminalına qayıtmaq üçün

Hava stansiyasının yayımladığı bir mövzunu dinləmək üçün Python ilə bir Paho kitabxanasından istifadə etdim:

#! /usr/bin/python3# qəbul edildi: > # 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.

Tövsiyə: