Sıcaklık Sensörü Okumasında Düşük Geçişli Filtre
Sıcaklık sensörlerinden okunan veriler genellikle gürültülü olur. Elektromanyetik parazitler, kablolama sorunları ya da sensörün kendisindeki titreşim nedeniyle değerler sürekli dalgalanır. Örneğin 25 derece olan bir ortamda sensör 24.8, 25.3, 24.9 gibi değerler verebilir. Bu gürültüyü temizlemek için düşük geçişli filtre (low-pass filter) kullanırız. Yavaş değişimleri geçirir, hızlı dalgalanmaları engeller.
En basit yöntem üstel hareketli ortalama (exponential moving average) tekniğidir. Her yeni ölçümü bir katsayı (alpha) ile ağırlıklandırarak önceki filtrelenmiş değerle birleştiririz. Alpha değeri 0 ile 1 arasında olur; düşük alpha daha çok yumuşatır, yüksek alpha sensöre daha çabuk tepki verir.
Arduino üzerinde DHT22 sensörü ile örnek:
1#include <DHT.h>23#define DHTPIN 24#define DHTTYPE DHT2256DHT dht(DHTPIN, DHTTYPE);7float filteredTemp = 0.0;8const float ALPHA = 0.2;910void setup() {11Serial.begin(9600);12dht.begin();13filteredTemp = dht.readTemperature();14}1516void loop() {17float rawTemp = dht.readTemperature();1819if (!isnan(rawTemp)) {20filteredTemp = (ALPHA * rawTemp) + ((1.0 - ALPHA) * filteredTemp);2122Serial.print("Ham: ");23Serial.print(rawTemp);24Serial.print(" C | Filtrelenmiş: ");25Serial.println(filteredTemp);26}2728delay(500);29}Beklenen çıktı:
1Ham: 25.30 C | Filtrelenmiş: 24.912Ham: 24.80 C | Filtrelenmiş: 24.873Ham: 25.10 C | Filtrelenmiş: 24.95Filtreli değer ham veriye kıyasla çok daha sabit kalır.
Alpha değerini ayarlarken deneme-yanılma yap. 0.1 çok yumuşak, 0.5 çok cevap verici olabilir. Çoğu uygulamada 0.15, 0.3 arası iyi sonuç verir. Daha sofistike filtreleme için Kalman filtresi kullanabilirsin, ama bu basit yöntem çoğu IoT projesi için yeterli.
Sık hata: Filtrelenmiş değeri ilk çalıştırmada doğru başlatmamak. Başlangıçta filteredTemp ilk sensör okumasına eşitle, yoksa ilk saniyeler yanlış değer gösterir.
0 yorum