코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
2016-08-18 17:07:34
안녕하세요 처음으로 올리는 프로젝트를 지난 학기에 한 학교 프로젝트로 올리게 되었습니다.
당시 이슈였던 미세먼지 양을 측정하여 권장 수분 섭취량을 설정하는 안드로이드 어플리케이션과
블루투스로 통신하여 음수량을 전송, 권장 수분 섭취량을 섭취했는지 확인할 수 있도록 하는 아두이노 스마트컵을 제작했습니다.
안드로이드 어플리케이션에서 미세먼지 정보와 신체 지수 입력을 통해서 권장 수분 섭취량을 설정하고,
아두이노는 이와 별개로 200ml와 300ml를 마실 때, 해당 양을 블루투스를 통해 어플리케이션으로 전송합니다.
어플리케이션은 이 수분 섭취 정보를 실시간으로 권장 수분 섭취량과 비교하여 해당 정보를 사용자에게 보여주게 됩니다.
제 프로젝트에서 수량을 측정하기 위해 사용한 비접촉 수위 센서 사용에 대한 예제입니다.
아두이노 블루투스 통신에 대한 예제입니다.
NO | 부품명 | 수량 | 상세 설명 |
1 | 아두이노 보드 | 1 | Arduino UNO |
2 | 비접촉 수위 센서 | 2 | DFRobot |
3 | 블루투스 모듈 | 1 | HC-06 |
4 | 9v 배터리와 어댑터 | 각 1 |
부품명 | 아두이노 | 비접촉 수위 센서 | 블루투스 모듈 | 9v 배터리 어댑터 |
사진 |
LED와 저항은 생략. (2개씩)
비접촉 수위센서를 두개만 사용하였기에 측정 가능 양이 200, 300ml로 제한적입니다.
센서를 다른 센서로 대체하여 사용하면 보다 세부적인 측정이 가능합니다.
#include <SoftwareSerial.h>
int BT_TX = 2;
int BT_RX = 3;
SoftwareSerial BTSerial(BT_TX, BT_RX); //블루투스 모듈 핀 번호(TX, RX) 선언
int lowSensor = 7; //수위센서의 핀번호 선언
int highSensor = 6;
int whiteLED = 12; //LED 핀번호 선언
int redLED = 13;
int flag_low = 0; //lowSensor의 flag
int flag_high = 0; //highSensor의 flag
int waterIntake = 0; //마신 물의 양을 측정하는 변수
void setup() { //각 핀마다 모드 설정
Serial.begin(9600);
BTSerial.begin(9600);
pinMode(lowSensor, INPUT);
pinMode(highSensor, INPUT);
pinMode(whiteLED, OUTPUT);
pinMode(redLED, OUTPUT);
}
void loop() {
int lowState = digitalRead(lowSensor); //수위 센서로 부터 디지털값을 읽어 들인다.
int highState = digitalRead(highSensor);
if(lowState == 0 && highState == 0){ //수위에 맞춰 LED 점등, 소등 및 flag control
flag_high = 1;
digitalWrite(whiteLED, LOW);
digitalWrite(redLED, HIGH);
}else if(lowState == 0 && highState == 1){
flag_low = 1;
digitalWrite(whiteLED, HIGH);
digitalWrite(redLED, LOW);
}else if(lowState == 1 && highState == 1){
digitalWrite(whiteLED, LOW);
digitalWrite(redLED, LOW);
}
if(flag_low == 1 && lowState == 1){ //수위 변화에 맞춰 물 마신 양 체크 (수위가 lowSensor를 지날때)
waterIntake = waterIntake + 2;
if(flag_high == 1){
waterIntake = waterIntake + 1;
}
if(waterIntake == 3){ //센서 값에 따라 블루투스로 마신 물의 양 전송
BTSerial.write("3");
}else if(waterIntake == 2){
BTSerial.write("2");
}
waterIntake = 0; //변수 및 flag 다시 초기화
flag_low = 0;
flag_high = 0;
}
}
아래 동영상에서 확인하실 수 있겠지만, 기본적인 원리는 다음과 같습니다.
물이 200ml까지 차면 low flag를, 300ml까지 차면 high flag를 1로 설정하고, 해당하는 LED를 키도록 합니다.
이렇게 둘 중 하나의 flag가 1인 상태에서 수위가 200ml 아래로 내려가면 flag 값에 따라 해당하는 물의 양(200, 300ml)를 블루투스 통신을 통해 보냅니다.
물의 양은 숫자를 2 또는 3으로 보내지만, 안드로이드 어플리케이션에서 이를 인식하고 200 또는 300ml를 추가하도록 합니다.
만약 위에서 말씀드린 대로 센서를 대체하여 사용하면 이에 따라 위 알고리즘이 수정되어야 합니다.
안드로이드 어플리케이션 소스는 팀원과 함께 만들었기 때문에 공개할 수 없습니다.
제작 과정은 사진을 찍어놓았던게 없어서 생략하겠습니다.
최초에는 아두이노 pro micro 보드를 사용하여 작업하고 있었으나, 도중에 보드를 망가트려서(;;;) UNO 보드로 작업하는 바람에
첫 계획보다 크기가 커져버리고, 3D 프린팅을 따로 하지 않아서 병 옆면에 회로가 지저분하게 정리 안 된 상태로 있지만, 계획했던 기능은 모두 동작합니다.
물병 아래에 부착한 원형 박스 안에 아두이노 보드와 블루투스 모듈, 그리고 배터리가 들어있습니다. 배터리는 원형 박스의 절반을 열 수 있도록 해서 교체할 수 있도록 했습니다.
어플리케이션은 최종 발표 이전 버전이라 다소 매끄럽지 않지만, 영상에서 컵의 동작 방식은 알아보실 수 있습니다.
보시다시피 200ml위치에서 물이 있음을 인식하면 흰색 LED가, 300ml위치에서 물이 있는 것을 인식하면 붉은색 LED가 켜집니다.
각각의 상태에서 200ml 위치에 물이 없다고 인식되면 즉시 해당 상태에 따라 200ml 또는 300ml를 블루투스 통신을 통해 전송합니다.
이러한 알고리즘 때문에, 물을 마시고 내려놓았을 때가 아닌, 물을 마시면서 기울어지는 도중에 측정이 됨을 알 수 있습니다.
아두이노를 처음 만져본 프로젝트를 이 곳에 올리게 되었는데, 디자인이나 마감 등에서 부족한 점만 드러낸 것 같아 부끄럽습니다.
하지만 기능에 있어서는 계획한 대로 잘 동작하고, 코드 자체도 이해하기 어렵지 않아 저같이 처음 아두이노를 접하시는 분들에게 조금이나마 도움이 될 것이라 생각합니다.
아두이노 소스를 제외한 안드로이드 어플리케이션 소스는 저 혼자 개발한 것이 아니기 때문에 공개할 수 없습니다. 이 점 죄송합니다.
하지만 인터넷에 안드로이드 블루투스 통신과 관련된 많은 정보글들이 있으니 참고하셔서 자기 것으로 만들면 더욱 완성도 높은 프로젝트를 이끌어 낼 수 있지 않을까 생각합니다.
여기까지, 다른 메이커 분들에 비하면 보잘 것 없는 프로젝트 결과물을 읽어주셔서 감사합니다.
Himmel