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

in kr-dev 커뮤니티2 years ago

안녕하세요! Jimae입니다.

저번에 갑작스럽게 센서하나를 기억 못해서 급하게 설명하느라 딴길로 샜는대 ㅠㅠ

다시 시작해 보겠습니다.

void setup() {
  // put your setup code here, to run once:
  LightSensorInit();    // 조도센서 초기화
  THumidityInit();      // 온습도센서 초기화
  TemperatureInit();    // 온도센서 초기화
  Serial.begin(9600);
  BTSerial.begin(9600); // 블루투스 초기화
  BluetoothLEDInit();   // 블루투스 led 초기화
}

Serial.begin(9600);
BTSerial.begin(9600); // 블루투스 초기화
BluetoothLEDInit(); // 블루투스 led 초기화

이제 이 3개가 남았군요

시리얼 통신은 debug 용으로 쓰이기에 선언해서 사용한거구요.

#include <SoftwareSerial.h>

SoftwareSerial BTSerial(3, 4);   //bluetooth module Tx:Digital 3 Rx:Digital 4

void setup() {
  // put your setup code here, to run once:
  LightSensorInit();    // 조도센서 초기화
  THumidityInit();      // 온습도센서 초기화
  TemperatureInit();    // 온도센서 초기화
  Serial.begin(9600);
  BTSerial.begin(9600); // 블루투스 초기화
  BluetoothLEDInit();   // 블루투스 led 초기화
}

SoftwareSerial BTSerial(3, 4); //bluetooth module Tx:Digital 3 Rx:Digital 4

BTSerial.begin(9600); // 블루투스 초기화

블루투스는 각각 센서들의 데이터를 읽어서 어플리케이션으로 전송하기위해 이렇게 3번, 4번 Pin으로 설정이 되어있습니다.

bluetooth module Tx:Digital 3 Rx:Digital 4

물론 이부분을 잘확인 해주셔서 배선을 해야합니다.
3번이 Tx, 4번이 Rx

#define BLUELED 5

void BluetoothLEDInit(void)
{
  pinMode(BLUELED, OUTPUT);
  digitalWrite(BLUELED, LOW);
}

이런 또 깜빡했네요. 이것은 아무래도 블루투스 상태를 표기하기 위해 추가로 단 LED입니다.

블루투스와 통신상태가 어떤지에 따라 깜빡일지 그냥 꺼버릴지 킬지 그런 상태용도로 쓸려고 했던것 같습니다.

아무래도 이것을 만들었던 때가 2017년이다 보니 기억력이 가물가물 합니다. ㅠㅠ... 죄송합니다.

setup은 이렇게 센서와 블루투스 그리고 추가로 LED 를 설정해주는 용도로 쓰이고 있구요.

이제 대망의 loop 함수 입니다.

void loop() {
  // put your main code here, to run repeatedly:
    
  SmartFarmProgram();
}

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함수 하나만 돌아가고 있다고 보시면 됩니다.

그리고 switch case문을 이용한 스케줄링 방식으로 각각 순차적으로 동작하는 방식이죠.

이것을 설명하기에 글이 길어질것 같아 여기까지 하겠습니다.

다들 좋은 하루 되세요.

극한의 아두이노 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

Sort:  
 2 years ago 

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

Upvoted! Thank you for supporting witness @jswit.

Coin Marketplace

STEEM 0.18
TRX 0.14
JST 0.029
BTC 57839.82
ETH 3132.70
USDT 1.00
SBD 2.43