7-segment라고 불리기도 하는 숫자를 표현하는데 사용되는 부품
전원을 VCC를 공통으로 하는 애노드(+) 공통 타입, GND를 공통으로 하는 캐소드(-) 공통 타입으로 분류됨.
키트 내에 포함된 FND는 애노드공통 FND임


검색결과 교재설명과 다르게 5161AS는 캐소드 타입임
int seg[] = {2,3,4,5,6,7,8,9}; //배열러 D2에서 D9까지 핀 생성
byte digits[10][8] = { //애노드 공통 타입의 경우 1인 위치가 꺼진 상태, 0인 위치가 켜진 상태
//dp, g, f, e, d, c, b, a
{1, 1, 0, 0, 0, 0, 0, 0}, //0
{1, 1, 1, 1, 1, 0, 0, 1}, //1
{1, 0, 1, 0, 0, 1, 0, 0}, //2
{1, 0, 1, 1, 0, 0, 0, 0}, //3
{1, 0, 0, 1, 1, 0, 0, 1}, //4
{1, 0, 0, 1, 0, 0, 1, 0}, //5
{1, 0, 0, 0, 0, 0, 1, 0}, //6
{1, 1, 1, 1, 1, 0, 0, 0}, //7
{1, 0, 0, 0, 0, 0, 0, 0}, //8
{1, 0, 0, 1, 0, 0, 0, 0}, //9
};
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
int i;
for(i = 0; i < 8; i++){
pinMode(seg[i], OUTPUT);//2,3,4,5,6,7,8,9 핀 출력 설정
}
}
void loop() {
// put your main code here, to run repeatedly:
int i, j;
for(i = 0; i < 10; i++){
for(j = 0; j < 8; j++){
digitalWrite(seg[j], !digits[i][j]);//seg[j] 핀에 digits[i][j] 값(1, 0 == HIGH, LOW)
}
delay(1000);
}
}
그래서 코드에서처럼 !digits[i][j]로 값을 전환해준다.

캐소드타입이라 5v 대신 gnd에 연결해야 하고, 또 교재와 다르게 digits의 값도 변환이 필요하다.
FND와 마찬가지로 애노드 공통 타입과 캐소드 공통 타입이 있다.
이번엔 실습 전에 모델을 확인해본다.

이번엔 애노드가 맞다.
그런데 교재속 예제가 너무 이해하기도 힘들고 회로도도 복잡하다.
참고 : https://copynull.tistory.com/394
이쪽 예제가 훨씬 이해하기도 쉽다.

// 핀 번호
int rows[] = {A0, 12, A2, 13, 5, A3, 7, 2};
int cols[] = {9, 8, 4, A1, 3, 10, 11, 6};
// 하트 모양 패턴
byte patternHeart[8][8] = {
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 1, 0, 0, 1, 1, 0},
{1, 0, 0, 1, 1, 0, 0, 1},
{1, 0, 0, 0, 0, 0, 0, 1},
{1, 0, 0, 0, 0, 0, 0, 1},
{0, 1, 0, 0, 0, 0, 1, 0},
{0, 0, 1, 0, 0, 1, 0, 0},
{0, 0, 0, 1, 1, 0, 0, 0},
};
// LED 초기화 함수
void clear() {
for (int i = 0; i < 8; i++) {
digitalWrite(rows[i], LOW);
digitalWrite(cols[i], HIGH);
}
}
void setup() {
// 초기화
for (int i = 0; i < 8; i++) {
pinMode(rows[i], OUTPUT);
pinMode(cols[i], OUTPUT);
}
}
void loop() {
// 배열값 하트 패턴 출력
for (int x = 0; x < 8; x++) {
clear(); // LED 초기화
digitalWrite(rows[x], HIGH); // 하나의 행을 선택
for (int y = 0; y < 8; y++) {
if (patternHeart[x][y] == 1) {
digitalWrite(cols[y], LOW); // 배열값이 1인 경우 해당 위치의 LED를 켬
}
}
delay(2);
}
}

int rows[] = {A0, 12, A2, 13, 5, A3, 7, 2};
int cols[] = {9, 8, 4, A1, 3, 10, 11, 6};
// LED 초기화 함수
void clear() {
for (int i = 0; i < 8; i++) {
digitalWrite(rows[i], LOW);
digitalWrite(cols[i], HIGH);
}
}
// 좌표값의 LED 표시
void point(int x, int y, int delayTime) {
clear();
digitalWrite(rows[x], HIGH);
digitalWrite(cols[y], LOW);
delay(delayTime);
}
void setup() {
// 초기화
for (int i = 0; i < 8; i++) {
pinMode(rows[i], OUTPUT);
pinMode(cols[i], OUTPUT);
}
}
void loop() {
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
point(i, j, 100);
}
}
}

시리얼 모니터에 1을 입력하면 LED가 1개 켜지고, FND에 숫자 1을 표시
시리얼 모니터에 2를 입력하면 LED가 2개 켜지고, FND에 숫자 2을 표시
시리얼 모니터에 3을 입력하면 LED가 3개 켜지고, FND에 숫자 3을 표시
시리얼 모니터에 0을 입력하면 LED가 모두 꺼지고, FND에 숫자 0을 표시
int led1 = 10;
int led2 = 11;
int led3 = 12;
int seg[] = {2,3,4,5,6,7,8,9};
//byte 타입은 0~255의 unsigned char와 동일
byte digits[4][8] = { // dp -> g -> f -> e -> d -> c -> b -> a
{0, 0, 1, 1, 1, 1, 1, 1}, // 0
{0, 0, 0, 0, 0, 1, 1, 0}, // 1
{0, 1, 0, 1, 1, 0, 1, 1}, // 2
{0, 1, 0, 0, 1, 1, 1, 1} // 3
};
void setup() {
// put your setup code here, to run once:
int i;
for(i = 0; i < 8; i++){
pinMode(seg[i], OUTPUT);
}
for(i = 0; i < 8; i++){
digitalWrite(seg[i], digits[0][i]);
}
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
//digitalWrite(led1, HIGH);//off로 초기화
//digitalWrite(led2, HIGH);//off로 초기화
//digitalWrite(led3, HIGH);//off로 초기화
digitalWrite(led1, LOW);//off로 초기화
digitalWrite(led2, LOW);//off로 초기화
digitalWrite(led3, LOW);//off로 초기화
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
char a;
int i;
if(Serial.available()){
a = Serial.read();
if(a == '0'){
// digitalWrite(led1, HIGH);
// digitalWrite(led2, HIGH);
// digitalWrite(led3, HIGH);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
for(i = 0; i < 8; i++){
digitalWrite(seg[i], digits[0][i]);
}
}
else if(a == '1'){
// digitalWrite(led1, LOW);
// digitalWrite(led2, HIGH);
// digitalWrite(led3, HIGH);
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
for(i = 0; i < 8; i++){
digitalWrite(seg[i], digits[1][i]);
}
}
else if(a == '2'){
// digitalWrite(led1, LOW);
// digitalWrite(led2, LOW);
// digitalWrite(led3, HIGH);
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, LOW);
for(i = 0; i < 8; i++){
digitalWrite(seg[i], digits[2][i]);
}
}
else if(a == '3'){
// digitalWrite(led1, LOW);
// digitalWrite(led2, LOW);
// digitalWrite(led3, LOW);
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
for(i = 0; i < 8; i++){
digitalWrite(seg[i], digits[3][i]);
}
}
}
}

이전 실습과 동일하게 키트 내 FND가 캐소드이기 때문에 5v가 아니라 gnd에 연결되어야 한다.
지금은 켜진다는 뜻으로 1, HIGH로 적고 꺼진다는 뜻으로 0, LOW를 하는데, 예제는 반대로 적히는 경우가 많다. 좀 더 알아봐야겠다.