프로그래밍 기술/아두이노

[아두이노] 5. 두 개의 LED 동시 제어하기

언제나휴일 2018. 3. 21. 16:12
반응형

[아두이노] 5. 두 개의 LED 동시 제어하기


아두이노 회로 구성도


이번에는 주기적으로 두 개의 LED를 동시에 On, Off 것을 해 봅시다.
두 개의 저항과 두 개의 LED와 세 개의 MM 연결선이 필요합니다.
빨간색은 Digial 13번 노란색은 Digaital 12번과 연결하세요.
GROUND
도 연결하세요.

여기에서는 두 개의 클래스를 작성할 거예요. 아두이노 스케치에서 작성하는 코드는 CPP입니다. 따라서 클래스를 정의하여 사용할 수 있습니다. 여기에서는 주기를 설정하고 확인할 TImer와 두 개의 LED를 제어할 DualLed 클래스를 정의할 거예요.

그리고 사용할 함수는 millis입니다. 
millis
는 시작한 이후에 몇 밀리 초가 흘렀는지 반환합니다.
long millis()


이제 구현해 봅시다.
class Timer
{
주기가 지났는지 확인하기 위해서는 이전에 측정한 시각을 알 수 있어야 합니다. 멤버 필드로 추가하세요.
  
long pms;
주기도 멤버로 추가하세요.
  
long interval;
주기가 몇 회전했는지 카운트하는 멤버도 추가하세요.
  
int count;
public:
생성자에서는 멤버 필드를 초기화하세요.
  Timer(){
    pms = 0;
    interval = 0;
    count = 0;
  }
주기를 설정하는 멤버 메서드를 제공하세요.
  
void Setup(long value){
    interval = value;
  }
주기가 흘렀는지 확인하는 메서드를 제공합시다.
  
bool IsInterval(){
만약 주기가 0이면 아직 주기를 설정한 것이 아니므로 거짓을 반환하세요.
    
if(interval == 0){
  return false;  
    }
millis
함수를 호출하여 현재 몇 밀리 초가 지났는지 측정합니다.
    
long now = millis();
측정한 현재 밀리 초와 이전에 측정한 값이 설정한 주기보다 크거나 같은지 확인하세요.
    
if(now - pms >= interval){
주기가 흘렀다면 현재 밀리 초를 pms에 설정하여 다음에 주기를 확인할 수 있게 합니다.
      pms = now;
주기 회전을 카운터를 1 증가하고 참을 반환하세요.
      count++;
      
return true;
    }
그 외는 거짓을 반환하세요.
    
return false;  
  }
주기 회전을 얻어오는 메서드를 제공하세요.
  
int GetCount(){
    
return count;
  }
};

이번에는 동시에 두 개의 LED를 주기적으로 On, Off하는 DualLed 클래스를 구현합시다.
class DualLed
{
멤버 필드로 타이머가 필요하겠죠.
  Timer timer;
두 개의 LED와 연결할 핀을 위한 멤버 필드를 추가하세요.
  
int red_pin;
  
int yellow_pin;
현재 On인지 Off인지 기억하는 멤버 필드를 추가하세요.
  
bool on;
public:
생성자에서는 핀 번호를 0으로 초기화하고 off 상태로 설정하세요.
  DualLed(){    
    red_pin = yellow_pin = 0;
    on = 
false;
  }
설정 메서드를 제공합시다. 주기와 두 개의 핀 번호를 입력인자로 받습니다.
  
void Setup(int interval,int red_pin,int yellow_pin){
먼저 타이머의 주기를 설정하세요.
    timer.Setup(interval);
멤버 필드에 핀 번호도 설정해야겠죠.
    
this->red_pin = red_pin;
    
this->yellow_pin = yellow_pin;
그리고 두 개의 핀을 출력 모드로 설정하세요.
    pinMode(red_pin, OUTPUT);
    pinMode(yellow_pin, OUTPUT);
  }
주기가 흘렀는지 확인하여 LED를 제어하는 메서드를 제공합시다.
  
bool Check(){
타이머의 IsInterval 메서드를 호출하여 주기가 흘렀는지 확인하세요.
    
if(timer.IsInterval()){
주기가 흘렀다면 on 멤버를 토글하세요.(true=>false로 false는 true로 변경)
      on ^= 
true;
      
if(on){
on
이 참이면 두 개의 핀에 HIGH를 설정하세요.
        digitalWrite(red_pin,HIGH);
        digitalWrite(yellow_pin,HIGH);
      }
      
else{
on
이 false이면 두 개의 핀을 LOW로 설정하세요.
        digitalWrite(red_pin,LOW);
        digitalWrite(yellow_pin,LOW);
      }
주기가 흘러 상태를 변경하였으므로 참을 반환하세요.
      
return true;
    }
그 외에는 거짓을 반환하세요.
    
return false;
  }  
상태 변환 카운터를 제공합시다.
  
int GetCount(){
타이머의 주기 회전수를 얻어와서 by pass 하세요.
    
return timer.GetCount();
  }
};

전역에 DualLed 형식 변수를 선언하세요.
DualLed dualled;
void setup() {
시리얼 포트의 속도를 설정하세요.
  Serial.begin(9600);
dualled
를 설정하세요. 여기에서는 1초 주기로 할게요.
  dualled.Setup(1000,13,12);
}
 
void loop() {
dualled
의 Check메서드를 호출하고 반환 값이 참이면 시리얼 포트로 상태 변환 카운터를 전송합시다.
  
if(dualled.Check()){
    Serial.println(dualled.GetCount());
  }
}
 
다음은 앞에서 설명한 전체 코드입니다.
class Timer
{
  
long pms;
  
long interval;
  
int count;
public:
  Timer(){
    pms = 0;
    interval = 0;
    count = 0;
  }
  
void Setup(long value){
    interval = value;
  }
  
bool IsInterval(){
    
if(interval == 0){
      
return false;  
    }
    
long now = millis();
    
if(now - pms >= interval){
      pms = now;
      count++;
      
return true;
    }
    
return false;  
  }
  
int GetCount(){
    
return count;
  }
};
 
class DualLed
{
  Timer timer;
  
int red_pin;
  
int yellow_pin;
  
bool on;
public:
  DualLed(){    
    red_pin = yellow_pin = 0;
    on = 
false;
  }
  
void Setup(int interval,int red_pin,int yellow_pin){
    timer.Setup(interval);
    
this->red_pin = red_pin;
    
this->yellow_pin = yellow_pin;
    pinMode(red_pin, OUTPUT);
    pinMode(yellow_pin, OUTPUT);
  }
  
bool Check(){
    
if(timer.IsInterval()){
      on ^= 
true;
      
if(on){
        digitalWrite(red_pin,HIGH);
        digitalWrite(yellow_pin,HIGH);
      }
      
else{
        digitalWrite(red_pin,LOW);
        digitalWrite(yellow_pin,LOW);
      }
      
return true;
    }
    
return false;
  }  
  
int GetCount(){
    
return timer.GetCount();
  }
};
DualLed dualled;
void setup() {
  Serial.begin(9600);
  dualled.Setup(1000,13,12);
}
 
void loop() {
  
if(dualled.Check()){
    Serial.println(dualled.GetCount());
  }
}

저장을 선택하고 확인을 선택하여 컴파일을 수행한 후에 업로드하세요. 그리고 업로드가 끝나면 시리얼 모니터를 확인하세요.



아두이노 IDE 툴바

시리얼 모니터 출력 결과


반응형