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

[아두이노] 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 툴바

시리얼 모니터 출력 결과


반응형