극한의 아두이노 DIY생활 - 식물상태를 알려주는 기기16

in kr-dev 커뮤니티2 years ago

안녕하세요! Jimae입니다.

자 오늘은 loop 함수를 해석해 보도록 하겠습니다.

이것도 생각보다 글이 길어질것 같아서 중간에 끊어야 할것같내요.

void SmartFarmProgram(void)
{
  switch(programStep)
  {
    case SIGNALWAITING:
                       while(BTSerial.available())  //BTSerial 값이 있으면
                       {
                         char blueChar = (char)BTSerial.read();  //BTSerial int형식의 값을 char형식으로 변환
                         BlueString+=blueChar;   //수신되는 문자열을 BlueString 모두 붙임 (1바이트씩 전송되는 것을 모두 붙임)
                         delay(5);           //수신 문자열 끊김 방지
                       }
  
                       if(!BlueString.equals(""))  //myString 값이 있다면
                       {
                           if(BlueString == "start")  
                           {
                             programStep = DATASEND;
                             BlueString="";  //BlueString 변수값 초기화
                             
                             blueTimer = millis();
                             previousblueTimer = blueTimer;
                             break;
                           }
                         BlueString="";  //BlueString 변수값 초기화
                       }
                       
                       BluetoothLEDBlink(); // LED 깜빡거리는 함수
                       break;
    case DATASEND:
                  BluetoothLEDOn(); // LED 계속 켜짐

                  SensorDataRead(); // 센서값들 읽기

                  SensorDataSend(); // 센서 값들 전송
        
                  programStep = DATACONFIRM;
                  
                  break;
                  
    case DATACONFIRM:
                     while(BTSerial.available())  //BTSerial 값이 있으면
                     {
                        char blueChar = (char)BTSerial.read();  //BTSerial int형식의 값을 char형식으로 변환
//                        Serial.println(blueChar);   // 디버깅 코드
                        BlueString+=blueChar;   //수신되는 문자열을 BlueString 모두 붙임 (1바이트씩 전송되는 것을 모두 붙임)
                        delay(5);           //수신 문자열 끊김 방지
                     }
  
                     if(!BlueString.equals(""))  //myString 값이 있다면
                     {
                         if(BlueString == "ok")  
                         {
                           programStep = DATASEND;
                           BlueString="";  //BlueString 변수값 초기화
                           
                           blueTimer = millis(); 
                           previousblueTimer = blueTimer;
                           break;
                         }
                       BlueString="";  //BlueString 변수값 초기화
                     }

                     blueTimer = millis();

                     if(blueTimer - previousblueTimer > 3000)   // 3초이상 데이터 안들어올경우 대기상태로 돌아감
                     {
                        programStep = SIGNALWAITING;
                        blueTimer = millis();
                        previousblueTimer = blueTimer;
                     }
                       
                     break;
    default:
            break;
  }
}

자 loop 함수에서는 SmartFarmProgram 함수만 사용을 하는대

SmartFarmProgram 함수내부에서는 3가지 모드로 스케줄링이 되어있습니다.

enum{SIGNALWAITING = 0, DATASEND, DATACONFIRM};

이것인대요.

SIGNALWAITING 은 블루투스에서 데이터의 요청이 들어올때까지 대기하는 모드구요,

DATASEND 은 말그대로 블루투스로 데이터를 보내주는 모드 입니다.

DATACONFIRM 은 블루투스에서 보내준 데이터가 제대로 들어갔는지 확인하는 절차이구요.

추가로 3초동안 데이터가 안들어온다면 SIGNALWAITING 모드로 빠져버리내요.

자 우선은 SIGNALWAITING 모드를 확인해 보도록 하겠습니다.

    case SIGNALWAITING:
                       while(BTSerial.available())  //BTSerial 값이 있으면
                       {
                         char blueChar = (char)BTSerial.read();  //BTSerial int형식의 값을 char형식으로 변환
                         BlueString+=blueChar;   //수신되는 문자열을 BlueString 모두 붙임 (1바이트씩 전송되는 것을 모두 붙임)
                         delay(5);           //수신 문자열 끊김 방지
                       }
  
                       if(!BlueString.equals(""))  //myString 값이 있다면
                       {
                           if(BlueString == "start")  
                           {
                             programStep = DATASEND;
                             BlueString="";  //BlueString 변수값 초기화
                             
                             blueTimer = millis();
                             previousblueTimer = blueTimer;
                             break;
                           }
                         BlueString="";  //BlueString 변수값 초기화
                       }
                       
                       BluetoothLEDBlink(); // LED 깜빡거리는 함수
                       break;

음 더 쪼개 보도록 하겠습니다.

                       while(BTSerial.available())  //BTSerial 값이 있으면
                       {
                         char blueChar = (char)BTSerial.read();  //BTSerial int형식의 값을 char형식으로 변환
                         BlueString+=blueChar;   //수신되는 문자열을 BlueString 모두 붙임 (1바이트씩 전송되는 것을 모두 붙임)
                         delay(5);           //수신 문자열 끊김 방지
                       }

이부분은 블루투스에서 데이터를 취득하는 방법이구요.

BlueString 은 전역변수로 선언되어 있습니다.

String BlueString = "";

                       if(!BlueString.equals(""))  //myString 값이 있다면
                       {
                           if(BlueString == "start")  
                           {
                             programStep = DATASEND;
                             BlueString="";  //BlueString 변수값 초기화
                             
                             blueTimer = millis();
                             previousblueTimer = blueTimer;
                             break;
                           }
                         BlueString="";  //BlueString 변수값 초기화
                       }

블루투스에서 start 라는 문자열 값이 들어와야지만 DATASEND 모드로 갈수있구 그외에는 무시합니다.

                       BluetoothLEDBlink(); // LED 깜빡거리는 함수
                       break;


void BluetoothLEDBlink(void)
{
  ledTimer = millis();

  if(ledTimer - previousLedTimer > 200)
  {
      if(ledFlag == 0)
      {
        digitalWrite(BLUELED, HIGH);
        ledFlag = 1;
      }
      else 
      {
        digitalWrite(BLUELED, LOW);
        ledFlag = 0;
      }
      ledTimer = millis();
      previousLedTimer = ledTimer;
  }
}

BluetoothLEDBlink 함수는 갑자기 추가된 LED 인대

200ms 단위로 깜빡이게끔 구현이 된 함수이내요.

즉 LED가 SIGNALWAITING 모드일때는 엄청나게 빠르게 깜빡일 것입니다.

글을 얼마 안썻는대도 불구하고 엄청 길어지내요.

오늘은 여기까지 다음부터는 DATASEND 모드 부터 시작을 해보겠습니다.

다들 좋은 하루 되세요.

극한의 아두이노 DIY생활 - 식물상태를 알려주는 기기1
극한의 아두이노 DIY생활 - 식물상태를 알려주는 기기2
극한의 아두이노 DIY생활 - 식물상태를 알려주는 기기3
극한의 아두이노 DIY생활 - 식물상태를 알려주는 기기4
극한의 아두이노 DIY생활 - 식물상태를 알려주는 기기5
극한의 아두이노 DIY생활 - 식물상태를 알려주는 기기6
극한의 아두이노 DIY생활 - 식물상태를 알려주는 기기7
극한의 아두이노 DIY생활 - 식물상태를 알려주는 기기8
극한의 아두이노 DIY생활 - 식물상태를 알려주는 기기9
극한의 아두이노 DIY생활 - 식물상태를 알려주는 기기10
극한의 아두이노 DIY생활 - 식물상태를 알려주는 기기11
극한의 아두이노 DIY생활 - 식물상태를 알려주는 기기12
극한의 아두이노 DIY생활 - 식물상태를 알려주는 기기13
극한의 아두이노 DIY생활 - 식물상태를 알려주는 기기14
극한의 아두이노 DIY생활 - 식물상태를 알려주는 기기15

Sort:  
 2 years ago 

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.

Coin Marketplace

STEEM 0.18
TRX 0.14
JST 0.029
BTC 57893.29
ETH 3130.56
USDT 1.00
SBD 2.44