1. ünite / 8
Sensörden zaman serisine: seradan veri toplamak
Örnekleme aralığı, zaman damgası, okunamayan örnek ve imkânsız değer: makine öğrenmesinin ham maddesi nasıl üretilir.
Bu ünitenin sonunda
- Bir ölçüm için uygun örnekleme aralığını gerekçesiyle seçmek
- Kayma biriktirmeyen, zaman damgalı bir kayıt döngüsü yazmak
- Okunamayan örneği NaN olarak saklamanın neden doğru olduğunu açıklamak
- sera-sensorleri.csv dosyasının sütunlarını, düzenini ve kusurlarını tanımlamak
Ders notları
Makine öğrenmesi modeli yalnızca verdiğin veriyi bilir. Bu derste her şey tek bir seradan başlar: bir ESP32, bir DHT22 (sıcaklık ve bağıl nem), bir BME280 (basınç), bir LDR (ışık) ve su deposunun üstünde bir HC-SR04 (sensörden su yüzeyine mesafe). Yedi gün boyunca her on dakikada bir satır yazılır: toplam 7 × 144 = 1008 satır.
Ne sıklıkla ölçmeli?
Kural basittir: ölçtüğün büyüklüğün en hızlı anlamlı değişiminin en az iki katı sıklıkta örnekle (Nyquist sezgisi). Sera sıcaklığı dakikalar içinde değil, onlarca dakikada değişir; 10 dakika yeterlidir. Kapı açılınca oluşan 30 saniyelik soğuk hava darbesini görmek istiyorsan 10 dakika kaçırır. Daha sık örneklemek bedava değildir: pil, depolama ve gönderilen veri artar. DHT22 zaten en çok iki saniyede bir okunabilir.
Zaman damgası ve kayma
delay(600000)kullanırsan okuma ve yazma süresi her turda eklenir; bir haftada dakikalar kayar.- Doğrusu bir sonraki okuma anını hesaplamak:
next += STEP_MS.millis()49,7 günde taşar;(int32_t)(now - next) < 0karşılaştırması taşmaya dayanıklıdır. - Gerçek saat gerekiyorsa NTP (Wi-Fi) ya da DS3231 gibi bir RTC kullan. Bu veri setinde zaman "başlangıçtan geçen dakika" olarak tutulur, günün saati ondan hesaplanır.
Kusurlar veriyle birlikte gelir
Gerçek sensörler kusursuz değildir ve veri seti bunu bilerek taşır:
- Gürültü: DHT22 sıcaklıkta yaklaşık ±0,25 °C titrer.
- Okunamayan örnek: DHT22 zaman aşımına düşer; sıcaklık ve nem birlikte
NaNolur. Dosyada 16 sıcaklık örneği NaN. - Sıçrama: gevşek bir kablo 85 °C ya da −40 °C gibi imkânsız değerler üretir; dosyada 7 tane.
- Arıza: 5. gün 13:00 ile 19:00 arası ısıtıcı açık kalır;
arizasütunu bu 36 örnekte 1'dir. Bu bitirme projesinin hedefidir.
Okunamayan örneği 0 ya da son değerle doldurarak kaydetme. 0 °C gerçek bir ölçüm gibi görünür ve sonraki her adımı zehirler. Eksik veriyi eksik olarak sakla (NaN, boş hücre); nasıl dolduracağına temizleme ünitesinde, bilerek karar verirsin.
Biçim: CSV
Sütunlar: dakika, saat, sicaklik, nem, basinc, isik, mesafe, ariza. Seri porttan bilgisayara, SD karta ya da MQTT ile buluta gidebilir. Hangi yolu seçersen seç, başlık satırı, birimler ve örnekleme aralığı belgelenmelidir: veri seti sayfasında hepsi yazılıdır.
Simülasyonlar
Sensör kaydedici: seradan zaman serisi
DHT22, BME280, LDR ve HC-SR04'ü seranın içine koy ve kaydet. Örnekleme aralığını, gürültüyü, okunamayan örnek ve sıçrama oranını değiştir; kaydı CSV olarak indir. Aynı tohum her seferinde aynı veriyi verir.
| dakika | saat | sicaklik | nem | basinc | isik | mesafe | ariza |
|---|---|---|---|---|---|---|---|
| 0 | 0 | 20.18 | 90.93 | 1017.36 | 29 | 21.73 | 0 |
| 10 | 0.17 | 19.71 | 90.38 | 1017.45 | 0 | 21.91 | 0 |
| 20 | 0.33 | NaN | NaN | 1017.32 | 10 | 21.87 | 0 |
| 30 | 0.5 | 19.85 | 90.58 | 1017.59 | 0 | 21.64 | 0 |
| 40 | 0.67 | 19.35 | 89.84 | 1017.31 | 15 | 21.9 | 0 |
3B sera: ölçüm, tahmin ve anomali
Yedi günlük sera verisini 3B serada oynat. Yatakların rengi sıcaklığı, direkteki etiket gerçek ve tahmin değerini, öndeki sütunlar son iki saatin tahmin artığını gösterir. 5. günde ısıtıcı takılınca artık büyür, fener sarıdan kırmızıya döner.
3B sahne yükleniyor…
Sürükle: döndür · iki parmak / tekerlek: yakınlaş · sağ tuş: kaydır
Kod
#include <DHT.h>
#include <Adafruit_BME280.h>
DHT dht(4, DHT22); // DHT22 veri ucu GPIO4
Adafruit_BME280 bme; // I2C: SDA 21, SCL 22
const uint32_t STEP_MS = 10UL * 60 * 1000;
const int LDR_PIN = 34; // ADC1: Wi-Fi açıkken de çalışır
const int TRIG = 5, ECHO = 18; // HC-SR04
uint32_t next = 0;
float distanceCm() {
digitalWrite(TRIG, HIGH); delayMicroseconds(10); digitalWrite(TRIG, LOW);
unsigned long us = pulseIn(ECHO, HIGH, 30000); // zaman aşımı 30 ms
return us ? us / 58.0 : NAN; // yankı yoksa NaN
}
void setup() {
Serial.begin(115200);
dht.begin(); bme.begin(0x76);
pinMode(TRIG, OUTPUT); pinMode(ECHO, INPUT);
Serial.println("dakika,sicaklik,nem,basinc,isik,mesafe");
}
void loop() {
uint32_t now = millis();
if ((int32_t)(now - next) < 0) return; // taşmaya dayanıklı karşılaştırma
next += STEP_MS; // kayma birikmez: delay() yok
float t = dht.readTemperature(); // okunamazsa NaN döner
float h = dht.readHumidity();
Serial.printf("%lu,%.2f,%.2f,%.2f,%d,%.2f\n", now / 60000UL, t, h,
bme.readPressure() / 100.0, analogRead(LDR_PIN), distanceCm());
}import dht, machine, time
d = dht.DHT22(machine.Pin(4))
ldr = machine.ADC(machine.Pin(34))
ldr.atten(machine.ADC.ATTN_11DB) # 0..3,1 V aralığı
t0 = time.ticks_ms()
with open("kayit.csv", "a") as f:
while True:
dk = time.ticks_diff(time.ticks_ms(), t0) // 60000
try:
d.measure()
t, h = d.temperature(), d.humidity()
except OSError: # zaman aşımı: veriyi uydurma
t = h = float("nan")
f.write("%d,%.2f,%.2f,%d\n" % (dk, t, h, ldr.read() >> 2))
f.flush() # elektrik kesilirse satır kaybolmasın
time.sleep(600)Kodu tarayıcıda çalıştırPython · NumPy · matplotlib · Pyodide
Python ve NumPy bu sayfada, tarayıcında çalışır (Pyodide). Kodu değiştirip yeniden çalıştırabilirsin; dersin veri setleri çalışma klasöründe hazır. Kod matplotlib kullanırsa grafikler çıktının altında görünür, yazdığı dosyalar (ör. egitim_gecmisi.csv) indirilebilir.
Çıktı
Çıktı burada görünecek.Kendin dene
Sensör kaydedicide önce varsayılan ayarlarla 7 günü kaydet ve grafikte 5. gün öğleden sonraki ısıtıcı arızasını bul. Sonra örnekleme aralığını 60 dakikaya çıkar: günlük tepe hâlâ görünüyor mu? Okunamayan örnek oranını %10 yap, sıçrama oranını artır ve sayaçlardaki NaN ile sıçrama sayısının nasıl değiştiğini not et. Aynı tohumla iki kez kaydedip CSV'lerin birebir aynı olduğunu doğrula, sonra Python kodunu çalıştırıp dosyadaki 16 NaN ve 7 sıçramayı say.
Sık yapılan hatalar
- delay() ile örnekleme yapmak: okuma süresi her turda eklenir, zaman damgaları kayar.
- Okunamayan örneği 0 ya da son değerle kaydetmek: sahte ama gerçek görünen veri üretir.
- Örnekleme aralığını belgelememek: sonraki her gecikme ve kayan pencere hesabı bu sayıya bağlıdır.
- LDR'yi ADC2 pinine bağlamak: ESP32'de Wi-Fi açıkken ADC2 okunamaz; ADC1 (GPIO32 ile 39 arası) kullan.
- Birimleri dosyaya yazmamak: basınç Pa mı hPa mı, mesafe cm mi mm mi, altı ay sonra kimse hatırlamaz.
Yazılım mühendisliği bağlantısı
Veri toplama kodu bir veri sözleşmesi üretir: sütun adları, birimler, aralıklar ve eksik değerin nasıl gösterildiği. Sözleşme yazılı olmalı ve test edilmelidir.
- Bu derste CSV dosyası, onu üreten simülatörle birebir aynı olduğu bir testle korunur; üreteç değişirse test kırılır.
- Tekrarlanabilirlik için tohum (seed) kullan: aynı tohum aynı veriyi verir, hata ayıklama kolaylaşır.
- Ham veriyi asla yerinde değiştirme; temizlenmiş veri ayrı bir dosya ya da ayrı bir sütundur.
Kendini sına
7 gün boyunca 10 dakikada bir örnek alan bir kaydedici kaç satır üretir?
DHT22 zaman aşımına düştü. Kayda ne yazılmalı?
Kayma biriktirmeyen örnekleme için hangisi doğru?
Sıcaklık sütununda 85 °C ve −40 °C değerleri var. En olası açıklama?
