Macademia'nın robotik ve mühendislik programı · ücretsiz seviye tespiti ve kişisel öğrenme yolu

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) < 0 karşı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 NaN olur. 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; ariza sü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.

DHT22 sıcaklık (ham, sıçramalar grafik kenarında kesilir), arıza penceresi gölgeli814.52127.53401.42.84.25.596.99gün°C
Nem ve ışık-8.0921.250.679.9109.301.42.84.25.596.99gün
dakikasaatsicakliknembasincisikmesafeariza
0020.1890.931017.362921.730
100.1719.7190.381017.45021.910
200.33NaNNaN1017.321021.870
300.519.8590.581017.59021.640
400.6719.3589.841017.311521.90
1008 satır · 16 okunamayan (NaN) · 7 sıçrama (85 / −40 °C) · arıza penceresinde 36 örnek Bu ayarlar tam olarak sera-sensorleri.csv'yi verir.

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

5. gün 08:00 · gerçek 19,15 °C, tahmin (30 dk önce) 18,72 °C, z = 1,10 Durum: normal
7 günde uyarılar: 3. gün 08:30, 4. gün 08:30, 5. gün 13:50, 5. gün 19:10

Kod

ESP32: 10 dakikada bir CSV satırı (Arduino C++)
#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());
}
MicroPython: zaman damgalı kayıt ve okunamayan örnek
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.

toplama.pypython

Çı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

  1. 7 gün boyunca 10 dakikada bir örnek alan bir kaydedici kaç satır üretir?

  2. DHT22 zaman aşımına düştü. Kayda ne yazılmalı?

  3. Kayma biriktirmeyen örnekleme için hangisi doğru?

  4. Sıcaklık sütununda 85 °C ve −40 °C değerleri var. En olası açıklama?

Parçalar ve ilgili sayfalar

Esc
  • PanelAna sayfaSayfa
  • ModüllerTüm modüllerSayfa
  • ParçalarParça ansiklopedisiSayfa
  • Mühendislik yoluBüyükler için robotik: 128 parça, 7 seviyeSayfa
  • Robotik dersi (ESOF 323)Üniversite robotik dersi, 14 haftaSayfa
  • Drone dersiBüyükler için: parça, simülasyon, yazılım; 10 üniteSayfa
  • Blok atölyesiSerbest blok programlamaAraç
  • Devre laboratuvarıSanal Arduino ve devreAraç
  • Robot arenasıSanal robot sürüşüAraç
  • OyunlarBloklarla 8 öğretici oyunAraç
  • Mikro Kart atölyesiSanal LED kartı bloklarla programlaAraç
  • Robot atölyesiMikro Kart'ı robota tak, bloklarla görev yapAraç