Sensor Verileriyle Adımlı Sayıcı: Accelerometer Okuma ve Filtreleme
Akıllı telefonların accelerometer sensörü, cihazın hareketi ölçer. Bu veriyi kullanarak adım sayısını hesaplayabilirsin. Problemi şu: ham sensor verileri gürültülü olur, doğru adımları bulmak için filtreleme gerekir.
Accelerometer üç eksen (X, Y, Z) verisi döndürür. Adım tespiti için bu üç eksenden bileşke ivmeyi hesaplarız, sonra tepe noktalarını buluruz. Her tepe bir adıma karşılık gelir.
Adım 1: Sensor Dinleyici Oluştur
1import android.hardware.Sensor2import android.hardware.SensorEvent3import android.hardware.SensorEventListener4import android.hardware.SensorManager5import kotlin.math.sqrt67class StepCounter(private val onStepDetected: () -> Unit): SensorEventListener {8private var lastMagnitude = 0f9private var stepCount = 010private val threshold = 25f // Adım eşiği11private val buffer = mutableListOf<Float>()12private val bufferSize = 51314override fun onSensorChanged(event: SensorEvent) {15if (event.sensor.type == Sensor.TYPE_ACCELEROMETER) {16val x = event.values[0]17val y = event.values[1]18val z = event.values[2]1920// Bileşke ivme hesapla21val magnitude = sqrt(x*x + y*y + z*z)2223// Hareketli ortalama ile filtreleme24buffer.add(magnitude)25if (buffer.size > bufferSize) buffer.removeAt(0)26val smoothed = buffer.average().toFloat()2728// Tepe tespiti: değer eşikten büyük ve önceki değerden fazla29if (smoothed > threshold && smoothed > lastMagnitude) {30stepCount++31onStepDetected()32}33lastMagnitude = smoothed34}35}3637override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {}3839fun getStepCount() = stepCount40}Adım 2: Activity'de Kullan
1import android.content.Context2import android.hardware.SensorManager3import androidx.appcompat.app.AppCompatActivity4import android.os.Bundle5import android.widget.TextView67class MainActivity: AppCompatActivity() {8private lateinit var sensorManager: SensorManager9private lateinit var stepCounter: StepCounter10private lateinit var stepText: TextView1112override fun onCreate(savedInstanceState: Bundle?) {13super.onCreate(savedInstanceState)14setContentView(R.layout.activity_main)1516stepText = findViewById(R.id.step_text)17sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager1819stepCounter = StepCounter {20stepText.text = "Adımlar: ${stepCounter.getStepCount()}"21}2223val accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)24sensorManager.registerListener(stepCounter, accelerometer, SensorManager.SENSOR_DELAY_NORMAL)25}2627override fun onDestroy() {28super.onDestroy()29sensorManager.unregisterListener(stepCounter)30}31}Beklenen Çıktı:
Ekranda "Adımlar: 42" gibi artan bir sayı görürsün. Cihazı yürüyüş hareketi yaparak test et.
Sık Yapılan Hata:
Eşik değeri (threshold) çok düşükse yanlış adımlar sayılır, çok yüksekse gerçek adımlar kaçırılır. Kullanıcıya göre kalibre et. Ayrıca `SENSOR_DELAY_NORMAL` yerine `SENSOR_DELAY_FASTEST` kullanırsan pil tüketimi artar.
0 yorum