İçindekiler:

Hava Durumu İstasyonu: ESP8266, Derin Uyku, SQL, Flask&Plotly ile Grafik Oluşturma: 3 Adım
Hava Durumu İstasyonu: ESP8266, Derin Uyku, SQL, Flask&Plotly ile Grafik Oluşturma: 3 Adım

Video: Hava Durumu İstasyonu: ESP8266, Derin Uyku, SQL, Flask&Plotly ile Grafik Oluşturma: 3 Adım

Video: Hava Durumu İstasyonu: ESP8266, Derin Uyku, SQL, Flask&Plotly ile Grafik Oluşturma: 3 Adım
Video: Meraklısına! Arduino İle LoRa Modülü Kullanımı - Maduino IOT 2024, Temmuz
Anonim
Hava Durumu İstasyonu: ESP8266 ile Derin Uyku, SQL, Flask&Plotly ile Grafik Oluşturma
Hava Durumu İstasyonu: ESP8266 ile Derin Uyku, SQL, Flask&Plotly ile Grafik Oluşturma

Balkonunuzdaki sıcaklığı, nemi veya ışık yoğunluğunu bilmek eğlenceli olur mu? Yapacağımı biliyorum. Bu tür verileri toplamak için basit bir hava durumu istasyonu yaptım. Aşağıdaki bölümler, bir tane oluşturmak için attığım adımlardır.

Başlayalım!

Adım 1: Işık, Sıcaklık ve Nem Sensörlü Hava İstasyonu

Işık, Sıcaklık ve Nem Sensörlü Hava İstasyonu
Işık, Sıcaklık ve Nem Sensörlü Hava İstasyonu
Işık, Sıcaklık ve Nem Sensörlü Hava İstasyonu
Işık, Sıcaklık ve Nem Sensörlü Hava İstasyonu
Işık, Sıcaklık ve Nem Sensörlü Hava İstasyonu
Işık, Sıcaklık ve Nem Sensörlü Hava İstasyonu
Işık, Sıcaklık ve Nem Sensörlü Hava İstasyonu
Işık, Sıcaklık ve Nem Sensörlü Hava İstasyonu

Bir meteoroloji istasyonu yapmayı planladığımda, rüzgar hızı, yağmur ölçümü, tam spektrumlu güneş sensörü olan tam teşekküllü bir meteoroloji istasyonuna sahip olmayı hayal ediyordum, ancak bunun ucuz olmayacağı ve satın alma maliyetinin sona erebileceği ortaya çıktı. en az 100 dolar. Tüm seçeneklerden vazgeçtim ve aşağı yukarı 10$ ile bir tane oluşturmaya başladım. Aşağıdaki parçalar gibi meteoroloji istasyonunun temel bileşenlerinin maliyeti 10 ABD dolarıdır.

İşte parçalar:

1. ESP8266 Wemos markasının fiyatı Aliexpress'te 2,39 ABD dolarıdır. EPS8266'nın programlanması, güncellenmesi ve 4MB veya daha fazla flash'a sahip olması daha kolay olduğu için Wemos markasını tavsiye ederim.

2. Wemos Charger-Boost Shield'in maliyeti 1,39 ABD dolarıdır. Bu, bu markayı kullanmanın bir başka avantajıdır. ESP8266 için Lityum pil için (nominal voltaj = 3,7V) 5V'a yükseltme kartına sahiptir. Kart ayrıca maksimum şarj akımı = 1M ile şarj seçeneği ile birlikte gelir.

*Not: Lityum pili şarj etmek/yükseltmek için daha ucuz bir seçenek vardır. Bu, 5 adet için 1,77 $ maliyeti. Ancak, bu kartı ESP8266 (Wemos veya çıplak ESP8266) için kullandığımda, ESP8266'nın derin uyku modu, ESP8266'yı bir uyku-sıfırlama-uyku döngüsünde yaptıktan hemen sonra bir sıfırlamayı tetikledi, bu çok can sıkıcı bir durum. Neler olduğunu biliyorsan, lütfen bana gelen kutusuna.

3. Wemos ayrıca sıcaklık ve nem için birkaç kalkana sahiptir, ancak ben tek tek bileşenlerden inşa edeceğim. Fotodirenç (veya ışığa bağlı direnç -- ldr, ucuz), BH1780 veya TSL2561 gibi bir parlaklık sensörü (yaklaşık 0.87-0.89c adet), DS18B20 (her biri 75c) gibi bir sıcaklık sensörü ve aşağıdaki gibi bir nem ve sıcaklık kombinasyonu DHT22 (burada 2,35 ABD doları) veya SHT21 (burada 2,20 ABD doları). Sensör için toplam maliyet ~4$.

4. Lityum pil. Seri olarak iki adet 3.7V pil veya 18650 Lityum pil olan 7.4V Canon Pilden bir tane kurtardım. Her 18650'nin fiyatı yaklaşık 5 dolar. Kamera pil paketinin sökülmesini gösteren bir resmim var. Ancak dikkatli olun, plastik kapağı keserken kısa devre yapmak aşırı ısı üretebilir ve yanabilir.

5. PCB kartı, jumper, tel, lehimleme, zamanınız, belki bazı hata ayıklama becerileri.

Kablo bileşenlerinin birlikte yukarıdaki şemayı takip etmesine izin verin.

Ardından, kurulum döngüsünde görevi arayın. Bu, yalnızca tek seferlik bir görevdir ve bir uyku komutuyla sona erer.

geçersiz kurulum() { Serial.begin(115200); Serial.println("Başlangıç Düğümü" + String(SENSORNAME)); setup_wifi(); gecikme(100); Wire.begin(); pinMode(ldrPin, INPUT); SHT21.begin(); if(!tsl.begin()) { Serial.print("TSL2561 bulunamadı"); süre(1); } gecikme(100); ldr = analogRead(ldrPin); tsl.enableAutoRange(true); tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_13MS); gecikme(100); sensor_event_t olayı; tsl.getEvent(&event); if (event.light) lux = event.light; else Serial.println("Sensör aşırı yüklenmesi");

h = SHT21.getHumidity();

t = SHT21.getTemperature(); tempSensor.setWaitForConversion(yanlış); tempSensor.begin(); gecikme(100); if (tempSensor.getDeviceCount() == 0) { Serial.printf("DS18x20 %d\n pininde bulunamadı", ds18b20); Seri.flush(); gecikme(1000); } gecikme(100); tempSensor.requestTemperatures(); t18 = tempSensor.getTempCByIndex(0); Serial.printf("\nIşık: %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", hk); gecikme(100); client.setServer(mqtt_server, mqtt_port); client.setCallback(geri arama); yeniden bağlan(); gecikme(100); ESP.deepSleep(3e8); // 300 milyon mikro saniye, 300 saniye, 5 dakika; }

Hata ayıklama veya kurulum sırasında ESP.deepsleep()'e sürekli olarak Seri okuma yapması için komut verin. Her zaman olduğu gibi, ESP8266'ya yüklenecek kodun tamamı burada (GitHub) barındırılır.

Derin uyku döneminden sonra uyanmayı tetiklemek için RST ve D0/GPIO16 arasındaki jumper'ı takmayı unutmayın.

Şimdi Arduino IDE kullanarak kodu ESP8266'ya yükleme zamanı.

2. Adım: MQTT: Verileri Yayınlamak ve Abone Olmak için Esnek Bir Ortam

MQTT: Verileri Yayınlamak ve Abone Olmak için Esnek Bir Ortam
MQTT: Verileri Yayınlamak ve Abone Olmak için Esnek Bir Ortam
MQTT: Verileri Yayınlamak ve Abone Olmak için Esnek Bir Ortam
MQTT: Verileri Yayınlamak ve Abone Olmak için Esnek Bir Ortam

İlk olarak, evimdeki farklı sensörler ve istemciler arasında veri göndermek ve almak için MQTT'yi kullanmayı giderek daha çok seviyorum. Bunun nedeni, bir konuya göre sınıflandırılmış sınırsız veri gönderme esnekliği ve bir MQTT aracısından bir konuya abone olmak için sınırsız istemcidir. İkincisi, MQTT'yi derinlemesine tartışmak için nitelikli değilim. MQTT'yi bazen geçen yıl (2017) Node-RED kullanarak bir hava durumu istasyonu ve sensörler kurmak için öğreticileri takip ederken tanıdım. Her neyse, size bazı bilgiler sunmak için elimden geleni yapacağım. Başlamak için başka bir iyi yer Wikipedia'dır.

Teori hakkında okumak için zamanınız yoksa ve bir MQTT komisyoncusu kurmak istiyorsanız, bunu yapmak için başka bir öğretici yayınladım. Bu gönderiye bakın ve 4. Adıma ilerleyin.

Anladığım kadarıyla Message Queuing Telemetri Taşımacılığının (MQTT) ne olduğunu açıklamak için yukarıdaki gibi bir diyagram hazırladım. Özetle, MQTT bir ISO standardıdır ve mosquitto ve mosquitto-client gibi bir ürün, bir Raspberry Pi üzerinde MQTT komisyoncusu oluşturmak için kullandığım iki paket bu standarda uymak zorundadır. MQTT aracısı daha sonra yayıncıların bir mesaj göndermesi ve abonelerin bir hedef konuyu dinlemesi için bir araç haline gelir.

Arduino PubSubclient kütüphanesinin ArduinoJson ile birleşimi, yaratıcısı knolleary ve bblanchon sayesinde, sensörlerden bir hedef ekipmana veya son müşteriye kadar bir dizi araç için tamirciler ve geliştiriciler için daha kolay hale getirir.

Veritabanı oluşturma ile devam edelim ve bazı verileri görüntüleyelim.

Adım 3: Verileri SQL'e Kaydedin ve Bir Web Sunucusunda Görüntüleyin

Verileri SQL'e Kaydedin ve Bir Web Sunucusunda Görüntüleyin
Verileri SQL'e Kaydedin ve Bir Web Sunucusunda Görüntüleyin
Verileri SQL'e Kaydedin ve Bir Web Sunucusunda Görüntüleyin
Verileri SQL'e Kaydedin ve Bir Web Sunucusunda Görüntüleyin

Web sunucusu için bir veritabanı oluşturmak için sqlite3 kullandım. Sqlite3'ü Rapberry Pi'ye şu şekilde kurun:

sudo apt-get install sqlite3

terminale yazarak bir veritabanı ve tablo oluşturdu:

sqlite3 meteoroloji istasyonu.db

CREATE TABLE hava durumu verileri (id INT PRIMARY KEY, thetime DATETIME, ldr INT, tls2561 INT, ds18b20 REAL, tsht21 REAL, hsht21 REAL);

.exit // sqlite komut satırından çıkmak ve Linux terminaline dönmek için

Meteoroloji istasyonu tarafından yayınlanan bir konuyu dinlemek için Python ile bir Paho kütüphanesi kullandım:

#! /usr/bin/python3# şuradan alınmıştır: > # 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.

Önerilen: