일전에 LOLIN 보드에 온습도 측정이 가능한 센서 DHT11을 설치하여 시리얼 모니터에서 결과를 관찰하였다. 더 나아가 LOLIN 보드의 와이파이 기능을 사용하여 PC의 공유기를 타고 사물인터넷 서버에 연결하여 LOLIN 보드에서 측정한 온습도 데이터를 ThingSpeak 채널에서 그래프로 관찰 할 수 있었다. 자신이 설치해둔 WeMos LOLIN 보드가 전원 스위치만 끄지 않는다면 측정 결과를 인터넷이 가능한 세계 어느 구석에서라도 온습도 그래프를 볼 수 가 있었다.
한편 지금 LOLIN 보드에서 온습도 측정이 이루어지고 있다면 바로 지근 거리나 혹은 옆방에서 무선으로 직접 온습도 데이터를 모니터링 해 볼 수는 없을까? 그 해답은 바로 블루투스에 있다.
LOLIN 보드에 설치된 DHT11 온습도 센서가 측정한 결과를 자신의 페어링 디바이스 ID와 함께 주변 공간으로 무선 송신하면 핸드폰에서 블루투스에 등록된 디바이스를 통해 블루투스 터미널 앱을 사용하여 쉽게 정보를 수신할 수 있다.
온습도 정보의 경우 측정값이 문자가 아닌 실수이거나 정수 형태를 취한다. 따라서 .print(temp) 또는 .print(humi) 와 같이 출력 명령을 사용하도록 하자. 아울러 온습도 데이터는 변동이 그렇게 기민하지 않기 때문에 시간 지연 값을 충분히 ThingSpeak에서처럼 적어도 15초 이상 주도록 하자. 너무 자주 출력해 봐야 비슷한 숫자를 계속 보고 있을 이유는 없다.
Play 스토어에서 무료로 다운 받을 수 있는 Kai Morich의 Serial Bluetooth Terminal을 사용해 LOLIN 보드가 블루투스로 보내는 정보를 출력해 보도록 하자. 모르긴해도 실수형태나 정수 형태의 데이터를 블루투스 터미널 앱이 충분히 처리할 수 있으리라 보인다.
블루투스에 의한 온습도 측정을 위한 코드는 LOLIN 보드의 블루투스 예제 코드를 불러내어 조금 수정하도록 하자. 아두이노 IDE에서 파일⤍예제⤍WeMos LOLIN 32 예제⤍BluetoothSerial⤍SerialToSerialBT를 불러 오자.
SerialToSerialBT코드의 뼈대를 그대로 유지 한 채로 3 달 전에 포스팅했던 사이트를 참고하여 DHT11 온습도 측정 루틴을 그대로 가져다 업데이트 하자.
초보자를 위한 아두이노 코딩 입문-12: Adafruit DHT11 센서를 이용한 온습도 모니터링
https://steemit.com/kr/@codingart/11-adafruit-dth11
헤더영역의 코드를 보면 이 예제는 BluetoothSerial.h 라는 라이브러리를 사용하고 있다. 그래서 스케치 탭의 라이브러리 포함하기를 체크해 보았더니 ESP32 관련 모든 라이브러리들이 망라되어 있는 것 같은데 이 라이브러리는 보이지 않는다.
그래서 WeMos LOLIN 보드 설치 과정을 기억하여 다음과 같이 찾아 보았다. Arduino 폴더⤍ hardware⤍espressif⤍esp32⤍libraries⤍BluetoothSerial⤍src폴더 안에 포함되어 있음을 확인할 수 있었다. WeMos LOLIN 설치 과정이 복잡하여 스케치 탭의 라이브러리 포함하기에 나타나지 않았지만 사용에 아무런 지장은 없었다.
수정할 부분은 시리얼 모니터에만 출력할 것이 아니라 SerialBt.print 명령을 사용하여 블루투스 터미널에 온도를 출력해 보도록 하자. 습도 데이터까지 출력하는 부분은 각자가 코딩 능력 향상을 위해서 시도해 보기 바란다.
코드를 실행해 보았더니 성공적인 결과가 얻어졌다. 비록 아두이노 코딩 여러 가지에 꽤 복잡한 것들도 해봤지만 오히려 이 단순한 배선과 간단한 코딩에도 불구하고 짧은 순간이지만 즐겁게 느껴진다. 취미로 하는 코딩에서 정말 중요한 요소가 이런게 아닐까요?
여기까지 좋았는데 자세히 보니 아마 착각이었든 것 같다. 사용자 스마트폰의 메시지 전송 박스에서 문자를 LOLIN 으로 보내 시리얼 모니터에 출력하는데 15초에 1문자씩 출력하는 불상사가 일어났다. 원인 규명을 위해 아래와 같이 loop() 코드를 체크하였다.
15000msec 즉 온습도 측정 간격이 15초 시간 지연이 이루어지는데 문제는 시리얼 모니터와 블루투스 터미널과의 통신도 15초에 한번씩 이루어지는 상황이라 통신 효율이 너무 떨어진다.
온습도 데이터는 15초에 한번 처리하드라도 블루투스 터미날과 시리얼 모니터와의 통신은 즉각적으로 쌍방향으로 이루어져야 하므로 millis(0 명령을 사용하여 코드를 수정하기로 한다. 즉 15초 경과가 되지 않았으면 통신을 유지하고 15초가 경과 되는 시점이라면 온습도 측정을 실행하도록 다음과 같이 코드를 수정한다.
코드를 실행하여 온도 출력 여부 확인과 아울러 블루투스 문자 박스에 텍스트 메시지를 입력하여 송신 후 시리얼 모니터에서 확인해 보도록 하자.
첨부된 코드를 실행해 보자.
//WeMos_LOLIN_DHT11_SerialToSerialBT_01
#include "BluetoothSerial.h"
#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif
#include <DHT11.h> //라이브러리 부르기
int pin = 5; //DHT11 데이타 핀 아두이노 연결
long interval = 15000;
long previousMillis = 0;
DHT11 dht11(pin);
BluetoothSerial SerialBT;
void setup() {
Serial.begin(115200);
SerialBT.begin("ESP32test"); //Bluetooth device name
Serial.println("The device started, now you can pair it with bluetooth!");
}
void loop() {
if (Serial.available()) {
SerialBT.write(Serial.read());
}
if (SerialBT.available()) {
Serial.write(SerialBT.read());
}
unsigned long currentMillis = millis();
if (currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
//DHT11 온습도 측정 루틴
int err;
float temp, humi;
if((err=dht11.read(humi, temp))==0) { //온습도 reading
Serial.print("temperature:");
Serial.print(temp);
SerialBT.print("Temperature: ");
SerialBT.print(temp);
SerialBT.println(" C deg");
Serial.print(" humidity:");
Serial.print(humi);
Serial.println();
}
else { //에러 출력
Serial.println();
Serial.print("Error No :");
Serial.print(err);
Serial.println();
}
}//15초마다 측정
delay(10);
}//끝
'아두이노프로세싱 프로그래밍' 카테고리의 다른 글
Brokking의 오픈소스를 이용한 밸런싱 로봇 (0) | 2018.08.21 |
---|---|
블루투스로 직접 핸드폰에서 WeMos LOLIN 보드의 LED를 ON OFF 해보자! (0) | 2018.08.17 |
WeMos LOLIN 보드의 블루투스 기능 사용법 (0) | 2018.08.14 |
WeMos LOLIN 3색 LED 밝기 조절 (0) | 2018.08.14 |
WeMos LOLIN 보드에서 조도센서로 LED를 ON OFF해보자. (0) | 2018.08.06 |