Arduino HM-10 블루투스 센서

 

HM-10 블루투스 센서를 이용하여 핸드폰과 시리얼 통신을 하고 그 값을 아두이노의 EEPROM에 저장하는 예제

EEPROM?
Electrically Erasable Programmable ROM
MCU 내부 비휘발성 메모리로 크기가 작은 편이다.
EEPROM은 byte 단위로 읽고 쓸 수 있으며 SRAM보다 느린 특징이 있어 아주 간단한 데이터를 저장하는 용도로 사용한다.

send me email if you have any questions.


HM-10

그림1
이 모듈은 아두이노가 다른 디바이스와 블루투스 통신을 할 수 있도록 한다.

연결도

아두이노   HM-10
3   RX
2   TX
GND   GND
5V   VCC

블루투스 설정

명령어 기능 설명
AT 테스트 명령어 페어링되지 않았다면 OK, 페어링되었다면 연결 해제 후 OK+LOST반환
AT+NAME NEWNAME 모듈 이름 변경 모듈 이름 반환
AT+PIN NUMBER PIN 변경 PIN은 6자리여야 한다

그림2
안드로이드와 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
안드로이드에서 전송한 3,4,5의 값과 아두이노 코드상에서 센서를 뜻하는 s가 각각 EEPROM 0번1번 index에 저장된다.
새로운 값을 전송할 때 마다 EEPROM의 0번 index값은 새로 저장된다.