[아두이노] 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());
}
}
저장을 선택하고 확인을 선택하여 컴파일을 수행한 후에 업로드하세요. 그리고 업로드가 끝나면 시리얼 모니터를 확인하세요.
'프로그래밍 기술 > 아두이노 ' 카테고리의 다른 글
[아두이노] 4. LED 신호등 (0) | 2018.03.21 |
---|---|
[아두이노] 3. 첫 번째 스케치 (0) | 2018.03.17 |
[아두이노] 2. 아두이노 IDE 프로그램 설치 (0) | 2018.03.17 |
[아두이노] 1. 아두이노 우노 R3 소개 (0) | 2018.03.17 |