INU ESE : 창의설계입문 1st

박건민·2023년 10월 9일
0

그렇다..
이 블로그는 필자가 현재 재학중인(하지만 곧 싸나이의 의무를 지러 갈)
'국립' 인천대학교의 임베디드시스템공학과 과제들을 위한 블로그다..

<첫 과제는 이러하다>

▶ 강의 슬라이드에서 제시된 버튼을 누르는 것에 따라
  가변저항의 값을 받아 켜지는 LED의 갯수가 변하는 형태와
  숫자를 표시하는 형태가 토글로 변환되도록 만드는 과정을
  제시하는 블로그 글을 작성하고 댓글에 링크로 제출하세요.

  1. 코드에 대한 설명이 있어야 합니다.
  2. 코드를 작성하는 과정이 있어야 합니다.
  3. 작동하는 영상이 포함되어야 합니다.

  • 네이버 블로그, T스토리, 개인 웹사이트,
    Github md file, Notion 등 모든 블로그 형식의 사이트 링크

    제출기한 : 10월 11일 수요일 오후 16시 30분까지
    점수 : 제출 시 정성평가 +20점

이 과제를 처음 봤을 때..
Toggle이 뭔질 몰랐다. 그래서 찾아보기로 했다..

이게 Toggle Switch라는 거란다.. (아두이노에서 사용)
지하철이나 비행기의 조종실에서 봤을 법한 것이었다..

그런데 정말 아쉽게도 우리 Kocoafab의 GENIUS KIT엔 이게 없다;;
그래서 우린 그냥 Button을 저 스위치처럼 만들어야 하는 것이다!!!


우선 가변저항 값을 LED Matrix에서 숫자와 막대 형식으로 표현해주는 코드는
실습 시간에 사용했던 코드와 동일하다.

#include "ArduinoGraphics.h"	// 숫자 표현 위해 include
#include "Arduino_LED_Matrix.h"
ArduinoLEDMatrix matrix;

char buf[4];	// 가변저항 값(0~1023)까지 저장하기 위함


void setup() {
  matrix.begin();
  matrix.beginDraw();
  matrix.stroke(0xFFFFFFFF);
  matrix.textFont(Font_5x7);
  matrix.beginText(1, 1, 0xFFFFFF);
  // 여기까지도
  pinMode(2, INPUT_PULLUP);
}

// 숫자 표현 실습 코드를 함수화
void drawInt(int n){
    sprintf(buf, "%2d", n);
    matrix.println(buf);
    matrix.endText(); 
}

// 막대 표현 실습 코드
void drawBarGraph(int n) {
  uint32_t frame[3] = {0};
  int nFull = floor(n/32);
  int nDots = n % 32;
  int i;
  
  for( i=0; i < nFull; i++ ) frame[i] = 0xffffffff;
  if ( i == nFull && nDots != 0 ) 
      frame[i] = 0xffffffff << (32-nDots);

  matrix.loadFrame(frame);
}

물론 회로도도 스위치만 추가했다.


천만다행으로 구현된 코드가 있었다..

출처 : https://m.blog.naver.com/blackcubes/221964844424

  • 아래 코드는 변경된 코드
int flag = 0;	// 버튼 눌림 여부(눌림, 떼짐)
bool toggle_state = 0;	// 버튼 상태(ON, OFF)


void setup(){
	pinMode(2, INPUT_PULLUP);
}

void loop(){

	if(digitalRead(2) == 0){
    	if(flag == 0){
        	flag = 1;
            toggle_state = !toggle_state;
        }
    }
    else{
    	if(flag == 1){
        	flag = 0;
        }
    }
}

         얜 값이 안 바뀌고(유지됨) 누르고 뗄 때마다 계속 달라져;;


그래서.. 다시 찾아봤다!!

출처 : https://kikiai.tistory.com/29

  • 이것 역시 수정된 코드
bool current_button;
bool last_button = HIGH;


void setup(){
	pinMode(2, INPUT_PULLUP); // 내부 저항 사용
}

void loop(){

	current_button = digitalRead(2);
    
    // 눌렸을 때
    if(current_button == LOW && last_button == HIGH){
    	// 숫자 표현
    }
    else{
    	// 그래프 표현
    }
    
    last_button = current_button;
}

        거의 다 왔다! 누르는 거 유지만 시키자!!

             (위의 2개를 잘 섞으면 될 거 같은데...?)


이때! 눈에 들어온 이것!!

출처 : https://designatedroom87.tistory.com/221

  • 수정됨!
// 시간 (millis())은 굳이 필요 없을 것 같아 사용X

bool isActive = false;


void setup(){
	pinMode(2, INPUT_PULLUP);
}

void loop(){
	
    // 2번째 코드 + 인용(1번째 코드와 유사..?)
    if(current_button == LOW && last_button == HIGH){
    	isActive = (isActive) ? false : true;
    }
    
    if(isActive){
    	// 숫자
    }
    else{
    	// 그래프
    }
}

       와! 됐다!!!


그렇게 완성한 코드는 다음과 같다.

#include "ArduinoGraphics.h"
#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;
char buf[4];
bool isActive = false;
bool current_button;
bool last_button = LOW;


void setup() {
  matrix.begin();
  matrix.beginDraw();
  matrix.stroke(0xFFFFFFFF);
  matrix.textFont(Font_5x7);
  matrix.beginText(1, 1, 0xFFFFFF);
  pinMode(2, INPUT_PULLUP);
}

void drawInt(int n){
    sprintf(buf, "%2d", n);
    matrix.println(buf);
    matrix.endText(); 
}

void drawBarGraph(int n) {
  uint32_t frame[3] = {0};
  int nFull = floor(n/32);
  int nDots = n % 32;
  int i;
  
  for( i=0; i < nFull; i++ ) frame[i] = 0xffffffff;
  if ( i == nFull && nDots != 0 ) 
      frame[i] = 0xffffffff << (32-nDots);

  matrix.loadFrame(frame);
}


void loop() {
  int a = analogRead(A1);	// 가변저항 값(0~1023) 읽어 저장
  int n = map(a, 0, 1023, 0, 99);	// 0~99 범위로 변환 후 저장
  current_button = digitalRead(2);

  if (current_button == LOW && last_button == HIGH) {  
    isActive = (isActive) ? false : true;
  }
     
  if (isActive) {
    drawInt(n);
  }
  else {
    drawBarGraph(n);
  }

  last_button = current_button;
  delay(100);	// 찾아본 대부분이 100ms(0.1s)
}

    ▲ 위 이미지를 클릭하세요!


  • 밝을 땐 LED 불빛이 안보여서 불을 끄고 찍었다.
    그리고 여긴 왜 동영상이 안 올라갈까;;

이렇게 첫 게시물이 겨우 마무리됐는데..

네이버 카페랑 블로그는 해봤어도 여기 velog.io
github.com과 같은 곳이 개발자들의 SNS??인 것 같아서

도전을 해봤는데 블로그, 카페처럼 글자나 이미지 정렬 및 크기 조정,
동영상을 삽입하는 부분 등을 전부 코드로 직접 구현해야해서

구글링(코드 찾기)과 다른 velog 사이트들(사용법, 문법 정리본)을 보면서
기초적인 HTML, Markdown 등의 문법을 배울 수 있었던 것 같다!!

0개의 댓글