아두이노 코딩-118: 블루투스로 직접 핸드폰에서 WeMos LOLIN 보드의 LED를 ON OFF 해보자!

in #kr6 years ago (edited)

noname01.png

LOLIN 보드에 설치된 온습도 측정이 가능한 센서 DHT11의 측정 결과를 핸드폰에 송신하여 Kai Morich의 Serial Bluetooth Terminal을 사용해 터미날 화면에 출력하였다. 이번에는 반대로 터미널 문자 박스에 “ON” 또는 “OFF” 문자를 입력 후 블루투스로 LOLIN 보드에 송신하여 LOLIN 보드에 설치된 LED를 ON OFF 해 보기로 하자.

DHT11 온습도 센서와 조도센서가 함께 설치된 지난번 배선도를 그대로 이용하기로 한다. 배선도를 보면 27번 디지털 핀에 청색 LED 가 배선되어 있다. 따라서 온습도 측정을 위한 코드는 그대로 두고 LED ON OFF를 위한 루틴을 추가하여 수정하기로 한다.

noname02.png

수정해야 할 코드 내용을 살펴 보기로 하자.
스마트폰 블루투스 터미널 문자박스에서 LED를 ON 시키기 위해 ON 이라는 문자를 송신하면 27번 핀의 LED 가 ON 되어야 한다.

이 내용을 아두이노 옮기면 다음과 같이 코딩 된다.

int ledPin = 27;
⦁⦁⦁
void setup() {
⦁⦁⦁
pinMode(ledPin, OUTPUT); //27번 핀 출력 모드 설정
digitalWrite(ledPin, LOW); //27번 핀 LED OFF 상태로 처리
⦁⦁⦁
}

void loop() {
⦁⦁⦁
if (SerialBT.available()) {
Serial.write(SerialBT.read());
}
⦁⦁⦁//스마트폰 브루투스 문자박스로부터 전송 내용 처리
}

loop()에서 블루투스로 전송되어 온 정보는 문자 입력 버퍼인 SerialBT.read() 에 한 문자씩 저장된다. 즉 아두이노 WeMos LOLIN 보드의 CPU에서 코드가 실행되고 있으면 한편으로는 입력 버퍼에 문자 정보가 수신되어 대기하게 되는데 loop() 내의 코드는 빠른 주기로 반복되므로 한번씩 반복될 때마다 입력 버퍼 문자 수신 내용이 “(O)N” 또는 “(o)n” 인지 아니면 “(OF)F” 또는 “(of)f” 인지 () 안의 글자는 배제하고 N 또는 n 인지 F 또는 f 인지 체크하도록 한다. 다음과 같이 수정된 코드 내용을 넣도록 한다.

char c = SerialBT.read();
Serial.write(c);

if ( c == 'N' || c == 'n')  {
  digitalWrite(ledPin, HIGH);
}
if ( c == 'F' || c == 'f')  {
  digitalWrite(ledPin, LOW);
}

코드를 컴파일 업로딩 후 스마트폰에서 블루투스 터미날의 connection 버튼을 누르자.

noname03.png

이와같이 블루투스를 이용 한글자 명령을 전송하여 LED ON OFF 가 가능하다. 하지만 ON 이라든지 OFF 라든지 명령어가 한 글자 이상일 경우에는 글자들을 합산하여 문자열을 만들어서 처리해야 한다. 와이파이 HTTP 통신에서 자주 사용하는 indexOf() 명령을 사용하는 기법이 있으나 블루투스 통신은 와이파이와 뭔가 다른 통신특성으로 인해 적절한 블루투스 전용 명령어가 있는지 체크 중이다.

이 하나의 글자 명령어를 전송하는 기법은 RC카 무선 조종을 위해 스마트폰 화면에 5개의 터치 키보드 중 하나를 누르면 전진(‘F’). 후진(‘B’), 좌회전(‘L’), 우회전(‘R’), 멈춤(‘S’)에 해당하는 명령어가 아두이노에 전송되어 RC카 모터 바퀴를 제어하는데 사용된다.

그밖에 지난번에 millis() 명령을 사용하여 코딩했던 DHT11 온습도를 출력하는 부분은 그대로 두도록 한다. 즉 한쪽에서는 온습도를 측정해서 스마트폰으로 보내면서 한편으로는 스마트폰으로부터 LED를 ON OFF 하기 위한 명령을 받아 실행하게 된다.

//WeMos_LOLIN_DHT11_millis_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 데이타 핀 아두이노 연결
int ledPin = 27;
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!");
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
}

void loop() {
if (Serial.available()) {
SerialBT.write(Serial.read());
}
if (SerialBT.available()) {
// Serial.write(SerialBT.read());
char c = SerialBT.read();
Serial.write(c);

if ( c == 'N' || c == 'n')  {
  digitalWrite(ledPin, HIGH);
}
if ( c == 'F' || c == 'f')  {
  digitalWrite(ledPin, LOW);
}

}

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);

}//끝

Sort:  

hey @codingart it was amazing.
I am new in here please help me and upvote me.

간만에 콜라보래이션

[골든티켓x짱짱맨x weee] 18-2차 현타토끼 이모티콘 증정 !
https://steemit.com/goldenticket/@goldenticket/x-x-weee-18-2

참여하세요!