본문 바로가기

프로젝트

캡스톤 : 아두이노간 비콘구현 1:n 통신

반응형

 

BLE통신의 브로드캐스트모드에서 하나의 ble (hm10)이 마스터슬레이브로서 여러데이터들은 무작위로 수신받는다.

 

그형태는

 

 

 

at+disi? 명령어를 한결과다

이렇듯 원하는 uuid와 마지막 rssi 값을 추출할수잇다면 거리에따른 함수구현이가능하다..

 

#include <SoftwareSerial.h>

#define BT_RX 2
#define BT_TX 3
char str[1000];
char check_end[8]={'O','K','+','D','I','S','C','E'};
char check_start[7] = {'O','K','+','D','I','S','C'};
char uuid[78];
char c;
int tmp;
int value;
int cnt;
int p;//이전값 참조 인덱스
int end_p;
int start_p;
bool is_accurate_e;//끝나는거 검사시 정확했는가 안했는가 check
bool is_accurate_s;//시작하는거 검사시 정확하게 했는가 안했는가
bool current_stat;
int rssi1;//rssi값 계산할거임.
int rssi2;
SoftwareSerial HM10(BT_RX, BT_TX); // RX핀(7번)은 HM10의 TX에 연결
// TX핀(8번)은 HM10의 RX에 연결
void setup() {
  Serial.begin(9600);
  HM10.begin(9600);
  current_stat=false;//명령어를 보내지 않은상태
  cnt=0;
  //LED테스트
  pinMode(13,OUTPUT);
  pinMode(12,OUTPUT);
}

bool Is_ACC_E();
int How_start_value(int tmp1);

void loop() {
  /*
  if (Serial.available()) {
    int str = Serial.read();
    c = str;
    //Serial.print(str);
    HM10.write(str);
  }
  
  
  
   if(HM10.available()) {
    //Serial.write(HM10.read());
    c= HM10.read();
    list1[cnt] = c;
    cnt++;
    
  }
*/
    if(current_stat==false){
      HM10.print("AT+DISI?");
      Serial.println("AT+DISI?");
      current_stat=true;
    }
    
    if(HM10.available()) {
      //Serial.write(HM10.read());  
      c= HM10.read();
      str[cnt]=c;
      cnt++;
    }

    if(c=='E'){//끝나는 문장 예비

      //만약 문장이 끝낫으면 초기화시켜준호 AT+DISI? 명령어의 LOCK을 해제시킨다.
      if(Is_ACC_E()){//문자값을 끝까지다받음
        //값들 처리후 원하는 UUID검색후 RSSI값을 불러들여서 어떻게 할지 함수
         tmp=0; // OK+DISC를 찾고 그후 문자열을 uuid에 넣어서 처리할예정
         //Serial.print("cnt :");
         //Serial.println(cnt);
         while(true){
     
          value = How_start_value(tmp);

          if(value==-1)break;//더이상 써치못하는 단계 함수끝
          else{
            p=value;
            for(int i=0;i<=77;i++){
              uuid[i] = str[p];
              p++;
            }  
            if(uuid[74]=='-'){
 
              //옳바른 저장
              if(uuid[17]=='1'&&uuid[18]=='1'&&uuid[19]=='1'&&uuid[20]=='1'){//1111uuid를 가진 녀석이 발견되었을경우
                //rssi값을 구하자
                rssi1 = ((uuid[76]-48)*10) + (uuid[77]-48);
                rssi1=rssi1*(-1);
                //Serial.print("1111UUID: ");
                //Serial.print("RSSI1: ");
                //Serial.println(rssi1);
              }

              if(uuid[17]=='2'&&uuid[18]=='2'&&uuid[19]=='2'&&uuid[20]=='2'){//2222uuid를 가진 녀석이 발견되었을경우.
                //rssi값을 구하자
                rssi2 = ((uuid[76]-48)*10) + (uuid[77]-48);
                rssi2=rssi2*(-1);
                //Serial.print("2222UUID: ");
                //Serial.print("RSSI2: ");
                //Serial.println(rssi2);
              }

              if(rssi1>=-45){
                digitalWrite(12,HIGH);
              }else{
                digitalWrite(12,LOW);
              }

              if(rssi2>=-45){
                digitalWrite(13,HIGH);
              }else{
                digitalWrite(13,LOW);
              }
              
              tmp=value+77;
            }else{
              //잘못된저장
              tmp++;
            }
            
          }
      
         }
        
        cnt=0;
        current_stat=false;
        //Serial.println(str);
        //Serial.println("new_start");
      }
    }
}

}

 

소스는 이렇게 공개하겟다

 

거창할것도 없지만 하드코딩이다. 나중에 소스코드 수정이필요해보인다.

 

AT커맨드를 write를 이용해서 썻을경우 delay를 주는방법으로는 모듈에서 정확한 값을 수신하기 어려웠다.

 

따라서 나는 lock을 걸어서 문제를 해결할수 있었다.

 

두번째는 보시다시피 배열에담김값을 적재적소에 찾고 그값이 uuid 1111 인지 2222인지 판단해서 거리값을 반환한다

 

거리가 가까운 모듈의 불빛을 키는형태로 쉽게 구현 할수있었다.

 

https://www.youtube.com/watch?v=tFBr9NIrLyE

 

이제남은과제는 어떻게하면 비콘의 반응속도를 올릴지가 문제이다. 그리고 신호등에 비콘을 설치하여 빨간불일때는 uuid값의 일부를 수정하여 현재 신호등상태값을 불러오면가능하다.

 

또한 RSSI 값은 ASCII 값으로 들오오기때문에 int형으로 변형이 필요하다

rssi1 = ((uuid[76]-48)*10) + (uuid[77]-48);

위와같은 수식을 이용하면 쉽게 int형으로 바꿀수있다. 76 77 번째 배열이 rssi값을 소유하고 있기때문 ^_^

uuid값은 총 80개의 배열형태를 보유하고있다.

 

반응형