본문 바로가기

Computer Science/Embedded Software

[Embedded Software] Embedded System 개발 실습

+ 한국항공대학교 최차봉 교수님의 임베디드 SW 과목 내용을 정리한 글입니다.

< 첫 번째 실습 - Morning Alarm 제작 >

TinkerCad를 이용하여 "Morning Alarm"을 제작하라

- 아침이 밝아 빛의 양이 일정한 수치 이상이 될 때 음악을 재상한다.

- 스위치를 누르면 반복 재생되던 알람이 꺼진다.

 

Morning Alarm

// Morning Alarm
// Brighter than DAWN: paly music while checking button
//	press button -> Stop playing music

#define DAWN 7 // alram point
#define LONGTIME 60000

int val;
int butPressed = 0;
int note[] = {262, 294, 330, 349, 392, 440, 494, 523};
// 도(0), 레(1), 미(2), 파(3), 솔(4), 라(5), 시(6), 도(7)


/* delay while checking button pressed
out 
O: normal
1: snooze button pressed
*/
int delayC(int t){
  if (digitalRead(7)){
    butPressed = 1;
    Serial.println("Disabled");
  }
  else{
    delay(t);
  }
  return butPressed;
}

/* play note while checking button pressed
out
0: normal
1: snooze button pressed */

int playNote(int n, int d) {
  tone(9, note[n], d); 
  // note[n] 주파수를 9번 포트에 d millisecond 동안 울려라
  delayC(d);
  
  return 0;
  // d millisecond 동안 지연
}

int playMusic(){
  if (playNote(2, 375)){
  	return 1;
  }
  if (playNote(1, 250)){
    return 1;
  }
  if (playNote(0, 375)){
    return 1;
  }
  if (playNote(1, 250)){
  	return 1;
  }
  if (playNote(2, 500)){
    return 1;
  }
  if (playNote(7, 500)){
    return 1;
  }
  if (playNote(7, 1000)){
    return 1;
  }
  if (playNote(5, 1000)){
  	return 1;
  }
  if (playNote(4, 375)){
  	return 1;
  }
  if (playNote(2, 250)){
  	return 1;
  }
  if (playNote(0, 375)){
  	return 1;
  }
  if (playNote(1, 250)){
  	return 1;
  }
  if (playNote(2, 500)){
  	return 1;
  }
  if (playNote(4, 375)){
  	return 1;
  }
  if (playNote(2, 250)){
  	return 1;
  }
  if (playNote(1, 2000)){
  	return 1;
  }
}
  
void setup()
{
  pinMode(12, OUTPUT); // 12번 포트를 출력 포트로 설정
  pinMode(7, INPUT); // 7번 포트를 입력 포트로 설정
  Serial.begin(9600);
}

void loop()
{
  val = map(analogRead(A0), 4, 448 , 1, 10); // 1KΩ
  // 아날로그 입력포트 A0번의 전압을 읽어와서 1~10으로 변환
  Serial.println(val);
  
  if (digitalRead(7)) { // 스위치를 눌러 7번 포트에 전압이 들어오면
    butPressed = 1;
    Serial.println("Disabled");
  }
  
  if (val > DAWN && butPressed == 0) { // 밝기 전압이 7이상이면
    playMusic(); // 음악 실행!
    delay(LONGTIME);
  }
  butPressed = 0;
}

< 두 번째 실습 - Morning Alarm 2 제작 >

첫 번째 실습에 LED를 추가하여 "Morning Alarm 2"를 제작하라.

- 스위치를 누르면 LED가 On되고 "Alarm Enabled" 상태가 된다.

- 스위치를 다시 누르면 LED가 Off되고 "Alarm Disabled" 상태가 된다.

- 아침이 밝아 빛의 양이 일정한 수치 이상이 될 때, "Alarm Enabled"상태면 음악을 재생하고 2초 후에 반복한다.

- 스위치를 누르면 반복 재생되던 알람이 꺼진다. ("Alarm Disabled")

- 다시 알람을 기동하려면 "Alarm Enabled" 상태로 바꾸어야한다.

// Morning Alarm
// Brighter than DAWN: paly music while checking button
//	press button -> Stop playing music

#define DAWN 7 // alram point
#define LONGTIME 2000

int val;
int butPressed = 0;
int note[] = {262, 294, 330, 349, 392, 440, 494, 523};
// 도(0), 레(1), 미(2), 파(3), 솔(4), 라(5), 시(6), 도(7)


/* delay while checking button pressed
out 
O: normal
1: snooze button pressed
*/
int delayC(int t){
  if (digitalRead(7)){ // 7번 포트에 전압이 들어오면
  	butPressed = 0;
    Serial.println("Disabled");
    digitalWrite(12, LOW);
  }
  else{
  	delay(t); // t밀리초동안 지연
  }
  return !butPressed;
}

/* play note while checking button pressed
out
0: normal
1: snooze button pressed */
int playNote(int n, int d) {
  tone(9, note[n], d); 
  // note[n] 주파수를 9번 포트에 d millisecond 동안 울려라
  delayC(d);
}

int playMusic(){ // 음악 재생
  if (playNote(2, 375)){
  	return 1;
  }
  if (playNote(1, 250)){
    return 1;
  }
  if (playNote(0, 375)){
    return 1;
  }
  if (playNote(1, 250)){
  	return 1;
  }
  if (playNote(2, 500)){
    return 1;
  }
  if (playNote(7, 500)){
    return 1;
  }
  if (playNote(7, 1000)){
    return 1;
  }
  if (playNote(5, 1000)){
  	return 1;
  }
  if (playNote(4, 375)){
  	return 1;
  }
  if (playNote(2, 250)){
  	return 1;
  }
  if (playNote(0, 375)){
  	return 1;
  }
  if (playNote(1, 250)){
  	return 1;
  }
  if (playNote(2, 500)){
  	return 1;
  }
  if (playNote(4, 375)){
  	return 1;
  }
  if (playNote(2, 250)){
  	return 1;
  }
  if (playNote(1, 2000)){
  	return 1;
  }
}
  
void setup()
{
  pinMode(12, OUTPUT); // 12번 포트를 출력 포트로 설정
  pinMode(7, INPUT); // 7번 포트를 입력 포트로 설정
  Serial.begin(9600);
}

void loop()
{
  val = map(analogRead(A0), 4, 448 , 1, 10); // 1KΩ
  // 아날로그 입력포트 A0번의 전압을 읽어와서 1~10으로 변환
  Serial.println(val);
  
  if (digitalRead(7)) { // 스위치를 눌러 7번 포트에 전압이 들어오면
    butPressed = !butPressed;
      
    if (butPressed){
      digitalWrite(12, HIGH);
      Serial.println("Alarm Enabled");
    }
    else {
      digitalWrite(12, LOW);
      Serial.println("Alarm Disabled");
    }
  }
  
  if (val > DAWN && butPressed == 1) {
    playMusic(); // 음악 실행!
    delayC(LONGTIME);
  }
}

 

+ 스위치가 여러 번 눌리는 현상이 있기 때문에 제대로 작동하지 않을 수 있다. (여러 번 스위치를 눌러야 한다.)