안녕하세요! 아두이노, 안드로이드 블루투스 실습 두번 째 시간입니다.
오늘은 안드로이드 스튜디오로 센서 값을 받아오는 어플을 만들어 보도록 하겠습니다.
아마 많은 분들께서 Code-jun님의 블루투스 예제를 보셨을거라고 생각합니다.
실제로도 라이브러리가 상당히 잘 만들어져 있어 사용하는데 어려움이 없다고 생각합니다.
저는 이번에 Code-jun님이 올리신 라이브러리 예제를 통해 블루투스 무선통신을 하도록 하겠습니다.
위 사이트 방법대로 라이브러리를 추가한 후 이제 제 방식대로 코딩을 해보도록 하겠습니다.
1. 디자인
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="50dp"
android:textSize ="40sp"
android:layout_gravity = "center"
android:text="온습도센서('C, %)" />
<Button
android:id="@+id/btnConnect"
android:layout_gravity = "center"
android:layout_width="300dp"
android:layout_height="50dp"
android:text="연결"
/>
<TextView
android:id="@+id/temp"
android:layout_width="match_parent"
android:layout_height="80dp"
android:textSize ="50sp"
android:gravity="center_horizontal"
android:hint="온도" />
<TextView
android:id="@+id/humd"
android:layout_width="match_parent"
android:layout_height="80dp"
android:textSize="50sp"
android:gravity="center_horizontal"
android:hint="습도" />
</LinearLayout>
디자인에 신경쓰시는 분들께서는 자신의 입맛대로 고쳐 쓰시면 됩니다.
그리고 사용하시기 전에 주의할 점이 있습니다. 제가 굵게 표시한 android.hint 부분은 블루투스에서 값이 전달되기
시작하면 textview 부분이 바껴야 하기 때문에 android.text로 하시면 안됩니다.
값이 올바르게 가더라도 값이 변하지 않습니다.
2. 데이터 수신
bt.setOnDataReceivedListener(new BluetoothSPP.OnDataReceivedListener() { //데이터 수신
public void onDataReceived(byte[] data, String message) {
Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show();
}
});
출처: https://blog.codejun.space/13 [CodeJUN]
라이브러리 출처 : https://github.com/akexorcist/Android-BluetoothSPPLibrary
위 함수는 데이터를 수신받고 있습니다. 그렇다면 어떻게 해야할까요?
방법은 두 가지입니다. 아두이노에서 문자로 보내는 방법, 바이트로 보내는 방법. 두가지 입니다.
우리는 바이트로 계산을 해서 값을 보내는 것은 어려우니 저희는 문자로 보내도록 하겠습니다.
하지만 생각해 봐야할 문제가 있습니다.
우리가 아두이노에서 안드로이드로 보낼 값은 온도, 습도 두 가지인데 어떻게 해야하나.
정답은 한 번에 문자열로 보낸 후, 수신부에서 쪼개면 됩니다.
bt.setOnDataReceivedListener(new BluetoothSPP.OnDataReceivedListener() {
TextView temp = findViewById(R.id.temp);
TextView humd = findViewById(R.id.humd);
public void onDataReceived(byte[] data, String message) {
String[] array = message.split(",");
temp.setText(array[0].concat("C"));
humd.setText(array[1].concat("%") );
}
});
그리고 문자열의 끝은 개행문자로 끝이 납니다. (중요 중요)
개행문자?? new line(띄어쓰기)을 말합니다.
그럼 아두이노 송신 스케치를 다시 한번 보도록 하겠습니다.
자! 다시 보니 이해가 가시나요?
아두이노에서는 블루투스로
[temp(value), humd(value) /n] 이러한 형태의 문자열로 1초에 한 번씩 블루투스에게 값을 보내줍니다.
어? 만약 안드로이드 스튜디오에서 String으로 값을 받았네?
나는 숫자로 받아서 안드로이드 스튜디오에서 계산해서 값을 집어넣고 싶은데?
방법 : 안드로이드 스튜디오 : String에서 double형태로 바꾸기
double dTemp = Double.parseDouble(array[0]);
double dHumd = Double.parseDouble(array[1]);
간단하죠?
여러분들도 온습도 센서말고도 원하는 센서를 달아 보시면 상당히 재미있습니다.
저 같은 경우는
음속 = (331.5 + (0.6*celsius)) m/s
왕복거리 = 음속 * 시간
거리 = (음속 * 시간)/2
위
공식을 사용하여 온도에 따른 좀 더 정확한 초음파 센서를 만들어 보았습니다.
이것으로 블루투스 모듈에 관한 두 번째 글을 마치도록 하겠습니다.
Copyright (c) 2014 Akexorcist
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
'Embeded SW > Arduino' 카테고리의 다른 글
PWM으로 아날로그 값을 출력해보자! 1편 (0) | 2020.01.28 |
---|---|
Pull up(풀업) , Pull down(풀다운) 저항에 대해 알아보자! (0) | 2020.01.26 |
아두이노, 안드로이드를 블루투스로 연결해서 센서값 읽어오기!(1) (1) | 2020.01.21 |
millis()함수를 통해 LED 동시에 켜보자! (0) | 2020.01.20 |
아두이노 delay() VS millis() 정확히 알고 쓰자! (2) | 2020.01.19 |