İçindekiler:
- Adım 1: Malzeme Listesi - Malzeme Listesi
- Adım 2: Sıcaklık ve Nem Sensörünün Kurulumu
- Adım 3: DS18B20'nin Kurulumu - Sıcaklık Sensörü
- Adım 4: BMP180'in Kurulması
- Adım 5: BMP180 ile Hava ve Yükseklik Ölçümü
- 6. Adım: Eksiksiz Donanım
- 7. Adım: ThingSpeak'e Veri Gönderme
- 8. Adım: ESP8266 Kullanarak Uzak Verileri ThingSpeak'e Gönderme
- 9. Adım: Son Notlar
- Adım 10: Sonuç
Video: RPi ve ESP8266 ile IoT Hava İstasyonu: 10 Adım
2025 Yazar: John Day | [email protected]. Son düzenleme: 2025-01-13 06:58
Ö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
- Ahududu Pi V3 - 32,00 ABD Doları
- DHT22 Sıcaklık ve Bağıl Nem Sensörü - USD 9.95
- Direnç 4K7 ohm
- DS18B20 Su Geçirmez Sıcaklık Sensörü - USD 5,95
- Direnç 4K7 ohm
- 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
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:
- Pin 1 - Vcc ==> 3.3V
- Pin 2 - Veri ==> GPIO 16
- Pin 3 - Bağlanmıyor
- 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.
Adım 3: DS18B20'nin 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ı
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ü
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
7. Adım: 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
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
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ç
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