+ 한국항공대학교 최차봉 교수님의 임베디드 SW 과목 내용을 정리한 글입니다.
< 첫 번째 실습 - Morning Alarm 제작 >
TinkerCad를 이용하여 "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);
}
}
+ 스위치가 여러 번 눌리는 현상이 있기 때문에 제대로 작동하지 않을 수 있다. (여러 번 스위치를 눌러야 한다.)
'Computer Science > Embedded Software' 카테고리의 다른 글
[Embedded Software] Interrupt 실습 (0) | 2023.09.27 |
---|---|
[Embedded Software] Interrupt (0) | 2023.09.26 |
[Embedded Software] Embedded System 개발 (example) (1) | 2023.09.19 |
[Embedded Software] Shell Script 실습 (0) | 2023.09.15 |
[Embedded Software] Shell Script (0) | 2023.09.13 |