앱 인벤터 appinventor

앱인벤터와 아두이노 HC-06 블루투스에 의한 DHT11 온습도 모니터링

coding art 2018. 8. 27. 18:37
728x90

구글 플레이 스토어에서 다운 받을 수 있는 블루투스 터미널 앱을 사용하지 말고 자신이 코딩한 앱인벤터로 아두이노 우노에 설치된 DHT11 온습도 센서 데이터를 HC-06 블루투스 센서 보드에 의해서 안드로이드 폰에서 수신해 보자.

 

 

필요한 준비물은 아래와 같다.
안드로이드 스마트 폰; HC-06 아두이노 블루투스 센서 보드 X 1
아두이노 우노 보드 X 1; DHT11 온습도 센서X1; 점퍼선 7개

 

#아두이노 우노 블루투스 배선
HC-06 블루투스 보드의 데이터 선 2개는 TXD 와 RXD 이다. 아두이노 보드의 (0,1)은 코드를 업로딩할 때 사용하기 때문에 점퍼 선을 뺏다 끼웠다 하기가 대단히 불편하므로 SoftwareSerial.h 라이브러리에 의해 (2,3)을 사용하기로 한다.

클라스 선언을 통해 BTSerial (2,3)으로 선언한다. 블루투스 센서 보드의 TXD 가 아두이노 우노에서는 RX 역할을 맡는 2번으로 매칭된다. 마찬가지로 블루투스 센서 보드의 RXD는아두이노 우노에서 TX 역할인 3번으로 매칭된다. DHT11 온습도 센서는 디지털 데이터 핀 5번에 설치하기로 한다. PC와의 통신은 9600 블루투스 통신속도 또한 9600 으로 설정한다. HC-06 의 default 통신 속도는 9600 으로 설정되어 있다.

 

#스마트폰 블루투스 보드 등록
스마트 폰 블루투스 등록 과정은 사용가능한 디바이스를 찾는 것으로 시작된다. 리스트에 나온 블루투스 보드 중에 하나를 선택 터치하면 해당 디바이스의 PIN 번호를 물어본다. 1234로 입력하자.

 

 

#앱 인벤터 코딩 디자인

팔레트의 User Interface에서 ListPicker 1개, 수평배열용 레이아웃 1개, 라벨 1개, Connectivity에서 BluetoothClient 1개, Clock 1개를 사용하기로 한다.

 

ListPicker 란 앞에서 블루투스 보드 찾기 작업을 하면 사용가능한 디바이스 리스트가 뜨는데 이 중에서 여러개의 블루투스 보드를 등록하게 되면 결국 앱인벤터에서도 그 리스트 중에서 하나를 선택해야 한다. 그런 이유로 ListPiking 이란 명칭이 사용되는 듯하다.

ListPicker를 Viewer Screen1 에 드래그한 후 속성 창에서 Text 입력 박스에 DHT11을 입력한다. center, bold를 포함하는 폰트 세부 정보를 입력 하고 Width 항목에서 Fill parent를 선택하면 화면에서 자동적으로 수평 한 줄을 차지하게 된다.

Layout의 HorizontalArrangement를 드래그 하고 라벨 1개를 선택해 드래그 해 넣고 텍스트 명을 Temp & Humidity 로 해 둔다.

 

Clock은 DHT11의 샘플링 시간 간격을 2초로 설정하므로 Timeinterval 을 2000 으로 입력한다. 아두이노의 delay(2000)에 해당한다.

 

#앱 인벤터 블록 편집
ListPicker는 블루투스 사용 시 페어링 이전과 이후에 Address 와 명칭을 처리하는 데 사용된다.

DHT11 이라는 이름의 ListPicker1은 픽(Pick) 전(Before)에 블루투스 클라이언트로서 주소와 이름을 갖는다. Pick 후(After)에는 그 주소와 이름으로 블루투스를 통해 외부 아두이노 우노의 HC_06과 연결(Connect) 한다. 이때 필요한 주소와 이름을 ListPicker1로부터 제공 받는다.

 

#아두이노 앱인벤터 실행
앱인벤터 블록 편집이 끝나면 디자이너로 빠져나와서 내용을 저장하고 Connect 의 AI Companion 명령을 실행한다. 아울러 QR 코드를 스캔하면 앱인벤터 코드가 실행되어 뜬다. 옸11 버튼을 누르면 블루투스 페어링 ID 가 나타난다. 지금은 1개만 스마트폰에 등록했기 때문에 ListPicking 작업이 대단히 쉽다.  98:⦁⦁⦁를 터치 후 잠깐 기다린다.

블루투스가 연결되면 ListPicker1의 DHT11 이 Connected with DHT11 로 바뀐다. 연결된 상태에서 타이머가 작동하며 아두이노 우노에서 2초에 한번씩 샘플된 온습도 데이터가 다수의 바이트 데이터를 한 묶음으로 구성하여 수신된다.

 

묶음 데이터 구성 방식은 “temperature”+측정된 온도 값+“ C deg” 까지를 블루투스에 출력한 후 줄 바꿈 한다. 이어서 “Humidity: ”+측정된 습도 값+“ %” 까지를 출력한다. 이 2개의 데이터를 합한 정보가 안드로이드 폰에서 다수의 바이트들로 구성된 1개 단위의 정보로 수신되어 2줄로 출력된다. 앱인벤터를 실행해 보자.

 

첨부: BT_DHT11_01.aia

BT_DHT11_01.aia
0.00MB

 

한편 SoftwareSerial.h 라이브러리를 사용하지 않고 아두이노 보드의 (0,1)을 사용할 때에는 다음 점을 주의해야 한다. 아두이노 코드를 업로딩할 때에는 HC-06 블루투스 보드의 RXD, TXD 점퍼선을 반드시 빼 놓아야 한다. LED가 지속적으로 껌뻑이는 상태를 확인하자. 컴파일 업로딩이 끝나면 USB 케이블을 제거한 후 RXD, TXD 점퍼선을 다시 끼운다. DC어댑터에 9V 전지가 연결된 잭을 끼우고 스마트폰 앱인벤터 코드에서 페어링 작업을 수행한다. 다소 불편하게 느껴질 수 있다.

 

단 별도로 라이브러리 SoftwareSerial.h 를 불러 올 필요가 없으며 시리얼 모니터가 사용하던 Serial.⦁⦁⦁명령들을 그대로 블루투스가 점유하여 사용하게 된다.

 

앱인벤터 코드는 직접 입력해서 편집하도록 하고 첨부된 아두이노 코드를 사용하도록 하자.

//appinventor_BT_DHT11_01
#include <SoftwareSerial.h>
#include <DHT11.h>
SoftwareSerial BTSerial(2,3);//(RX,TX)
int LED = 13;
int pin=5;
DHT11 dht11(pin);

void setup() {
Serial.begin(9600);
BTSerial.begin(9600);
pinMode(LED,OUTPUT);
}

void loop() {

int err;
float temp, humi;
if((err=dht11.read(humi, temp))==0) {
Serial.print("temperature:");
Serial.println(temp);
BTSerial.print("Temperature:" );
BTSerial.print(temp,0);
BTSerial.println(" C deg");
Serial.print(" humidity:");
Serial.print(humi);
BTSerial.print("Humidity: " );
BTSerial.print(humi,0);
BTSerial.print(" %");
Serial.println();
}
else {
Serial.println();
Serial.print("Error No :");
Serial.print(err);
Serial.println();
}
delay(2000);

}//끝