이번에는 아두이노끼리 블루투스 통신 하는 방법에 대해 알아보겠습니다.

블루투스 통신을 위해 다음 모듈이 필요합니다.

HC06 모듈입니다.


제원은 다음과 같습니다.

○ 범위 : ~10M 

○ 동작 전원 : 3.6 ~ 6V

○ 사용 전력 : ~30mA

○ 크기 : 36 x 15 mm

○ 기본 통신 속도(Baud rate) : 9600

○ 초기 페어링 비밀번호 : 1234


핀은 다음과 같이 배치합니다.

● VCC : 5V (전원)

● GND : GND (그라운드)

● RX : Digital 2 pin (데이터 수신)

● TX : Digital 3 pin (데이터 송신)


아두이노 스케치에서 시리얼 모니터를 열어서 다음과 같이 명령어를 입력합니다.

☆ AT : 블루투스 통신이 유효한지 확인합니다. (성공시 OK출력)

☆ AT+VERSION : 블루투스 모듈의 버전을 확인합니다.

☆ AT+ROLE=M : 통신 모드를 Master로 변경합니다.

☆ AT+ROLE=S : 통신 모드를 Slave로 변경합니다

☆ AT+BAUD4 : 기본 Baud rate를 변경합니다. (1~8까지)

    1 : 1200 / 2 : 2400 / 3 : 4800 / 4 : 9600 / 5 : 19200 / 6 : 38400 / 7 : 57600 / 8 : 115200

☆ AT+NAMEdevicename : 블루투스 명칭을 변경합니다. (성공시 OKname 출력)

☆ AT+PIN**** : Pin Code(비밀번호)를 변경합니다.(성공시 Oksetpin 출력)

☆ AT+INQ : 주변 블루투스 모듈을 검색합니다.

☆ AT+CLRBAND : 블루투스 연결을 해제합니다.


* 자세한건 여기를 확인하세요.


위 설정을 모두 끝냈다면 다음 코드를 작성합니다.

1. 컴퓨터가 2대 이상 있는 경우 - 각각의 컴퓨터에 아두이노를 연결하고 다음과 같이 작성합니다.

* 스케치 - 라이브러리 포함하기 - SoftwareSerial 을 선택합니다.

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3); //블루투스의 Tx, Rx핀을 2번 3번핀으로 설정


void setup() {

  // Baud rate 9600으로 설정

  Serial.begin(9600);

  mySerial.begin(9600);

}


void loop() {

  if (mySerial.available()) { //블루투스에서 넘어온 데이터가 있다면

    Serial.write(mySerial.read()); //시리얼모니터에 데이터를 출력

  }

  if (Serial.available()) {    //시리얼모니터에 입력된 데이터가 있다면

    mySerial.write(Serial.read());  //블루투스를 통해 입력된 데이터 전달

  }

}


2. 컴퓨터가 1대 있는 경우 - Master 및 Slave 모듈을 번갈아가며 작성합니다.

· Master 코드

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3); //블루투스의 Tx, Rx핀을 2번 3번핀으로 설정


void setup() {

  Serial.begin(9600);

  mySerial.begin(9600); // baud rate 9600으로 설정

}


void loop() { 

  if (mySerial.available()) { // 넘어온 데이터가 존재하면

    Serial.write(mySerial.read()); // 시리얼에 출력

  }

}


· Slave 코드

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3); //블루투스의 Tx, Rx핀을 2번 3번핀으로 설정

int a= 0;


void setup() {

  Serial.begin(9600);

  mySerial.begin(9600); // baud rate 9600으로 설정

}


void loop() {

  mySerial.println(a); // 블루투스 시리얼에 입력

  a++;

  delay(500);


2.의 실행 화면입니다.





정보가 유익하셨다면 아래 공감버튼 눌러주시면 감사하겠습니다.

질문사항은 댓글로 달아주시면 성의껏 답변해드리겠습니다.




1. 개요

아두이노와 각종 센서를 통해 책상에 오래 앉아 있는 직장인 또는 학생의 편의와 건강을 위한 스마트 책상 만들기 프로젝트입니다.


2. 회로도



회로도가 조금 복잡합니다... USB 모듈에는 USB 선풍기를 연결했습니다.


3. 사용 부품

아두이노 우노 R3

I2C LCD 모듈

적외선 근접센서

USB 인터페이스 변환 모듈

USB 선풍기

3색 LED * 2

온습도 센서

조도 센서

MF, FF 점퍼 선 * 다수


4. 소스코드

#include <LiquidCrystal_I2C.h>

#include <dht11.h> 

#define DHT11PIN 10


LiquidCrystal_I2C lcd(0x27,20,4); // LCD 모듈 구조체 선언

dht11 DHT11; // 온, 습도 모듈 구조체 선언

unsigned long readTime=0; // 착석 시 타이머 작동을 위한 변수

unsigned long readCheckTime=0; // 미착석 여부를 위한 변수

long previousMillis = 0; long interval = 1000; 


void setup() {

    lcd.init(); // LCD 초기화

    lcd.backlight(); // LCD 백라이트 출력

    // 출력 핀모드 설정

    pinMode(5, OUTPUT); pinMode(7, INPUT); // 13 : USB, 7 : 근접센서

    pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); 

    // LED = 2: RED, 3: GREEN, 4 : BLUE

    pinMode(13, OUTPUT); pinMode(6, OUTPUT); pinMode(9, OUTPUT); // 백색 LED

    Serial.begin(9600); // 시리얼 통신 시작(BAUD = 9600)

}

void loop() {

    int chk = DHT11.read(DHT11PIN); // DHT11 라이브러리를 통해 온,습도 데이터를 받아옴

    unsigned long currentMillis = millis(); // 1/1000초 단위로 시간 입력(별개의 루프 사용위함)

    int brightness = analogRead(A0); // 조도 센서 데이터를 아날로그 값으로 입력받음

    int checkP = digitalRead(7); // 근접 선서 데이터를 디지털 값으로 입력받음(0 or 1) 


    // 착석했지만 근접 센서에 체크가 되지 않는경우(잠깐 자리를 고쳐앉는 경우)에 계속 착석 중으로 체크하기 위해

    if(checkP) 

        readCheckTime++; // 근접 센서에 근접한 사물이 없는 경우

    else

        readCheckTime = 0; // 근접 센서에 근접한 사물이 있는 경우


    if(currentMillis - previousMillis > interval) { // interval(1000ms, 1초) 단위로 실행되는 루프(메인 루프와 별개로 작동)

        previousMillis = currentMillis; // 이전시간을 현재시간으로 설정해줌으로써 다음 interval 단위에 체크하기 위함

        if(readCheckTime<50) 

            readTime++; 

        else 

            readTime = 0; // 착석 시 1초 단위로 타이머 변수에 저장

        lcd.clear(); // LCD 화면을 지움(초기화)

    }

    lcd.setCursor(0,0); // 0,0(첫째줄 왼쪽 첫번째) 자리에 출력하기위해 커서를 set

    lcd.print("BG:"); lcd.print(brightness/10); lcd.print("%, "); // 밝기 출력

    lcd.print("TMP:"); lcd.print(DHT11.temperature); lcd.print("'C"); // 온도 출력

    lcd.setCursor(0,1); // 0,1(둘째줄 왼쪽 첫번째) 자리에 출력하기위해 커서를 set

    lcd.print("ST:"); // 착석 여부 확인

    if(readCheckTime<50) 

        lcd.print("O"); 

    else 

        lcd.print("X"); 

    lcd.print(" LED:"); // 착석 여부와 주변 밝기에 따라 LED 작동 여부 확인

    if(readCheckTime<50 && brightness/10 < 40) { // RGB모두 켬(백색)

        lcd.print("O"); 

        digitalWrite(13, LOW); digitalWrite(6, LOW); digitalWrite(9, LOW); 

    }

    else { // 애노드 타입이므로 5,6,9번 핀을 GND로 연결(LOW=HIGH, HIGH=LOW)

        lcd.print("X"); 

        digitalWrite(13, HIGH); digitalWrite(6, HIGH); digitalWrite(9, HIGH); 

    }

    lcd.print(" FAN:"); // FAN 작동 여부

    if(readCheckTime<50 && DHT11.temperature >= 25) { 

        lcd.print("O"); analogWrite(5, 255); 

    } 

    else { 

        lcd.print("X"); digitalWrite(5, LOW); 

    }

    if(readTime<1800) { 

        digitalWrite(3, LOW); digitalWrite(2, HIGH); digitalWrite(4, HIGH); 

    } // 30분이하 : GREEN

    else if(readTime<3600) { 

        digitalWrite(3, HIGH); digitalWrite(2, HIGH); digitalWrite(4, LOW); 

    } // 30분~1시간 : BLUE

    else { 

        digitalWrite(3, HIGH); digitalWrite(2, LOW); digitalWrite(4, HIGH); 

    } // 1시간이상 : RED

}


소스코드 주석에 설명이 있기 때문에 작동 순서만 설명드리겠습니다.

1. 책상 또는 의자 부근에 설치한 근접센서에 사람이 확인되면 작동 시작

2. 온도와 조도를 측정하여 선풍기 및 조명(LED) 작동 여부 확인

3. 근접센서에 일정시간 이상 감지 되지않으면 사람이 없다고 간주 각종 센서 전원 OFF

4. 사람이 착석한 이후 일정시간 마다 초록, 파랑, 빨강 LED 점등


질문 사항은 댓글로 남겨주세요!




ESP8266 + OV2640

ESP8266 과 OV2640을 이용하여 영상처리와 패턴인식 프로그래밍을 해보려고 합니다.
위 사진은 ArduCam ESP8266 과 OV2640 결합 사진입니다.
배선은 따로 필요없으며 위 사진과 같이 결합 해주시면 됩니다.
하지만 코드를 업로드 하기위해서 Arduino IDE에 새로운 보드를 추가해야합니다.

* 아두이노 보드 추가 방법
1. 아두이노 스케쳐를 실행하고 파일 - 환경설정에 들어갑니다.
2. 추가적인 보드매니저 URLs 맨 오른쪽 버튼을 누르고 다음과 같이 입력합니다.
3. http://www.arducam.com/downloads/ESP8266_UNO/package_ArduCAM_index.json
4. 입력 후 확인버튼을 누릅니다.
5. 툴 - 보드 - 보드매니저로 들어갑니다.
6. ESP8266을 검색하고 보드를 설치합니다.

* 예제코드
1. 파일 - 예제 - ArduCAM - ESP8266 - ArduCAM_ESP8266_OV2640_Capture를 실행합니다.
2. memorysaver.h 를 찾아 메모장 또는 VS로 연 다음 #define OV2640_CAM 주석을 제외합니다.
3. 다시 아두이노 스케쳐로 돌아와서 다음 부분을 수정합니다.
const char* ssid = "SSID"; // SSID 대신 와이파이 이름을 적습니다.
const char* password = "PASSWORD"; // PASSWORD 대신 와이파이 비밀번호를 적습니다.
4. 업로드 버튼을 누르고 시리얼 모니터를 실행합니다.
5. 글자가 깨져보이면 보드레이트를 115200으로 맞춰줍니다.
다음과 같이 출력이 나온다면 성공입니다.
실패시 오류 화면을 캡쳐 또는 복사해서 댓글로 달아주세요.
- Connecting to "WIFI이름" - 192.168. ~~ : url 주소입니다.

* 출력화면
1. 인터넷 창을 켜서 주소 입력란에 위의 IP주소를 입력하고 /capture를 입력하여 접속해봅시다.
예) 192.168.0.0/capture
2. IP주소/stream 입력 시 화면에 연속된 영상이 출력됩니다.
다음과 같이 캡쳐된 화면이 인터넷창에 출력됩니다. 만약 초점이 안맞을 시 OV2640 카메라 앞부분을 돌려서 초점을 맞춰봅시다.

다음은 C# 프로그램으로 아두이노로 캡쳐한 사진을 이용하여 패턴인식을 해보겠습니다.
질문사항은 댓글로 남겨주세요!



'Arduino' 카테고리의 다른 글

아두이노 블루투스(HC06) 연동  (0) 2018.09.04
[Arduino] 아두이노 DIY 스마트 책상 만들기!  (7) 2018.08.21

to Top