RPi ve ESP8266 ile IoT Hava İstasyonu: 10 Adım
RPi ve ESP8266 ile IoT Hava İstasyonu: 10 Adım

Video: RPi ve ESP8266 ile IoT Hava İstasyonu: 10 Adım

Video: RPi ve ESP8266 ile IoT Hava İstasyonu: 10 Adım
Video: eMuderris, IOT ödev02, Raspberry Pi ile Iot Hava İstasyonu 2025, Ocak
Anonim
RPi ve ESP8266 ile IoT Hava İstasyonu
RPi ve ESP8266 ile IoT Hava İstasyonu

Önceki eğitimlerde, NodeMCU, sensörler ile oynuyorduk ve ThingSpeak'te (sensör verilerini bulutta toplamanıza ve depolamanıza ve IoT uygulamaları geliştirmenize olanak tanıyan bir Nesnelerin İnterneti (IoT) platformu) üzerinde veri yakalamayı ve günlüğe kaydetmeyi öğreniyorduk):

IOT KOLAYLAŞTIRILDI: UZAKTAN HAVA DURUMU VERİLERİNİ YAKALAMA: UV VE HAVA SICAKLIĞI VE NEM

Bu yeni öğretici ile, aynı şeyi nasıl yapacağımızı öğreneceğiz, ancak bu sefer, birkaç farklı sensörden veri toplamak için bir Raspberry Pi kullanarak ve ayrıca cihazlar ile web arasında farklı iletişim yollarını keşfedeceğiz:

Sensörler ve İletişim tipi:

  • DHT22 (Sıcaklık ve Nem) ==> Dijital iletişim
  • BMP180 (Sıcaklık ve Basınç) ==> I2C Protokolü
  • DS18B20 (Sıcaklık) ==> 1-Kablolu Protokol

Blok diyagram, bu projenin sonunda ne elde edeceğimizi gösterir:

Adım 1: Malzeme Listesi - Malzeme Listesi

  1. Ahududu Pi V3 - 32,00 ABD Doları
  2. DHT22 Sıcaklık ve Bağıl Nem Sensörü - USD 9.95
  3. Direnç 4K7 ohm
  4. DS18B20 Su Geçirmez Sıcaklık Sensörü - USD 5,95
  5. Direnç 4K7 ohm
  6. BMP180 Barometrik Basınç, Sıcaklık ve Yükseklik Sensörü - USD 6.99

Adım 2: Sıcaklık ve Nem Sensörünün Kurulumu

Sıcaklık ve Nem Sensörünün Kurulumu
Sıcaklık ve Nem Sensörünün Kurulumu

Kurulacak ilk sensör, hava sıcaklığı ve bağıl nem verilerini yakalamak için DHT22 olacaktır. ADAFRUIT sitesi, bu sensörler hakkında harika bilgiler sağlar. Körük, oradan alınan bazı bilgiler:

genel bakış

Düşük maliyetli DHT sıcaklık ve nem sensörleri çok basit ve yavaştır ancak bazı temel veri kaydı yapmak isteyen hobiciler için harikadır. DHT sensörleri, kapasitif nem sensörü ve termistör olmak üzere iki parçadan oluşur. Ayrıca, içinde bir miktar analogdan dijitale dönüşüm yapan ve sıcaklık ve nem ile dijital bir sinyal yayan çok basit bir çip var. Dijital sinyalin herhangi bir mikrodenetleyici kullanılarak okunması oldukça kolaydır.

DHT22 Ana özellikler:

  • Düşük maliyetli
  • 3 ila 5V güç ve G/Ç
  • Dönüşüm sırasında 2.5mA maksimum akım kullanımı (veri istenirken)
  • %2-5 doğrulukla %0-100 nem okumaları için iyi
  • -40 ila 125°C sıcaklık okumaları için iyi ±0.5°C doğruluk
  • 0,5 Hz'den fazla olmayan örnekleme hızı (2 saniyede bir)
  • Gövde boyutu 15,1 mm x 25 mm x 7,7 mm
  • 0.1" aralıklı 4 pin

Sensörü genellikle 20m'den daha kısa mesafelerde kullanacağınız zaman, Data ve VCC pinleri arasına 4K7 ohm'luk bir direnç bağlanmalıdır. DHT22 çıkış veri pini Raspberry GPIO 16'ya bağlanacaktır. Sensörü RPi pinlerine aşağıdaki gibi bağlayarak yukarıdaki elektrik şemasını kontrol edin:

  1. Pin 1 - Vcc ==> 3.3V
  2. Pin 2 - Veri ==> GPIO 16
  3. Pin 3 - Bağlanmıyor
  4. Pin 4 - Gnd ==> Gnd

Vcc ve Data pinleri arasına 4K7 ohm rezistör takmayı unutmayınız.

Sensör bağlandıktan sonra, kütüphanesini de RPi'mize kurmalıyız.

DHT Kitaplığını Yükleme:

Raspberry'nizde /home'dan başlayarak /Documents'a gidin

cd Belgeleri

Kitaplığı kurmak ve oraya gitmek için bir dizin oluşturun:

mkdir DHT22_Sensor

cd DHT22_Sensörü

Tarayıcınızda Adafruit GitHub'a gidin:

github.com/adafruit/Adafruit_Python_DHT

Sağdaki indirme zip bağlantısına tıklayarak kütüphaneyi indirin ve yakın zamanda oluşturduğunuz Raspberry Pi klasörünüzdeki arşivi açın. Ardından kitaplığın dizinine gidin (dosyayı açtığınızda otomatik olarak oluşturulan alt klasör) ve şu komutu yürütün:

sudo python3 setup.py kurulumu

GITHUB'umdan bir test programı (DHT22_test.py) açın

Adafruit_DHT'yi içe aktar

DHT22Sensor = Adafruit_DHT. DHT22 DHTpin = 16 nem, sıcaklık = Adafruit_DHT.read_retry(DHT22Sensor, DHTpin) nem Yok değilse ve sıcaklık Yok değilse: print('Temp={0:0.1f}*C Nem={1:0.1) f}%'.format(sıcaklık, nem)) else: print('Okuma alınamadı. Tekrar deneyin!')

Programı şu komutla yürütün:

python3 DHT22_test.py

Aşağıdaki Terminal yazdırma ekranı sonucu gösterir.

resim
resim

Adım 3: DS18B20'nin Kurulumu - Sıcaklık Sensörü

DS18B20 Kurulumu - Sıcaklık Sensörü
DS18B20 Kurulumu - Sıcaklık Sensörü
DS18B20 Kurulumu - Sıcaklık Sensörü
DS18B20 Kurulumu - Sıcaklık Sensörü

Sensöre Genel Bakış:

Bu eğitimde DS18B20 sensörünün su geçirmez bir versiyonunu kullanacağız. Islak koşullarda, örneğin nemli bir toprakta, uzaktan sıcaklık için çok kullanışlıdır. Sensör izolelidir ve 125oC'ye kadar ölçüm yapabilir (Adafrut, kablo PVC kılıfından dolayı 100oC'nin üzerinde kullanılmasını önermez).

DS18B20, uzun mesafelerde bile kullanmayı iyi yapan bir dijital sensördür! Bu 1 kablolu dijital sıcaklık sensörleri oldukça hassastır (aralığın çoğunda ±0,5°C) ve yerleşik dijital-analog dönüştürücüden 12 bite kadar hassasiyet verebilir. Tek bir dijital pin kullanarak NodeMCU ile harika çalışırlar ve hatta birden çok pini aynı pine bağlayabilirsiniz, her birinin ayırt etmek için fabrikada yakılan benzersiz bir 64-bit kimliği vardır.

Sensör 3.0 ila 5.0V arasında çalışır, bu da doğrudan Raspberry pinlerinden (1 veya 17) biri tarafından sağlanan 3.3V'den güç alabileceği anlamına gelir.

Sensörün 3 kablosu vardır:

  • Siyah: GND
  • Kırmızı: VCC
  • Sarı: 1-Kablolu Veri

Burada tüm verileri bulabilirsiniz: DS18B20 Datasheet

Sensör Kurulumu:

Yukarıdaki şemayı takip edin ve bağlantıları yapın:

  • Vcc ==> 3.3V
  • Gnd ==> Gnd
  • Veri ==> GPIO 4 (kütüphane için varsayılan)

Python Kitaplığını Kurmak:

Ardından sensörü işleyecek Python kütüphanesini kuralım:

sudo pip3 w1thermsensor yükleyin

Sensörü test etmek için komut dosyasını çalıştırmadan önce, RPi'nizde "1-Wire" arayüzünün etkin olup olmadığını kontrol edin (yukarıdaki yazdırma ekranına bakın)

Yapılandırmasını değiştirdikten sonra RPi'nizi yeniden başlatmayı unutmayın

Sensörün test edilmesi:

Sensörü test etmek için basit bir python betiği kullanılabilir:

ithalat zamanı

w1thermsensor'den import W1ThermSensor ds18b20Sensor = W1ThermSensor() iken True: sıcaklık = ds18b20Sensor.get_temperature() print("Sıcaklık %s santigrat" % sıcaklık) time.sleep(1)

Adım 4: BMP180'in Kurulması

BMP180'i yükleme
BMP180'i yükleme
BMP180'i yükleme
BMP180'i yükleme
BMP180'i yükleme
BMP180'i yükleme

Sensöre Genel Bakış:

BMP180, tüketici uygulamaları için yeni nesil yüksek hassasiyetli dijital basınç sensörleri olan BMP085'in halefidir. BMP180'in ultra düşük güçlü, düşük voltajlı elektroniği, cep telefonlarında, PDA'larda, GPS navigasyon cihazlarında ve dış mekan ekipmanlarında kullanım için optimize edilmiştir. Hızlı dönüştürme süresinde yalnızca 0,25 m'lik düşük irtifa gürültüsü ile BMP180 üstün performans sunar. I2C arayüzü, bir mikro denetleyici ile kolay sistem entegrasyonuna izin verir. BMP180, EMC sağlamlığı, yüksek doğruluk ve doğrusallığın yanı sıra uzun vadeli kararlılık için piezo dirençli teknolojiye dayanmaktadır.

BMP veri sayfasının tamamı burada bulunabilir: BMP180 - Dijital Basınç Sensörü

Sensör Kurulumu: Yukarıdaki şemayı takip edin ve bağlantıları yapın:

  • Vin ==> 3.3V
  • GND ==> GND
  • SCL ==> GPIO 3
  • SDA ==> GPIO 2

I2C Arayüzünü Etkinleştirme

RPi Yapılandırmasına gidin ve I2C arayüzünün etkinleştirildiğini onaylayın. Değilse, etkinleştirin ve RPi'yi yeniden başlatın.

BMP180'i kullanma

Her şey tamam olarak kurulduysa ve her şey bağlandıysa, artık Pi'nizi açmaya ve BMP180'in çevrenizdeki dünya hakkında size ne söylediğini görmeye hazırsınız demektir.

Yapılacak ilk şey, Pi'nin BMP180'inizi görüp görmediğini kontrol etmektir. Bir terminal penceresinde aşağıdakileri deneyin:

sudo i2cdetect -y 1

Komut işe yaradıysa, BMP180'in '77' kanalında olduğunu gösteren yukarıdaki Terminal Baskı Ekranına benzer bir şey görmelisiniz.

BMP180 Kitaplığını Yükleme:

Kitaplığı kurmak için bir dizin oluşturun:

mkdir BMP180_Sensorcd BMP180_Sensor

Tarayıcınızda Adafruit GIThub'a gidin:

github.com/adafruit/Adafruit_Python_BMP

Sağdaki indirme zip bağlantısına tıklayarak kütüphaneyi indirin ve Raspberry Pi oluşturduğunuz klasördeki arşivi açın. Ardından oluşturulan alt klasöre gidin ve kitaplığın dizininde aşağıdaki komutu çalıştırın:

sudo python3 setup.py kurulumu

Python IDE'nizi açın ve bir test programı oluşturun ve adlandırın, örneğin BMP180Test.py

Adafruit_BMP. BMP085'i BMP085sensor = BMP085. BMP085() olarak içe aktarın print('Temp = {0:0.2f} *C'.format(sensor.read_temperature())) print('Basınç = {0:0.2f} Pa'. format(sensor.read_pressure())) print('Rakım = {0:0.2f} m'.format(sensor.read_altitude())) print('Deniz Seviyesi Basıncı = {0:0.2f} Pa'.format(sensor.read_sealevel_pressure()))

Test programını yürütün:

python3 BMP180Test.py

Yukarıdaki Terminal yazdırma ekranı sonucu gösterir.

Basıncın Pa (Paskal) cinsinden verildiğine dikkat edin. Bu üniteyi daha iyi anlamak için sonraki adıma bakın.

Adım 5: BMP180 ile Hava ve Yükseklik Ölçümü

BMP180 ile Hava ve Yükseklik Ölçümü
BMP180 ile Hava ve Yükseklik Ölçümü

BMP okumalarıyla ne elde edeceğimizi biraz daha anlamak için biraz zaman ayıralım. Eğiticinin bu bölümünü atlayabilir veya daha sonra geri dönebilirsiniz.

Sensör okumaları hakkında daha fazla bilgi edinmek istiyorsanız, lütfen bu harika eğiticiye gidin:https://learn.sparkfun.com/tutorials/bmp180-barome…

BMP180, atmosfer basıncını doğru bir şekilde ölçmek için tasarlanmıştır. Atmosfer basıncı hem havaya hem de rakıma göre değişir.

Atmosfer Basıncı Nedir?

Atmosfer basıncının tanımı, etrafınızdaki havanın her şeye uyguladığı bir kuvvettir. Atmosferdeki gazların ağırlığı atmosfer basıncını oluşturur. Yaygın bir basınç birimi "inç kare başına pound" veya psi'dir. Burada, paskal (Pa) olarak adlandırılan, metrekare başına Newton olan uluslararası gösterimi kullanacağız.

1 cm genişliğinde bir hava sütunu alsaydınız yaklaşık 1 kg ağırlığında olurdu

Bu ağırlık, bu sütunun kapladığı alana baskı yaparak, BMP180 gibi sensörlerle ölçebileceğimiz atmosferik basıncı oluşturur. Bu cm genişliğindeki hava sütunu yaklaşık 1 Kg ağırlığında olduğundan, ortalama deniz seviyesi basıncının yaklaşık 101325 paskal veya daha iyisi 1013,25 hPa (1 hPa, milibar - mbar olarak da bilinir) olduğu sonucu çıkar. Bu, yükseldiğiniz her 300 metrede yaklaşık %4 düşecek. Ne kadar yükseğe çıkarsanız, o kadar az basınç görürsünüz, çünkü atmosferin üstündeki sütun çok daha kısadır ve bu nedenle daha az ağırlığa sahiptir. Bunu bilmek faydalıdır, çünkü basıncı ölçerek ve biraz matematik yaparak irtifanızı belirleyebilirsiniz.

3.810 metredeki hava basıncı, deniz seviyesindekinin sadece yarısı kadardır.

BMP180, mutlak basıncı paskal (Pa) cinsinden verir. Bir paskal, çok küçük bir basınç miktarıdır, yaklaşık olarak bir kağıt yaprağının masanın üzerine koyacağı miktardır. Hectopascal cinsinden ölçümleri daha sık göreceksiniz (1 hPa = 100 Pa). Burada kullanılan kitaplık, aynı zamanda bir milibara (mbar) eşit olan hPa cinsinden kayan noktalı çıktı değerleri sağlar.

İşte diğer basınç birimlerine bazı dönüşümler:

  • 1 hPa = 100 Pa = 1 mbar = 0.001 bar
  • 1 hPa = 0.75006168 Torr
  • 1 hPa = 0.01450377 psi (inç kare başına pound)
  • 1 hPa = 0.02953337 inHg (inç cıva)
  • 1 hpa = 0,00098692 atm (standart atmosferler)

Sıcaklık Etkileri

Sıcaklık bir gazın yoğunluğunu ve yoğunluk bir gazın kütlesini ve kütle de basıncı (whew) etkilediğinden, atmosferik basınç sıcaklıkla önemli ölçüde değişecektir. Pilotlar bunu "yoğunluk irtifası" olarak bilirler, bu da havanın daha yoğun olması ve daha büyük bir aerodinamik etkiye sahip olması nedeniyle soğuk bir günde havalanmayı sıcak bir güne göre daha kolay hale getirir. Sıcaklığı telafi etmek için BMP180, oldukça iyi bir sıcaklık sensörü ve bir basınç sensörü içerir.

Bir basınç okuması gerçekleştirmek için önce bir sıcaklık okuması alırsınız, ardından bunu bir ham basınç okumasıyla birleştirerek son bir sıcaklık telafili basınç ölçümü elde edersiniz. (Kütüphane tüm bunları çok kolaylaştırır.)

Mutlak Basıncı Ölçme

Uygulamanız mutlak basıncın ölçülmesini gerektiriyorsa, tek yapmanız gereken bir sıcaklık okuması almak ve ardından bir basınç okuması yapmaktır (ayrıntılar için örnek çizime bakın). Son basınç okuması hPa = mbar cinsinden olacaktır. Dilerseniz yukarıdaki çevirme katsayılarını kullanarak bunu farklı bir birime çevirebilirsiniz.

Atmosferin mutlak basıncının, hem yüksekliğinize hem de mevcut hava durumu modellerine göre değişeceğini ve bunların her ikisinin de ölçülmesi yararlı şeyler olduğunu unutmayın.

Hava Gözlemleri

Dünyanın herhangi bir yerindeki (veya atmosferi olan herhangi bir yerdeki) atmosfer basıncı sabit değildir. Dünyanın dönüşü, eksen eğimi ve diğer birçok faktör arasındaki karmaşık etkileşim, daha yüksek ve daha düşük basınçlı alanların hareket etmesine neden olur ve bu da her gün gördüğümüz hava değişikliklerine neden olur. Basınçtaki değişiklikleri izleyerek, havadaki kısa vadeli değişiklikleri tahmin edebilirsiniz. Örneğin, düşen basınç genellikle yağışlı hava veya bir fırtınanın yaklaştığı anlamına gelir (düşük basınçlı bir sistem hareket ediyor). Artan basınç genellikle açık havanın yaklaştığı anlamına gelir (yüksek basınçlı bir sistem hareket ediyor). Ancak atmosfer basıncının da irtifaya göre değiştiğini unutmayın. Şili'deki Lo Barnechea'daki evimdeki mutlak basınç (yükseklik 950m) her zaman örneğin San Francisco'daki mutlak basınçtan (2 metreden az, neredeyse deniz seviyesi) daha düşük olacaktır. Hava istasyonları mutlak basınçlarını bildirmiş olsaydı, basınç ölçümlerini bir konumdan diğerine doğrudan karşılaştırmak zor olurdu (ve büyük ölçekli hava tahminleri, mümkün olduğu kadar çok istasyondan alınan ölçümlere bağlıdır).

Bu sorunu çözmek için, meteoroloji istasyonları, okumanın deniz seviyesinde alınmış gibi görünmesini sağlamak için eşdeğer sabit basıncı matematiksel olarak ekleyerek rapor edilen basınç okumalarından irtifa etkilerini her zaman kaldırır. Bunu yaptığınızda, San Francisco'da Lo Barnechea'dan daha yüksek bir okuma her zaman rakım nedeniyle değil, hava koşulları nedeniyle olacaktır.

Bunu yapmak için kütüphanede sea level(P, A) adında bir fonksiyon var. Bu, hPa cinsinden mutlak basıncı (P) ve istasyonun metre cinsinden mevcut irtifasını (A) alır ve irtifanın etkilerini basınçtan kaldırır. Hava durumu okumalarınızı dünyadaki diğer istasyonlarla doğrudan karşılaştırmak için bu işlevin çıktısını kullanabilirsiniz.

Rakım Belirleme

Basınç yüksekliğe göre değiştiğinden, yüksekliği ölçmek için bir basınç sensörü kullanabilirsiniz (birkaç uyarıyla). Atmosferin deniz seviyesindeki ortalama basıncı 1013,25 hPa'dır (veya mbar). Uzay boşluğuna doğru tırmanırken bu sıfıra düşer. Bu düşüşün eğrisi iyi anlaşıldığından, belirli bir denklem kullanarak iki basınç ölçümü (p ve p0) arasındaki yükseklik farkını hesaplayabilirsiniz.

Temel basınç (p0) olarak deniz seviyesi basıncını (1013,25 hPa) kullanırsanız, denklemin çıktısı deniz seviyesinden o anki yüksekliğiniz olacaktır. Kütüphanede "hesaplanan yüksekliği" elde etmenizi sağlayan height(P, P0) adlı bir fonksiyon var.

Yukarıdaki açıklama BMP 180 Sparkfun eğitiminden alınmıştır.

6. Adım: Eksiksiz Donanım

Eksiksiz Donanım
Eksiksiz Donanım

7. Adım: ThingSpeak'e Veri Gönderme

ThingSpeak'e Veri Gönderme
ThingSpeak'e Veri Gönderme

Bu noktada, RPi'yi 3 sensörden veri yakalamak için nasıl hazırlayacağımızı öğrendik ve bunları terminalde yazdırdık. Şimdi, bu verilerin IoT platformu olan ThingSpeak'e nasıl gönderileceğini görmenin zamanı geldi.

Hadi başlayalım!

Öncelikle ThinkSpeak.com'da bir hesabınızın olması gerekir.

Bir Kanal oluşturmak ve Kanal Kimliğinizi not almak ve API Anahtarı Yazmak için talimatları izleyin

Python Komut Dosyasını GitHub'ımdan indirin: localData ToTS_v1_EXT.py

Kodun en önemli kısımlarını yorumlayalım:

İlk olarak, ThingSpeak kitaplığını içe aktaralım, WiFi istemcisini tanımlayalım ve yerel Yönlendirici ve Thinkspeak kimlik bilgilerinizi tanımlayalım:

ithal şey

ThingSpeak ile iletişim kurmanın birkaç yolu vardır; en basit yol, Mikolaj Chwaliz ve Keith Ellis tarafından geliştirilenthingspeak.com API için istemci kitaplığını kullanmaktır.

Kütüphane https://github.com/mchwalisz/thingspeak adresinden indirilebilir veya terminalde PIP kullanılıyor olabilir:

sudo pip3 şey konuşun

Ardından, komut dosyasının içinde ThingSpeak kanal kimlik bilgilerini güncelleyin

chId = 9999999 # Kanal Kimliğinizle girin

tsKey='KANAL YAZMA ANAHTARI İLE GİRİN' tsUrl='https://api.thingspeak.com/update' ts =thingspeak. Channel(chId, tsUrl, tsKey)

Şimdi 3 sensörü başlatalım:

# DS18B20 1-Wire kitaplığı

w1thermsensor'dan içe aktar W1ThermSensor ds18b20Sensor = W1ThermSensor() # Varsayılan olarak GPIO 4 kitaplık tarafından kullanılır # DHT22 Kitaplık içe aktarma Adafruit_DHT DHT22Sensor = Adafruit_DHT. DHT22 DHTpin = 16 # BMP180 kitaplık içe aktarma Adafruit_BMP. BMP085 as BMP08 BMP185() BMP085() Hava İstasyonunuzun bulunduğu gerçek rakımı tanımlamalı, Global değişkeni "altReal" güncellemelisiniz. Benim durumumda, İstasyonum deniz seviyesinden 950m yüksekte bulunuyor.

küresel altReal

altReal = 950

İstasyonun gerçek irtifasını girdi olarak girdikten sonra, bmp180GetData(altitude) fonksiyonunu kullanarak mutlak basınç, deniz seviyesi basıncı, sıcaklık ve rakımı elde edebiliriz:

def bmp180GetData(rakım):

temp = bmp180Sensor.read_temperature() pres = bmp180Sensor.read_pressure() alt=bmp180Sensor.read_altitude() presSeaLevel = pres / pow(1.0 - yükseklik/44330.0, 5.255) temp = yuvarlak (temp, 1) pres = yuvarlak (basın/100), 2) # hPa (veya mbar) cinsinden mutlak basınç alt=yuvarlak (alt) presSeaLevel = yuvarlak (presSeaLevel/100, 2) # hPa (veya mbar) cinsinden mutlak basınç dönüş sıcaklığı, pres, alt, presSeaLevel

getLocalData() işlevi, istasyonumuz tarafından yakalanan tüm yerel verileri döndürür:

def getLocalData():

global timeString global humLab global tempExt global tempLab global presSL global altLab global presAbs # Şimdi okuma zamanını al = datetime.datetime.now() timeString = now.strftime("%Y-%m-%d %H:%M") # Dış Sıcaklığı Oku (1 metre mesafe) tempExt = round(ds18b20Sensor.get_temperature(), 1) tempLab, presAbs, altLab, presSL = bmp180GetData(altReal) humDHT, tempDHT = Adafruit_DHT.read_retry(DHT22Sensor, DHTpin) humDHT Yok değilse ve tempDHT Yok değildir: humLab = yuvarlak (humDHT

Yukarıdaki işlevler tarafından yakalanan tüm verilere sahip olduğunuzda, bunları ThingSpeak'e göndermelisiniz. Bunu sendDataTs() işlevini kullanarak yapacaksınız:

def sendDataTs():

data = { "field1": tempLab, "field2": tempExt, "field3": humLab, "field4": pressSL, "field5": altLab } ts.update(data) print ("[BİLGİ] 5 alan için veri gönderildi: ", tempLab, tempExt, humLab, presSL, altLab)

Kanal verileriniz güncellendiğinde, komut dosyasını kaydedin ve terminalinizde çalıştırın:

sudo Python3 localData_ToTs_v1_EXT.py

İletişim protokolleri hakkında

"thingspeak kitaplığı" kullanılarak, "istek kitaplığı"nın içe aktarıldığını, yani Python'da yazılmış bir Apache2 Lisanslı HTTP kitaplığı olduğunu unutmayın. Resmi Kurulum İsteği belgeleri burada bulunabilir:

docs.python-requests.org/en/latest/user/install/

Gerekirse, komut dosyanızı çalıştırmadan önce istek kitaplığının kurulu olup olmadığını doğrulayabilirsiniz:

sudo pip3 yükleme istekleri

İsteğe bağlı olarak, MTTQ'yu ThingSpeak'e veri göndermek için bir yöntem olarak kullanabilirsiniz. MQTT, bir zamanlar HTTP'den farklıdır, özellikle hafif olacak şekilde tasarlanmıştır ve düşük RAM ve CPU performansına sahip gömülü cihazlar için tasarlanmıştır. Ayrıca çoğu durumda MQTT daha az bant genişliği kullanır.

Bu eğiticiye bakın: Daha fazla ayrıntı için bir Raspberry Pi'de MQTT kullanarak bir ThingSpeak Kanalı'nı güncelleyin.

8. Adım: ESP8266 Kullanarak Uzak Verileri ThingSpeak'e Gönderme

ESP8266 Kullanarak ThingSpeak'e Uzak Veri Gönderme
ESP8266 Kullanarak ThingSpeak'e Uzak Veri Gönderme
ESP8266 Kullanarak ThingSpeak'e Uzak Veri Gönderme
ESP8266 Kullanarak ThingSpeak'e Uzak Veri Gönderme

Bu adım için, muy eğitiminde açıklanan aynı HW'yi kullanacağız:

IOT KOLAYLAŞTIRILDI: UZAKTAN HAVA DURUMU VERİLERİNİ YAKALAMA: UV VE HAVA SICAKLIĞI VE NEM

Burada kullanacağımız kod, temelde bu eğitimde kullanılanla aynıdır. Kodun en önemli kısımlarını yorumlayalım:

Öncelikle ESP8266 kitaplığını çağıralım, WiFi istemcisini tanımlayalım ve yerel Router ve Thinkspeak kimlik bilgilerinizi tanımlayalım:

/* NodeMCU ESP12-E */

#include WiFiClient istemcisi; const char* MY_SSID = "SSD'İNİZLE GİRİN"; const char* MY_PWD = "ŞİFRENİZLE GİRİN"; /* Thinkspeak */ const char* TS_SERVER = "api.thingspeak.com"; String TS_API_KEY ="YAZMA ANAHTARI İLE GİRİN";

İkinci olarak IoT projeleri için çok önemli bir kütüphaneyi ekleyelim: SimpleTimer.h:

/* ZAMANLAYICI */

#include SimpleTimer zamanlayıcı;

Üçüncüsü, kurulum() sırasında seri iletişimi başlatacağız, connectWiFi() işlevini çağıracağız ve zamanlayıcıları tanımlayacağız. Şu kod satırına dikkat edin: timer.setInterval(60000L, sendDataTS); ThinkSpeak kanalına veri yüklemek için her 60 saniyede bir sendDataTS() işlevini çağırır.

geçersiz kurulum()

{ … Serial.başlangıç(115200); gecikme(10); … connectWifi(); timer.setInterval(60000L, sendDataTS); … }

Son olarak, ama en az değil, döngü () sırasında, gereken tek komut zamanlayıcıyı başlatmaktır ve hepsi bu kadar!

boşluk döngüsü()

{ … timer.run(); // SimpleTimer'ı başlatır }

Aşağıda Thinkspeak iletişimini yönetmek için kullanılan iki önemli işlevi görebilirsiniz:

WiFi ağınızla ESP12-E bağlantısı:

/***************************************************

* WiFi'ye bağlanma ******************************************************* ***/ void connectWifi() { Serial.print("Bağlanıyor "+ *MY_SSID); WiFi.begin(MY_SSID, MY_PWD); while (WiFi.status() != WL_CONNECTED) { gecikme(1000); Seri.print("."); } Serial.println(""); Serial.println("WiFi Bağlandı"); Seri.println(""); }

ESP12-E ThinkSpeak'e veri gönderiyor:

***************************************************

* Thinkspeak Kanalına Veri Gönderme ************************************************* ******/ void sendDataTS(void) { if (client.connect(TS_SERVER, 80)) { String postStr = TS_API_KEY; postStr += "&field6="; postStr += Dize(geçici); postStr += "&field7="; postStr += String(vızıldama); postStr += "&field8="; postStr += String(dataSensorUV); postStr += "\r\n\r\n"; client.print("POST /HTTP/1.1 güncelleme\n"); client.print("Ana Bilgisayar: api.thingspeak.com\n"); client.print("Bağlantı: kapat\n"); client.print("X-THINGSPEAKAPIKEY: " + TS_API_KEY + "\n"); client.print("Content-Type: application/x-www-form-urlencoded\n"); client.print("İçerik-Uzunluk: "); client.print(postStr.length()); client.print("\n\n"); client.print(postStr); gecikme(1000); } gönderildi++; istemci.durdur(); }

Kodun tamamı GitHub'ımda bulunabilir: NodeMCU_UV_DHT_Sensor_OLED_TS_EXT

Kodu NodeMCU'nuza yükledikten sonra. Harici bir pil bağlayalım ve güneş altında biraz ölçüm yapalım. Remote Station'ı çatıya koydum ve yukarıdaki fotoğraflarda gösterildiği gibi ThingSpeak.com'da veri toplamaya başladım.

9. Adım: Son Notlar

Son Notlar
Son Notlar

Bu öğreticinin temel amacı, Raspberry Pi'nin ThingSpeak'e nasıl bağlanacağını göstermekti. Bu, verileri yakalamak ve bir IoT platformunda günlüğe kaydetmek için harikadır.

Fırsatı kullanarak, verileri bir ESP8266 kullanarak uzak bir istasyondan yakalayarak söz konusu kanala da gönderdik. Bu yaklaşım tamam, ama en iyisi değil. "Eşzamansız" bir işlemimiz olduğundan, bazen hem RPi hem de ESP8266, ThingSpeak tarafından reddedilenleri aynı anda (veya küçük bir aralıkla) kaydetmeye çalışır. İdeal olan, ESP8266'nın yerel olarak Raspberry Pi'ye veri göndermesini ve sonuncunun tüm verileri işlemekten sorumlu olmasını sağlar. Bunu yaparak, "Ana İstasyon" (Raspberry Pi) 3 şey yapabilir:

  • Tüm verileri yerel bir veritabanına kaydedin
  • Tüm verileri yerel bir Web Sayfasında sunun (yukarıdaki fotoğrafta gösterildiği gibi Flask kullanarak)
  • Tüm verileri aynı anda ThingSpeak'e gönderme.

Gelecekteki bir eğitimde, bu seçenekleri keşfedeceğiz.

Adım 10: Sonuç

Çözüm
Çözüm

Her zaman olduğu gibi, umarım bu proje başkalarının heyecan verici elektronik dünyasına girmelerine yardımcı olabilir!

Ayrıntılar ve son kod için lütfen GitHub depomu ziyaret edin: RPi-NodeMCU-Weather-Station

Daha fazla proje için lütfen blogumu ziyaret edin: MJRoBot.org

Bizi izlemeye devam edin! Sonraki derste, bir Raspberry Pi Web sunucusuna dayalı olarak, uzak bir hava istasyonundan merkezi bir istasyona veri göndereceğiz:

Dünyanın güneyinden selamlar!

Bir sonraki talimatımda görüşürüz!

Teşekkürler, Marcelo