-
중간고사 5번 문제 3-비트 카운터카테고리 없음 2023. 11. 6. 23:32
1. 회로도 만들기
이 회로도에서 스위치와 GND를 연결해주면 됩니다.
2. 문제 설명
[문제 3] 가변저항으로 숫자 조정하기
동작 개요
가변저항: UNO R4 WiFi의 A1에 연결된 가변저항 값은 0 ~ 1023의 값을 나타냅니다. 이 값을 0 ~7의 숫자로 바꾸어 현재의 카운터 값 n으로 설정합니다. 이렇게 설정된 카운터 값 n은 3개의 LED와 8x12 LED Matrix를 이용하여 나타내도록 아두이노 스케치를 작성하시오
[문제 4] 버튼으로 카운터 동작 제어하기
동작 개요
버튼: UNO R4 WiFi의 GPIO 2번 핀에 연결된 버튼이 눌릴 때마다 카운터의 동작이 정지 또는 작동하도록 [문제 2]에서 작성한 스케치를 수정하시오. 2번 핀은 INPUT_PULLUP으로 설정되어야 합니다. 이러한 동작은 버튼이 눌렸을 때 카운터 task를 enable 시키거나 disable 시키면 쉽게 구현할 수 있습니다.
[문제 5] 3-비트 카운터 완성하기
동작 개요
기능 통합 3-비트 카운터: [문제 3]과 [문제 4]에서 작성한 스케치를 활용하여 버튼으로 카운터 동작을 제어하되, 카운터가 정지되었을 때는 가변 저항을 이용하여 현재 카운터 값을 조절하도록 하시오. 또한 버튼이 눌리면 조정된 카운터 값부터 카운트 되어야 합니다.
3. 작성 코드
#include <TaskScheduler.h> // TaskScheduler 라이브러리 #include "ArduinoGraphics.h" // ArduinoGraphics 라이브러리 #include "Arduino_LED_Matrix.h" // Arduino_LED_Matrix 라이브러리 ArduinoLEDMatrix matrix; // LED 매트릭스 객체를 생성 char buf[2]; // 글자를 저장하는 문자열 const int LED2 = 9; const int LED1 = 10; const int LED0 = 11; const int buttonPin = 2; int D = 0; int n = 0; // TaskScheduler 객체를 생성 Scheduler ts; Task t1(1000, TASK_FOREVER, nCount, &ts, true); // nCount 함수를 호출하는 Task를 생성 void setup() { Serial.begin(9600); // 시리얼 통신 초기화 pinMode(buttonPin, INPUT_PULLUP); matrix.begin(); // LED 매트릭스를 초기화 matrix.beginDraw(); // 그리기 모드 시작 matrix.stroke(0xFFFFFFFF); // 텍스트의 색상 설정 matrix.textFont(Font_5x7); // 텍스트 폰트 설정 matrix.beginText(4, 1, 0xFFFFFF); // 텍스트 출력 위치 설정 } bool t1state = 0; // 버튼을 눌렀을 때 task의 토글 여부를 결정할 변수 t1state 초기화 void loop() { ts.execute(); // TaskScheduler를 실행 task 처리 int buttonstate = digitalRead(buttonPin); if (buttonstate == LOW) { // 버튼이 눌렸을 때 t1state ^= 1; // t1state를 토글 (1에서 0 또는 0에서 1로 전환) if (t1state == 0) { t1.disable(); // task 비활성화 } else { t1.enable(); // task 활성화 } delay(100); // 디바운싱을 위한 짧은 딜레이 } if (t1state == 1) { // t1 task가 활성화된 경우 Serial.println("N = " + String(n)); // 시리얼 모니터에 n의 값을 출력 sprintf(buf, "%d", n); // n 값을 문자열로 변환하여 buf에 저장 matrix.println(buf); // LED 매트릭스에 문자열 출력 matrix.endText(); // 문자열 출력 종료 } if (t1state == 0) { // t1 태스크가 비활성화된 경우 int v = analogRead(A1); // 아날로그 핀 A1에서 값 읽기 n = map(v, 0, 1023, 0, 7); // 아날로그 값 범위를 0에서 7로 매핑 Serial.println("N = " + String(n)); // 시리얼 모니터에 n의 값을 출력 sprintf(buf, "%d", n); // n 값을 문자열로 변환하여 buf에 저장 matrix.println(buf); // LED 매트릭스에 문자열 출력 matrix.endText(); // 문자열 출력 종료 } } // n을 증가시키고 LED 핀을 제어하는 함수 void nCount() { n = (n + 1) % 8; // n을 1 증가시키고 8로 나눈 나머지 값을 새로운 n으로 설정 digitalWrite(LED2, n & 4); // LED2 핀을 n의 4번째 비트와 일치하도록 설정 digitalWrite(LED1, n & 2); // LED1 핀을 n의 2번째 비트와 일치하도록 설정 digitalWrite(LED0, n & 1); // LED0 핀을 n의 1번째 비트와 일치하도록 설정 }
아두이노를 이용해 LED와 LED Matrix에 3비트 값을 나타내는 문제의 코드입니다.
TaskScheduler t1의 nCount 함수로 1초마다 0~7 사이로 n 값을 증가시킵니다.
버튼을 눌러 buttonstate가 LOW가 되면 t1state를 바꾸면서 t1state 값이 1이면 Task t1을 활성화하고
n값에 따라 LED와 LED Matrix에 출력을 합니다.
t1state가 0이면 가변 저항의 값을 0~7로 바꿔 n에 저장하고 n 값에 따라 LED와 LED Matrix에 출력을 합니다.
3. 실행 영상
실제 회로도에서 작동하는 영상입니다.