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

in #kr6 years ago (edited)

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

noname01.png

필요한 준비물은 아래와 같다.
안드로이드 스마트 폰; 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로 입력하자.

noname02.png

#앱 인벤터 코딩 디자인

noname03.png

팔레트의 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)에 해당한다.

noname05.png

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

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

noname06.png

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

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

noname07.png

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

noname08.png

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

}//끝

Sort:  

꾸준히 올리시는데 참 보기 좋습니다^^ 화이팅입니다

pairplay 가 kr-dev 컨텐츠를 응원합니다! :)

Coin Marketplace

STEEM 0.28
TRX 0.13
JST 0.032
BTC 66304.34
ETH 2983.64
USDT 1.00
SBD 3.68