이전에 개발한 신호등 소스를 배열을 이용하여 반복적으로 처리 코딩을 줄여 보겠습니다.
배열 - Array
배열 선언
int ledPins[6];
int ledPins[] = {2, 7, 4, 6, 5, 3};
int ledPins[6] = {2, 7, 4, 6, 5, 3};
첫번째 배열 처럼 데이터를 초기화 하지 않고 배열을 선언할 수 있습니다. 그러나 배열을 읽기전에 배열의 데이터를 추가해줘야 합니다.
두번쩨 배열 처럼 배열의 크기를 설정하지 않고 배열에 데이터를 선언할 수 있습니다. 그러면 컴파일러는 배열의 요소를 세어 배열의 크기를 설정합니다.
세번째 배열 처럼 배열의 크기와 설정하고 배열에 데이터를 선얼할 수 있습니다.
두번째 방법으로 배열을 사용하는 것이 오류도 적고 좋습니다.
배열은 0 베이스입니다.
ledPins[0]은 2이고 ledPins[5]은 3입니다.
ledPins[6]은 사용할 수 없습니다. 사용한다면 배열에 있는 값이 아닌 유효하지 않는 값이 리턴됩니다.
아두이노 IDE에서는 디지털 핀 제어를 배열로 처리하는 방법을 예제로 제공하고 있습니다.
다음은 아두이노 IDE에서 제공하는 예제인 Arrays(배열)의 예제 소스입니다.
메뉴 : 파일 > 예제 > 05. Control > Arrays
예제는 디지털 핀 번호를 1차원 배열로 전역에 선언하고 setup()함수에서 for문을 이용하여 디지털 핀의 모드를 설정합니다. 그리고 loop()함수에서는 for문을 이용하여 순방향과 영방향으로 배열에 설정된 디지털 핀 번호 순으로 LED의 불을 켜고 1초 후 끕니다.
int timer = 100; // The higher the number, the slower the timing.
int ledPins[] = {
2, 7, 4, 6, 5, 3
}; // an array of pin numbers to which LEDs are attached
int pinCount = 6; // the number of pins (i.e. the length of the array)
void setup() {
// the array elements are numbered from 0 to (pinCount - 1).
// use a for loop to initialize each pin as an output:
for (int thisPin = 0; thisPin < pinCount; thisPin++) {
pinMode(ledPins[thisPin], OUTPUT);
}
}
void loop() {
// loop from the lowest pin to the highest:
for (int thisPin = 0; thisPin < pinCount; thisPin++) {
// turn the pin on:
digitalWrite(ledPins[thisPin], HIGH);
delay(timer);
// turn the pin off:
digitalWrite(ledPins[thisPin], LOW);
}
// loop from the highest pin to the lowest:
for (int thisPin = pinCount - 1; thisPin >= 0; thisPin--) {
// turn the pin on:
digitalWrite(ledPins[thisPin], HIGH);
delay(timer);
// turn the pin off:
digitalWrite(ledPins[thisPin], LOW);
}
}
예제처럼 배열과 for문으로 신호등 소스를 다시 개발하겠습니다.
디지털 핀 출력 제어 - LED 삼색 신호등(시리얼 통신으로 통지)
1. 전역에 1차원 배열로 사용할 디지털 핀 번호를 선언합니다.
그리고 신호등 처리를 위해 신호 순서와 신호 칼라, 신호 시간을 1차원 배열로 선언합니다.
// 디지털 핀
int ledPins[] = {12, 11, 10};
int pinCount = 3;
// 신호등 신호 순서와 신호 칼라, 신호 시간
int trafficPins[] = {12, 11, 10, 11};
// 신호등 신호 칼라
String trafficColor[] = {"Green", "Orange", "Red", "Orange"};
// 신호등 신호 시간(초)
int trafficTimer[] = {5, 2, 5, 2};
int trafficCount = 4;
2. setup()함수에서 for문을 이용하여 디지털 핀의 모드를 출력 모드로 설정합니다.
void setup() {
for (int pinIndex = 0; pinIndex < pinCount; pinIndex++) {
pinMode(ledPins[pinIndex], OUTPUT);
}
Serial.begin(9600);
while(!Serial) {
}
Serial.println("Serial Port Connected.");
}
3. loop()함수에서 for문으로 디지털 핀에 HIGH를 호출하여 불을 켜고 시리얼 통신으로 신호등 칼라를 출력하고 delay()함수로 신호 시간 만큼 5초를 대기한 후 디지털 핀에 LOW를 호출하여 불을 끕니다.
void loop() {
for (int trafficIndex = 0; trafficIndex < trafficCount; trafficIndex++) {
digitalWrite(trafficPins[trafficIndex], HIGH);
Serial.println("Traffic Light : " + trafficColor[trafficIndex]);
delay(trafficTimer[trafficIndex] * 1000);
digitalWrite(trafficPins[trafficIndex], LOW);
}
}
4. 컴파일하고 업로드합니다.
반복적으로 사용하던 코드들이 배열과 for문으로 간소화 되었습니다.
2차원 배열로 처리
1. 전역에 1차원 배열로 사용할 디지털 핀 번호를 선언합니다.
그리고 신호등 처리를 위해 신호 순서와 신호 시간은 2차원 배열로 선언하고 신호 칼라는 1차원 배열로 선언합니다.
// 디지털 핀
byte ledPins[] = {12, 11, 10};
byte pinCount = 3;
// 신호등 신호 순서와 신호 시간
byte trafficLight[2][4] = {{12, 11, 10, 11}, {5, 2, 5, 2}};
// 신호등 신호 칼라
String trafficColor[] = {"Green", "Orange", "Red", "Orange"};
byte trafficCount = 4;
아두이노 보드에서 int는 16bit로 2Byte를 사용하고 byte는 8bit로 1Byte를 사용합니다.
그래서 아두이노 보드의 메모리 크기가 크지지 않기 때문에 데이터의 큰수가 255보다 작으면 int형보다 byte형으로 처리하는 것이 좋습니다.
2. loop()함수에서 digitalWrite()함수와 delay()함수를 2차원 배열로 수정합니다.
void loop() {
for (byte trafficIndex = 0; trafficIndex < trafficCount; trafficIndex++) {
digitalWrite(trafficLight[0][trafficIndex], HIGH);
Serial.println("Traffic Light : " + trafficColor[trafficIndex]);
delay(trafficLight[1][trafficIndex] * 1000);
digitalWrite(trafficLight[0][trafficIndex], LOW);
}
}
이처럼 다차원 배열을 사용하면 전역 변수의 선언을 간소화할 수 있습니다.