?>

Hard Copy World

HCW

Q&A

Home > Forum >

Q&A

블루투스 질문있습니다.

페이지 정보

작성자 졸작 이름으로 검색 작성일15-06-07 16:50 조회2,558회 댓글1건

본문

마스터는 자두이노로 hc05가 내장된 보드이고 슬래이브는 우노 r3로 hc06를 달고 있습니다.

이렇게 통신 하나가 완성 시켰습니다. 그래서 현재 블루투스 통신으로 ppm값이 3000이상이면 

블루투스 통신으로 relay가 작동하는거 까지 완료 했습니다.

하지만 추가적으로 스마트폰(마스터)과 통신을 하고 싶습니다 그래서 자두이노보드or 우노보드에 hc06(슬래이브)을 달아 

스마트폰으로 ppm값,temp,humi 확인 그리고 relay를 스마트 폰으로 on/off 제어를 하고 싶습니다.  

이렇게 하고 싶은데 가능할까요?

그리고  자두이노와 우노는 둘다 하드웨어 시리얼로 블루투스 통신중입니다.

하지만 자두이노에 있는 CO2센서는 SOFTWARESERIAL로 센서값 확인을 하고 있어

블루투스 모듈 한개 더 달면 Listen 함수로 순차적으로 제어를 해야하는걸로 알고있습니다.

하지만 아무리 코드를 짜도 두개이상의 소프트웨어 시리얼을 하지 못하네요 ㅠㅠ

현재 사용하고 있는 코드입니다. 

----마스터---

   #include <SoftwareSerial.h>
   #include <LiquidCrystal.h>//
   #include <DHT11.h>
 
   int pin=6; 
   int led1 = A1;
   int led2 = A2;
   int led3 = A3;
   int speaker=A4;
 
   
   DHT11 dht11(pin); 
   LiquidCrystal lcd(12, 11, 10, 9, 8, 7 );
   SoftwareSerial mySerial(4, 5); // RX, TX
 
 
   String CO2VALUE = "";
   double co2 =0; 
   double multiplier = 1;
   
   uint8_t buffer[25];
   uint8_t ind =0;
   
 void setup()
 {
    Serial.begin(115200); //Start Serial connection with host
    mySerial.begin(9600); //Start Serial connection with Sensor
 
    lcd.begin(16,2);
    pinMode(led1, OUTPUT);
    pinMode(led2, OUTPUT);
    pinMode(led3, OUTPUT);
    pinMode(speaker, OUTPUT);
    
 
 }
 
 void loop()
 {
 
    while(buffer[ind-1] != 0x0A) // run until buffer byte meet <LF>
    {
      if(mySerial.available())
      {
        buffer[ind] = mySerial.read(); // Read byte
        ind++;
      }
    }    
    report();


   if(co2<=2000)
   {
     digitalWrite(A1, HIGH);
     digitalWrite(A2, LOW);
     digitalWrite(A3, LOW);
         noTone(speaker);
     Serial.write('0');
   }
      else if(co2<3000)
   {
     digitalWrite(A2, HIGH);
     digitalWrite(A1, LOW);
     digitalWrite(A3, LOW);
     noTone(speaker);
     Serial.write('0');
   }
 
   else if (co2>3000)
   {
    digitalWrite(A3, HIGH);
    digitalWrite(A1, LOW);
    digitalWrite(A2, LOW);
    tone(speaker, 1000, 2000);
   Serial.write('1');
   }

  int err;
  float temp, humi;
  if((err=dht11.read(humi, temp))==0)
  {
    lcd.setCursor(0,0);
    lcd.print("temp:");
    lcd.print(temp,0);
    lcd.print("C");
    lcd.setCursor(9,0);
    lcd.print("hum:");
    lcd.print(humi,0);
    lcd.println("%");
  }
    lcd.setCursor(2,1);
    lcd.print(" CO2 = ");
    lcd.print(co2,0);
    lcd.println("ppm ");

 delay(150);
 }
 
 void report()
 {    
  for(int i=0; i < ind+1; i++)
  {
    if(buffer[i] == 'z') //once we hit the 'z' we can stop
    break;
    if((buffer[i] != 0x5A) && (buffer[i] != 0x20)) //ignore 'Z' and white space
    {
      CO2VALUE += buffer[i]-48; //because we break at 'z' the only bytes getting added are the numbers
                           // we subtract 48 to get to the actual numerical value
                           // example the character '9' has an ASCII value of 57. [57-48=9]
    }
  }
  co2 = (multiplier * CO2VALUE.toInt()); //now we multiply the value by a factor specific ot the sensor. see the
 
  
  ind=0; //Reset the buffer index to overwrite the previous packet
  CO2VALUE=""; //Reset the value string
 }

-----슬래이브----

int relay = 13; // LED 연결 핀
int val = 0;
void setup()
{
Serial.begin(9600); // 블루투스 연결 초기화
pinMode(relay, OUTPUT); // LED 연결 핀을 출력으로 설정
}


void loop()
{
if (Serial.available()){ // 마스터로부터 데이터 수신
val = Serial.read();
if(val=='1')
{
  digitalWrite(relay,HIGH);
}
else if(val=='0')
{
  digitalWrite(relay,LOW);
}
delay(10);
}
}

댓글목록

하드카피님의 댓글

하드카피 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일

해외 포럼을 보니 SoftwareSerial로 2개 이상의 기기를 사용하는 것은 잠재적인 문제점을 안게된다고 합니다. 가급적 두 개의 SoftwareSerial 장치에 access 할 때 간격을 두고 사용해야 하며, 그래도 완전한 해결책은 아니라고 하는 것 같습니다. 1:N 통신이 가능한 다른 통신 모듈을 활용하거나 가급적 HardwareSerial, SoftwareSerial 하나씩만 사용하도록 장치를 구성하는 것이 좋지 않을까 싶습니다.