극한의 아두이노 DIY생활 - 식물상태를 알려주는 기기16
안녕하세요! 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
[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.