HM-10 블루투스 센서를 이용하여 핸드폰과 시리얼 통신을 하고 그 값을 아두이노의 EEPROM에 저장하는 예제
EEPROM?
Electrically Erasable Programmable ROM
MCU 내부 비휘발성 메모리로 크기가 작은 편이다.
EEPROM은 byte 단위로 읽고 쓸 수 있으며 SRAM보다 느린 특징이 있어 아주 간단한 데이터를 저장하는 용도로 사용한다.
send me email if you have any questions.
HM-10
이 모듈은 아두이노가 다른 디바이스와 블루투스 통신을 할 수 있도록 한다.
연결도
아두이노 | HM-10 | |
3 | RX | |
2 | TX | |
GND | GND | |
5V | VCC |
블루투스 설정
명령어 | 기능 | 설명 |
AT | 테스트 명령어 | 페어링되지 않았다면 OK, 페어링되었다면 연결 해제 후 OK+LOST반환 |
AT+NAME NEWNAME | 모듈 이름 변경 | 모듈 이름 반환 |
AT+PIN NUMBER | PIN 변경 | PIN은 6자리여야 한다 |
안드로이드와 INLABbt(HM-10)에 연결하여 시리얼 통신을 준비한다.
사용앱 : BlueTooth Serial Controller
예제소스
/* 센서의 ID값을 블루투스로 송신받아 EEPROM에 저장하는 예제소스 */
#define NCLR 1
#include <SoftwareSerial.h> //시리얼통신 라이브러리 호출
#include <EEPROM.h> // EEPROM을 사용하기위한 라이브러리 호출
int blueTx=2; //Tx (보내는핀 설정)at
int blueRx=3; //Rx (받는핀 설정)
SoftwareSerial mySerial(blueTx, blueRx); //시리얼 통신을 위한 객체선언
void setup()
{
Serial.begin(9600); //시리얼모니터
mySerial.begin(9600); //블루투스 시리얼
EEPROM.write(1, 's');
}
void loop()
{
int i = 0;
char ch;
unsigned int data;
char str[20];
memset(str, '\0', 20);
if (mySerial.available()) {
while(1){
data = mySerial.read();
if(i >= 20){
Serial.println("buffer over-flow!!");
memset(str, 0, 20);
break;
}else{
if(!isdigit(data)){
//if(data == -1){ // buffer가 비어있다면
i = 0;
break;
}else{
Serial.write(data);
str[i] = char(data);
i++;
delay(100);
}
}
}
//Serial.print("str : ");
//Serial.println(str);
data = atoi(str); // char[]타입을 int타입으로 형변환
//Serial.print("data : ");
//Serial.println(data);
EEPROM.write(0, data); // EEPROM에 저장
Serial.println();
data = EEPROM.read(0);
Serial.print("EEPROM Address : 0\t Value : ");
Serial.println(data);
ch = EEPROM.read(1);
Serial.print("EEPROM Address : 1\t Value : ");
Serial.println(ch);
delay(200);
}
if (Serial.available()) {
mySerial.write(Serial.read()); //시리얼 모니터 내용을 블루추스 측에 WRITE
}
}
통신 결과
안드로이드에서 전송한 3,4,5의 값과 아두이노 코드상에서 센서를 뜻하는 s가 각각 EEPROM 0번1번 index에 저장된다.
새로운 값을 전송할 때 마다 EEPROM의 0번 index값은 새로 저장된다.