본문 바로가기

Kotlin

가속도 센서 가져오기

가속도 센서 가져오는 예제입니다.


화면은 간단히 start버튼을 누르면 센서값 가져오기 시작하고end버튼 누르면 꺼져요..


Xml입니다


<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:background="#353839"
android:layout_height="match_parent" android:orientation="vertical"
android:id="@+id/LinearParent" >

<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content" android:background="#282A2B"/>

<TextView
android:text=""
android:layout_width="match_parent"
android:layout_height="0dp" tools:layout_editor_absoluteY="49dp"
tools:layout_editor_absoluteX="32dp" android:id="@+id/textView" android:layout_margin="0dp"
android:scrollbars="vertical" android:textColor="#FFFFFF" android:paddingLeft="14pt"
android:paddingRight="10pt" android:lineSpacingExtra="5dp" android:layout_weight="9"/>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_weight="1">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="15dp" android:layout_weight="1">
<Button
android:text="Start"
android:layout_width="75pt"
android:layout_height="25pt" android:id="@+id/btn_start" android:layout_weight="1"
android:layout_marginStart="10.5pt"
android:layout_marginEnd="8.5pt" android:textColor="#8B8888" android:textStyle="bold"
android:textAlignment="center"
android:textAllCaps="false" android:textSize="10.5pt"
/>
<Button
android:text="End"
android:layout_width="75pt"
android:layout_height="25pt" android:id="@+id/btn_end"
android:layout_weight="1"
android:layout_marginStart="0pt" android:layout_marginEnd="8.5pt" android:textColor="#FFFFFF" android:textStyle="bold"
android:textAllCaps="false" android:textSize="10.5pt"/>

</LinearLayout>

</LinearLayout>

</LinearLayout>

 


MainActivity.kt


변수선언 :

public var  m_printString:String=""
//Using the Accelometer & Gyroscoper
private var mSensorManager: SensorManager? = null

var lastTime: Long = 0
var speed = 0.toDouble()
var lastX = 0.toDouble()
var lastY = 0.toDouble()
var lastZ = 0.toDouble()

private var mAccLis: SensorEventListener? = null
private var mAccelometerSensor: Sensor? = null

 


onCreate안에


mSensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager

//Using the Accelometer
mAccelometerSensor = mSensorManager!!.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
mAccLis = AccelometerListener()

 

센서 셋팅~


Start버튼 누르면


mSensorManager!!.registerListener(
mAccLis,mAccelometerSensor,SensorManager.SENSOR_DELAY_UI)



이 Listener를 받아줄 inner class(SensorEventListener)



private inner class AccelometerListener : SensorEventListener {

override fun onSensorChanged(event: SensorEvent) {

if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
val currentTime = System.currentTimeMillis();
val gabOfTime = (currentTime - lastTime);
if (gabOfTime > 100) {

lastTime = currentTime;
val accX = event.values[0].toDouble()
val accY = event.values[1].toDouble()
val accZ = event.values[2].toDouble()

val angleXZ = Math.atan2(accX, accZ) * 180 / Math.PI
val angleYZ = Math.atan2(accY, accZ) * 180 / Math.PI

val gravityX=accX/SensorManager.GRAVITY_EARTH
val gravityY=accY/SensorManager.GRAVITY_EARTH
val gravityZ=accZ/SensorManager.GRAVITY_EARTH

speed = Math.abs(accX + accY + accZ - lastX - lastY - lastZ) / gabOfTime * 10000;


lastX = event.values[0].toDouble();
lastY = event.values[1].toDouble();
lastZ = event.values[2].toDouble();


m_printString="Date :" + getDateString("yyyy-MM-dd hh:mm:ss") + " [X]:" + String.format("%.4f", event.values[0]) +
" [Y]:" + String.format("%.4f", event.values[1]) +
" [Z]:" + String.format("%.4f", event.values[2]) +
" [angleXZ]: " + String.format("%.4f", angleXZ) +
" [angleYZ]: " + String.format("%.4f", angleYZ) +
" [speed]: " + String.format("%.4f", speed) +"\n \n"


}

}
}


override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {

}



} <pre style="background-color:#ffffff;color:#000000;font-family:'굴림체';font-size:7.2pt;"></pre>

  위에 변수로 선언한 

m_printString로 화면에 찍어주면

됨..

fun printData(str:String){
textView.append(str)
var scrollAmount=textView.getLayout().getLineTop(textView.lineCount)-textView.height
if(scrollAmount>0)
textView.scrollTo(0,scrollAmount)
else
textView.scrollTo(0,0)


if(textView.text.length > 10000) {
textView.text = ""
}
}

자동 스크롤과 화면 리셋도 추가된 함수입니다 위에꺼요..