영글로그 - 영상을 글로 만든 블로그 :)

[Project] 아두이노+BLE 를 활용한 형광등 제어 컨트롤 본문

테크 팁(Tech Tip)/다양한 기술 (for geek)

[Project] 아두이노+BLE 를 활용한 형광등 제어 컨트롤

Young_Glog 2016. 4. 28. 14:27

아두이노+BLE 4.0(HM-10)을 이용한 형광등 On/Off 제어 Project


1. 소스코드 (Source Code)


 #include <SoftwareSerial.h > //시리얼 통신 라이브러리 호출


int blueTx = 2; //Tx (보내는핀 설정)

int blueRx = 3; //Rx (받는핀 설정)

SoftwareSerial mySerial(blueTx, blueRx); //시리얼 통신을 위한 객체선언

String myString = ""; //받는 문자열


 #define TEST_LED 13

 #define Relay_Pin 7

 #define Reset_Pin 4


 void LED_lighting(int cnt) {

        for (int i = 0; cnt < i; i++) {

          digitalWrite(TEST_LED, HIGH); //LED ON

          delay(10);

          digitalWrite(TEST_LED, LOW); //LED OFF

          delay(10);

        }

      }


void setup() {

  Serial.begin(9600); //시리얼모니터

  mySerial.begin(9600); //블루투스 시리얼 개방

  pinMode(TEST_LED, OUTPUT); //Pin 13을 OUTPUT으로 설정 (LED ON/OFF)

  pinMode(Relay_Pin, OUTPUT);

  pinMode(Reset_Pin, INPUT);

  digitalRead(Reset_Pin);

  digitalWrite(Relay_Pin, High);    //스위치로 바로켜면 켜지도록.

  //Serial.println("Hi");

}


void loop() {

  while (mySerial.available()) //mySerial 값이 있으면 BLE로 부터 값이 들어오면

  {

    char myChar = (char)mySerial.read(); //mySerial int형식의 값을 char형식으로 변환

    myString += myChar; //수신되는 문자열을 myString에 모두 붙임 (1바이트씩 전송되는 것을 모두 붙임)

    delay(5); //수신 문자열 끊김 방지

  }


   while (Serial.available()){ // if Serial has input(from serial monitor)

    byte data = Serial.read();


    mySerial.write(data); // write it to BT

  }


  if (!myString.equals("")) //myString 값이 있다면

  {

    // Serial.println("input value: "+myString); //시리얼모니터에 myString값 출력


    if ((myString == "on") || (myString == "ON") || (myString == "On")) //myString 값이 'on' 이라면

    {

      //Serial.println("on");

      digitalWrite(TEST_LED, HIGH); //LED ON

      delay(500);

      digitalWrite(Relay_Pin, HIGH);

    }

      else if ((myString == "reset") || (myString == "RESET") || (myString == "Reset")) {

        pinMode(Reset_Pin, OUTPUT);

        //Serial.println("Reset!");

        delay(500);

        digitalWrite(Reset_Pin, LOW);

      } else if ((myString == "off") || (myString == "OFF") || (myString == "Off")) {

          //Serial.println("OFF");

          digitalWrite(TEST_LED, LOW); //LED OFF

          delay(500);

          digitalWrite(Relay_Pin, LOW);

        } else if (myString == "bleset") {

           /* mySerial.write("AT+RENEW"); // 공장 초기화

            delay(500);

            while (mySerial.available()) {Serial.write(mySerial.read());}

            //회신이 있을때까지 대기

            Serial.write(mySerial.read());

            delay(100);

            Serial.println("");


            mySerial.write("AT+RESET"); // HM-10 리셋

            delay(500);

            while (mySerial.available()) 

            {

              Serial.write(mySerial.read());

            }

            //회신이 있을때까지 대기

            delay(100);

            

            mySerial.write("AT+CLEAR"); // 이전 접속 기기 삭제

            delay(500);

            while (mySerial.available()) {Serial.write(mySerial.read());}

            //회신이 있을때까지 대기

            delay(100);

            

            mySerial.write("AT+CONNL"); // 마지막 기기와 자동 연결

            delay(500);

            while (mySerial.available()) {Serial.write(mySerial.read());}

            //회신이 있을때까지 대기

            delay(100);

            

            mySerial.write("AT+BOUD0"); // 통신속도 9600설정

            delay(500);

            while (mySerial.available()) {Serial.write(mySerial.read());}

            //회신이 있을때까지 대기

            delay(100);

            

            mySerial.write("AT+ADVI5"); // 신호 송출 주기 5 설정(0.5초)

            delay(500);

            while (mySerial.available()) {Serial.write(mySerial.read());}

            //회신이 있을때까지 대기

            delay(100);

            

            mySerial.write("AT+NAMEK_TECH_BLE"); // HM-10 이름정의

            delay(500);

            while (mySerial.available()) {Serial.write((char)mySerial.read());}

            //회신이 있을때까지 대기

            delay(100);

            

            mySerial.write("AT+ADTY1"); //마지막에 연결된 기기를 허락 1.28초안

            delay(500);

            while (mySerial.available()) {Serial.write(mySerial.read());}

            //회신이 있을때까지 대기

            delay(100);

            

            mySerial.write("AT+IBEA1"); // Turn on iBeacon

            delay(500);

            while (mySerial.available()) {Serial.write(mySerial.read());}

            //회신이 있을때까지 대기

            delay(100);

            

            mySerial.write("AT+DELO2"); // Broadcast 전용 모드로 셋팅

            delay(500);

            while (mySerial.available()) {Serial.write(mySerial.read());}

            //회신이 있을때까지 대기

            delay(100);

            

            mySerial.write("AT+PWRM1"); // Auto sleep으로 가지 않음

            delay(500);

            while (mySerial.available()) {Serial.write(mySerial.read());}

            //회신이 있을때까지 대기

            delay(100);

            

            mySerial.write("AT+RESET"); // 리붓하여 반영 실시

            delay(500);

            while (mySerial.available()) {Serial.write(mySerial.read());}

            //회신이 있을때까지 대기

            delay(100);*/

          } else {}

        myString = ""; //myString 변수값 초기화

        //Serial.println("");

      }

}


참조 : 상기 코드는*빵판닷컴님의 블로그 참조하였습니다.

         (http://bbangpan.tistory.com/17)


*** 설명

 - 문자열을 받는 코드로 myString으로 값을 받고 on/off/reset인지 확인해서 동작!

 - HEX 가 아니라 UTF-8 로 설정해서 송신필요.

 - iPhone 5 app 사용 이름은 :LightBlue 라는 코드를 이용

 - MCU에서 BLE를 셋팅하는 코드를 작성하여 넣었지만 BLE에서 인식이 되지 않음.

  (http://stackoverflow.com/questions/19826749/how-to-use-ble-shield-based-on-hm-10-bluetooth-module 참조함.)

 - reset은 4번핀이 LOW 로 출력핀으로 변경되면 RST핀이 동작하여 RESET됨.

 - RST핀은 LOW Active.



2. H/W는 작성되는데로 Upload 예정.



3. BOM

 3.1 Main : Aduino NANO

 3.2 BLE : HM-10

 3.3 Relay : ADUINO 구매시 수령함 (사진은 http://deneb21.tistory.com/200 님의 사진을 사용함.)


4. 기타

 4.1 -

반응형