1. 아두이노-안드로이드 BT 채팅
블루투스를 이용한 아두이노와 안드로이드 간 채팅 시스템입니다. 아두이노-PC 간 USB 시리얼 연결로 사용자 입력을 받고 BT를 이용해서 안드로이드 폰으로 쏴줍니다. 안드로이드 폰에서도 사용자가 입력한 데이터를 BT를 이용해서 아두이노로 전달하고 전달된 메시지는 LCD 모듈에 표시됩니다. 소스, 구현이 간단하고 여러가지로 응용하기 좋습니다. 카페 공구를 이용하면 부품들도 저렴하게 구할 수 있습니다.
이미 거의 유사한 프로젝트가 GitHub 에 있으니 소스 참고하세요.
https://github.com/pablobuenaposada/arduino-HC-06/tree/master/Android
2. 구현 순서
2-1. 아두이노
아두이노에서는 먼저 블루투스 모듈과 LCD 모듈을 연결합니다. 아래 별도로 작성해 둔 글을 참고해서 연결하시면 됩니다. 배선만 참고해서 연결하시고 소스코드는 이 글에 있는 소스를 사용하세요.
- LCD character 모듈 연결방법 : https://www.hardcopyworld.com/?p=181
연결이 끝나면 아래 소스를 아두이노에 업로드 합니다.
——————————————————————–
//Compatible with the Arduino IDE 1.0 //Library version:1.1 #include <Wire.h> #include <LiquidCrystal_I2C.h> #include <SoftwareSerial.h> LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x20 for a 16 chars and 2 line display SoftwareSerial BTSerial(2, 3); //Connect HC-06 TX,RX void setup() { Serial.begin(9600); Serial.println("Hello!"); BTSerial.begin(9600); // set the data rate for the BT port lcd.init(); // initialize the lcd lcd.backlight(); lcd.print("Hello, world!"); // Print initial message. } /* time */ unsigned long prevReceivedTime = 0; unsigned long curReceivedTime = 0; int currentLine = 0; // Display character at 0 or 1 line void loop() { // BT --> Data --> Arduino --> LCD if (BTSerial.available()) { char c = BTSerial.read(); curReceivedTime = millis(); if(curReceivedTime - prevReceivedTime > 1000) { // (1) currentLine++; if(currentLine > 1) { currentLine = 0; lcd.clear(); } lcd.setCursor(0, currentLine); } Serial.print(c); lcd.write(c); prevReceivedTime = curReceivedTime; } // PC --> Data --> Arduino --> Data --> BT if (Serial.available()) { BTSerial.write(Serial.read()); // (2) } }
——————————————————————–
PC에서 전달된 데이터를 안드로이드로 보내는 코드는 간단합니다. (2) 참고. Serial 연결에서 읽은 데이터를 BT로 넘겨주면 됩니다. 아두이노와 BT는 Software Serial 로 연결되기 때문에 SoftwareSerial.h 파일이 include 되어 있습니다.
안드로이드에서 전달해준 데이터를 LCD에 표시할 때는 약간의 처리를 해줘야 합니다. LCD가 16글자 2줄을 표시하기 때문에 적당히 줄넘김을 해줘야 합니다. Line break 를 식별할 수 있도록 안드로이드에서 처리해주지 않았기 때문에, 1초 이상 입력이 없으면 자동으로 줄넘김을 하도록 코딩 했습니다. (1) 참고. 만약 안드로이드에서 16자 이상을 한번에 보내면 16자 이후는 표시되지 않습니다. 구현하시는 분은 이 부분도 구현해보세요.
.
2-2. 안드로이드
안드로이드 앱 구현은 GitHub 프로젝트에 있는 소스를 빌드하시면 됩니다. 귀찮으면 아래에서 다운로드 하세요.
GitHub 소스 : https://github.com/pablobuenaposada/arduino-HC-06/tree/master/Android
[wpdm_file id=13]
안드로이드와 아두이노 BT 연결은 아래 순서대로 하세요.
- 먼저 아두이노를 켜서 HC-06 슬레이브 모듈이 페어링 대기상태에 들어가도록 합니다. (LED 깜빡깜빡)
- 위 GitHub 에서 받은 소스를 빌드하거나 아래 링크에서 APK 파일을 받아서 폰에 설치합니다.
- 폰의 설정 > 블루투스 에서 off 상태이면 BT on 으로 바꿉니다.
- BluetoothChat 앱을 실행 – 메뉴키 – Connect a device 선택
- Device List 에 HC-06 슬레이브 모듈이 보이는지 확인. 안보이면 Scan 버튼을 눌러서 찾아보고 그래도 안되면 1부터 다시합니다.
- HC-06 모듈이 보이면 선택 – 연결이 정상적으로 완료되면 챗팅 가능
- 폰으로 글 적으면 PC의 Serial Monitor에서 보이는지 확인합니다. 반대도 확인.
여기까지 완료되면 안드로이드와 아두이노 사이에 채팅이 가능합니다.
참고자료:
- 아두이노 – 안드로이드 블루투스 채팅 (Bluetooth 2.x)
- 아두이노 – 안드로이드 블루투스 채팅 기능개선 버전 (Bluetooth 2.x)
- BLE(Bluetooth Low Energy) 이해하기 (Bluetooth 4.0)
- 아두이노 – 안드로이드 BLE 채팅
안녕하세요! 저도 저 프로젝트를 하려고 하는데 문제가 생겨서요. 블루투스 쳇이라는 프로그램에서 10byte밖에 못읽는데 그런 문제는 없으셨나요?
제가 했을 땐 별 문제없이 계속 잘 읽었습니다. 다른 프로젝트에서 블루투스 모듈에 문제가 있는 경우(HC-05 모듈이었습니다) 데이터가 뒷 부분부터 문제가 생기기도 했습니다. 모듈의 불량일 수도 있을 것 같습니다.
안녕하세요 저도 프로젝트중인데 블루투스 연결은 되나 lcd로 출력이 안돼서 다시 배선연결을해봐도 배선문제인지 코드 문제인지 모르겟네요 ㅠ
위 소스를 바로 적용하지말고 일단 기초 예제부터 실행해서 블루투스와 휴대폰 연동이 잘 되는지부터 확인해보세요.
http://www.hardcopyworld.com/ngine/aduino/index.php/archives/177
안녕하세요 저도 프로젝트중인데 블루투스 연결은 되나 lcd로 출력이 안돼고, 시리얼로도 안나와서… 다시 배선연결을해봐도 배선문제인지 코드 문제인지 모르겟네요 ㅠ
문제 확인을 위해서 보다 간단한 예제로 동작하는지 테스트가 필요할 것 같네요. 아래 예제로 먼저 테스트 해보세요.
http://www.hardcopyworld.com/gnuboard5/bbs/board.php?bo_table=tech_comm&wr_id=31
아두이노말고 저 소스를 pc에서 앱으로 데이터 전송하는 방법은 어떻게 하는 지 자세히 알려주실수 있나요.
PC는 별도로 BT 연결앱을 만들어야 합니다. 아직 제가 작성한 코드는 없습니다. 구글에서 한번 뒤져보셔야 할듯
안녕하세요, 잘봤습니다^^
저 github에 코드가 android bluetoothChat 맞죠? sample 코드랑 같은 거 같은데,,
그 코드로 핸드폰에 앱 설치하고 실행하면 아두이노 블루투스 scan까지는 되는데 연결이 안되네요,,
뭐가 문제일까요? ㅠㅠ
백그라운드로 동작중인, BT 사용하는 앱 모두 종료하고 연결해보세요.
블루투스 관련해서 찾다가 소스코드에 질문이 있어서 댓글 남깁니다.
25째 줄부터 prevReceivedTime 과 curReceivedTime 이 어떤역할을 하는지 모르겠습니다.
curReceivedTime 이 millis 명령어로 시간을 재는건 알겠는데
curReceivedTime – prevReceivedTime > 1000 이라는게 1초를 기다린다는건가요?
굳이 1초를 기다릴 이유가 혹시 있는지 궁금합니다.
그리고 prevReceivedTime = curReceivedTime 이 줄도 어떤 역할인지 궁금합니다.
1초 이상 입력이 없을 때 줄넘김을 하기 위해서 마지막 입력 후 얼마나 시간이 지났는지 체크하는 용도입니다. prevReceivedTime이 마지막으로 데이터를 받은 시간입니다. 이걸 계속 현재 시간 curReceivedTime 과 비교해서 줄넘김을 할지 말지 판단하는 것입니다.
윽 수정이 안되네요 ㅜㅜ q&a 게시판에 질문하겠습니다….
안녕하세요글보고궁금한게있어서남깁니다
혹시 저프로젝트에서는스마트폰을이용해서아두이노로문자를전송하는데 역으로해서아두이노의버튼을사용해서 정해논문자들이스마트폰에나태내는방법은없나요????
물론 가능하고, 그리 어렵지도 않습니다. 아래처럼 보내주시면 됩니다.
BTSerial.println(“원하는 문자열”)
안녕하세요. 다름이아니라 제가 프로젝트를 진행중인데 아두이노와 안드로이드를 블루투스가 아니라 wifi로 연동하여 채팅을 하려고 합니다. 혹시 방법이 있을까요?
블루투스 대신 wifi 모듈을 사용하시면 됩니다. ESP8266, WiFi232, CC3000 Wifi shield 등의 모듈을 사용하실 수 있습니다. 각각에 대한 내용은 구글 검색하시면 자료를 많이 찾으실 수 있습니다.
정말 감사합니다^^ 즐거운 하루되세요
이거 회로과정은 공개 안되나요?
블루투스 연결 방법 : http://www.hardcopyworld.com/ngine/aduino/index.php/archives/177
LCD character 모듈 연결방법 : http://www.hardcopyworld.com/ngine/aduino/index.php/archives/181
혹시 한글도 보내지나요?