[java] 센서 데이터 활용 (가속도, 자이로스코프, 방향 등)

개요

이번 글에서는 Java를 사용하여 센서 데이터를 활용하는 방법에 대해 알아보겠습니다. 센서 데이터는 기기의 이동, 회전, 방향 등과 관련된 정보를 제공하여 다양한 애플리케이션에서 활용될 수 있습니다. 주로 가속도, 자이로스코프, 방향 센서가 사용됩니다.

센서 데이터 읽기

Java에서 센서 데이터를 읽기 위해서는 안드로이드 API를 사용해야 합니다. 따라서, 안드로이드 프로젝트를 생성하고 소스 코드를 작성해야 합니다.

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;

public class SensorReader implements SensorEventListener {

    private SensorManager sensorManager;
    private Sensor accelerometer;
    private Sensor gyroscope;
    private Sensor magnetometer;
    
    public SensorReader(Context context) {
        sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
        accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        gyroscope = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
        magnetometer = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
    }
    
    public void startReading() {
        sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
        sensorManager.registerListener(this, gyroscope, SensorManager.SENSOR_DELAY_NORMAL);
        sensorManager.registerListener(this, magnetometer, SensorManager.SENSOR_DELAY_NORMAL);
    }
    
    public void stopReading() {
        sensorManager.unregisterListener(this);
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // 센서 정확도 변경 시 호출됨
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        // 센서 데이터 변경 시 호출됨
        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
            // 가속도 센서 데이터를 처리하는 로직 작성
        } else if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) {
            // 자이로스코프 센서 데이터를 처리하는 로직 작성
        } else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
            // 방향 센서 데이터를 처리하는 로직 작성
        }
    }
}

위 코드는 센서 데이터를 읽기 위해 필요한 클래스를 구현한 예시입니다. SensorReader 클래스는 SensorEventListener 인터페이스를 구현하여 센서 데이터의 변화를 감지합니다. startReading 메소드를 호출하면 센서 데이터를 읽기 시작하고, stopReading 메소드를 호출하면 센서 데이터 읽기를 중지합니다. 센서 데이터는 onSensorChanged 메소드에서 처리하게 됩니다.

센서 데이터 활용

읽어온 센서 데이터를 활용하여 다양한 기능을 구현할 수 있습니다. 예를 들면, 센서 데이터를 기반으로 기기의 방향을 계산하거나, 흔들림을 감지하여 특정 동작을 수행할 수도 있습니다. 아래는 센서 데이터를 활용하는 간단한 예시 코드입니다.

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.widget.Toast;

public class SensorUtil implements SensorEventListener {

    private SensorManager sensorManager;
    private Sensor accelerometer;
    private long lastShakeTime = 0;
    private static final int SHAKE_THRESHOLD = 1000;

    public SensorUtil(Context context) {
        sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
        accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    }

    public void startListening() {
        sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
    }

    public void stopListening() {
        sensorManager.unregisterListener(this);
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // 센서 정확도 변경 시 호출됨
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        // 가속도 센서 데이터를 처리하는 로직 작성
        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
            float x = event.values[0];
            float y = event.values[1];
            float z = event.values[2];

            double acceleration = Math.sqrt(x * x + y * y + z * z);

            long currentTime = System.currentTimeMillis();
            if ((currentTime - lastShakeTime) > SHAKE_THRESHOLD) {
                if (acceleration > SHAKE_THRESHOLD) {
                    // 흔들림 감지 수행
                    showToast("흔들림 감지!");
                    lastShakeTime = currentTime;
                }
            }
        }
    }

    private void showToast(String message) {
        Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
    }
}

위 예시 코드는 센서 데이터를 활용하여 기기의 흔들림을 감지하는 SensorUtil 클래스입니다. onSensorChanged 메소드에서는 가속도 센서 데이터를 읽어와 흔들림을 감지하고, 흔들림이 감지되면 토스트 메시지를 띄웁니다.

결론

위에서는 Java를 사용하여 센서 데이터를 활용하는 방법에 대해 알아보았습니다. 센서 데이터를 읽고 처리하여 다양한 애플리케이션에서 활용할 수 있습니다. 센서 데이터를 실시간으로 읽으려면 안드로이드 API를 사용하는 것이 필요하며, 해당 API를 활용하여 센서를 등록하고 데이터를 처리할 수 있습니다.