ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 중간고사 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. 실행 영상

     

     

    실제 회로도에서 작동하는 영상입니다.

Designed by Tistory.