스마트인재개발원 ARDUINO 수업 후기

  • Button Debounce : 버튼 한 번 누름을 인지하는 코드.

버튼을 누르면 8정도씩 카운트가 되는데 이걸 1씩 카운트가 되게 하는 코드이다. 선생님께서 이 코드를 생각해내는 그 흐름이 중요하다고 강조하셨다. 선생님의 코드와 내 코드를 비교했을 때 내가 놓친 부분은 boolean 타입으로 으로 check조건을 줘서 이게 true일 때만 카운트가 되게 하는 것이였다. 지금 생각하면 크게 어렵지 않은데 왜 아까는 이 생각을 못했지..? 하고 항상 생각한다.. ㅎㅎ 내가 할 수 있는 방법은 복습하며 코드 분석하기! 열심히 해보자!
아래 사진은 버튼 회로도인데 내 코드는 여기에서 9번에 연결한 ledPin을 추가했다.

int ledPin = 9;
int bnt = 2; 
int cnt = 0; 

boolean check = true; 

void setup(){
pinMode(ledPin, OUTPUT);
}

void loop(){
int buttonState = digitalRead(btn);

if(buttonState==1){
 if(check == true){
 cnt++;
 check = false;
 }
}else{
check = true;
 }

if(cnt%3 == 1){
analogWrite(ledPin, 127);
}else if(cnt%3 ==2){
 analogWriter(ledPin, 255);
}else if(cnt%3 == 0){
 analogWrite(ledPin, 0);
 }
}

아래 코드는 아두이노 홈페이지에 나와있는 방법이다.

// constants won't change. They're used here to set pin numbers:
const int buttonPin = 2;    
// the number of the pushbutton pin
const int ledPin = 13;      
// the number of the LED pin

// Variables will change:
int ledState = HIGH;         
// the current state of the output pin
int buttonState;             
// the current reading from the input pin
int lastButtonState = LOW;   
// the previous reading from the input pin

// the following variables are unsigned longs because the time, measured in
// milliseconds, will quickly become a bigger number than can be stored in an int.
unsigned long lastDebounceTime = 0;  
// the last time the output pin was toggled
unsigned long debounceDelay = 50;    
// the debounce time; increase if the output flickers

void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);

  // set initial LED state
  digitalWrite(ledPin, ledState);
}

void loop() {
  // read the state of the switch into a local variable:
  int reading = digitalRead(buttonPin);

  // check to see if you just pressed the button
  // (i.e. the input went from LOW to HIGH), and you've waited long enough
  // since the last press to ignore any noise:

  // If the switch changed, due to noise or pressing:
  if (reading != lastButtonState) {
    // reset the debouncing timer
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    // whatever the reading is at, it's been there for longer than the debounce
    // delay, so take it as the actual current state:

    // if the button state has changed:
    if (reading != buttonState) {
      buttonState = reading;

      // only toggle the LED if the new button state is HIGH
      if (buttonState == HIGH) {
        ledState = !ledState;
      }
    }
  }

  // set the LED:
  digitalWrite(ledPin, ledState);

  // save the reading. Next time through the loop, it'll be the lastButtonState:
  lastButtonState = reading;
}
  • 온도센서 : TMP36. 전압의 변화량을 이용하여 온도를 측정.

쁠마 잘 확인하기!! 잘못 연결하면 화상 입을 수도 있으니 주의!!!

평평한 부분을 기준으로 pin1, pin2, pin3 -> 5v, A0 ,GND
(A0 : 센서값 읽어오는 용도)

  • 특정 온도 이상일 때 피에조 울리기!

int pinNum = 13; 

void setup(){
Serial.begin(9600); 
}

void loop(){
int sersorValue = analogRead(A0);

//전압구하는 코드
float voltage = sensorValue * 5.0 / 1024.0;
float tmpVal = (voltage - 0.5) * 100; 
Serial.println(tmpVal);

if(tmpVal => 30){
//tone : 피에조 울리는 메소드 
tone(pinNum, 392, 100);
}
delay(1000);
}

Serial통신

: USB를 통해 아두이노와 PC, 또는 다른 시리얼 장치 간에 정보를 송수신 하는 것.

아래 이미지는 Serial모니터에 하단에 있는 선택지인데 "데이터를 전송할 때 라인 끝에 어떤 거 포함할거야?" 의 질문에 대한 답변을 선택할 수 있다. 차례대로 살펴보자면,

  • line ending 없음 : 라인 끝에 아무것도 붙이지 않고 전송할거야
  • 새 줄 : 개행할거야
  • 캐리지 리턴 : 커서를 앞으로 옮겨줄거야
  • Both NL&CR : 동시에 할거야

Serial함수 살펴보기.

Serial.begin() : 괄호 안에 포트 번호 넣고 시리얼 모니터에서 결과를 확인할거면 처음에 적어줘야 한다.
Serial.print()
Serial.println()
Serial.available() : 읽어올 수 있는 문자(바이트 수)를 int타입으로 반환.
Serial.read() : 전송된 데이터를 char 타입으로 읽어오는 함수. 입력된 시리얼데이터를 읽은 후 더이상 읽을 값이 없을 시 -1 반환. available함수와 짝꿍이라고 생각하기.
Serial.parseInt : 전송된 데이터를 Integer형태로 읽어오는 함수.

C언어와 Python은 0을 제외한 나머지 숫자는 모두 true, 0은 false로 반환.

전송한 데이터는 buffer(임시저장공간)에 저장된다.
Serial.available()은 buffer에 저장된 데이터의 개수를 리턴하는데 read()를 하는 순간, 읽어온 데이터는 버퍼에서 삭제됨. -> available이 0이 되면 if문 종료.

  • 숫자를 입력 받아서 입력받은 값에 따라 led조명 끄고 키기!

int red = 5; 
int yellow = 4; 
int blue = 3;

void setup(){
Serial.begin(9600); 
pinMode(red, OUTPUT);
pintMode(yellow, OUTPUT);
pinMode(blue, OUTPUT);
}

void loop(){
if (Serial.available()){
char c = Serial.read();
Serial.println(c);

	if(c == "1"){
      digitalWrite(red, 1);
      digitalWrite(yellow, 0);
      digitalWrite(blue, 0);
	}

    else if (c == "2") {
      digitalWrite(red, 0);
      digitalWrite(yellow, 1);
      digitalWrite(blue, 0);
    }
    else if (c == "3") {
      digitalWrite(red, 0);
      digitalWrite(yellow, 0);
      digitalWrite(blue, 1);
    }
    else if (c == "4") {
      digitalWrite(red, 0);
      digitalWrite(yellow, 0);
      digitalWrite(blue, 0);
    }
  }
}
  • parseInt 사용해서 덧셈프로그램 만들기!
int result = 0; 
int num = 0;

void setup(){
Serial.begin(9600);
}

void loop(){
if(Serial.available()){
num = Serial.parseInt();

//c언어는 문자열+숫자형 더하기 연산 불가! 따로 적어주거나, 강제형변환 해주기! 
	Serial.print(result);
    Serial.print("+");
    Serial.print(num);
    result += num; 
    Serial.print("=");
    Serial.print(result);
   }
}

/

1차프로젝트 전 아두이노 수업이다. 코 앞에 닥쳐온 프로젝트를 위해 아두이노를 열심히 들었다. ㅎㅎ 우리조는 아이디어는 많이 나왔는데 현실적으로 아두이노를 사용해서 구현하기 무리가 있는 아이디어들이 있을까?! 와 어떤 센서를 이용해야 완성도 높은 제품이 나올까?! 에 대한 걱정이 있었다. 그래서 선생님 찬스! 수업이 끝나고 선생님께 우리 아이디어를 보여드리고 피드백을 받았다.

결과는 대성공!
역시나 우리끼리 머리를 맞대고 생각하는 것보다 전문가의 피드백을 받는 것이.. 👍
바로 다음 시간이 점심시간이였는데도 개인적으로 연락을 주셔서 친절하게 설명을 해주셨다.
우리가 받은 피드백을 공유하자면,

  1. 이미 상용화가 꽤 진행되어 있으니 유사 제품을 찾아봐라.
  2. 이 아이디어에서 이 센서를 사용하면 좋을 것 같다. / 혹은 이 센서는 무리다.
  3. 1차 프로젝트에서는 웹으로만 제품 구현을 해야 하니 이 방향은 어려울 것 같다.
  4. 이 아이디어는 모형으로 만들면 퀄리티가 떨어질 것 같아 걱정이다.

등등 많은 피드백을 받았다!

근데 이건 우리조만 개인적으로 여쭤본 것이니 혹 학원에서 프로젝트를 앞둔 분들이 이 글을 읽으신다면 꼭꼭! 선생님을 따로 찾아뵙고 여쭤보는 걸 추천한다!

이 피드백으로 우리조의 방향성을 확실하게 잡았고 여러번의 아이디어 회의 끝에 주제선정을 할 수 있었다. 추가로 선생님의 팁을 적어보자면,

  • 사용후기 많은 제품 이용하기. -> 오픈소스 사용 용이.
  • 여유분 충분히 구매하기! (2개 이상씩 구매 필수!)

이 정도? 아두이노에 대한 막연한 막막함이 있었는데 해소된 유익한 시간이였다!
다음 주 남은 아두이노 수업도 착착 진행돼서 프로젝트 때 충분히 써먹을 수 있길!

빅데이터전문가 IT자격증 SQLD 머신러닝

좋은 웹페이지 즐겨찾기