+ 한국항공대학교 최차봉 교수님의 임베디드 SW 과목 내용을 정리한 글입니다.
< 첫 번째 실습 - Polling을 이용한 LED >
Polling을 이용하여 스위치를 누르면 불이 켜지고, 꺼지는 아두이노를 제작하라.
int sw;
int flag = 0;
void setup()
{
pinMode(8, OUTPUT);
pinMode(7, INPUT);
Serial.begin(9600);
}
void loop()
{
sw = digitalRead(7);
if (sw == HIGH) {
flag = flag ? 0 : 1;
Serial.print("flag = ");
Serial.println(flag);
}
digitalWrite(8, flag);
delay(1000);
}
루프를 돌 때마다 7번 포트에 전압이 들어오면 flag를 0 -> 1 또는 1 -> 0으로 변환하고, 8번 포트에 flag를 사용한다.
=> 스위치를 눌러도 잘 반응하지 않는다.
< 두 번째 실습 - Interrupt를 이용한 LED >
Interrupt를 이용하여 스위치를 누르면 불이 켜지고, 꺼지는 아두이노를 제작하라.
+ 2, 3번 포트만 Interrupt를 사용할 수 있으므로 스위치를 2번 포트에 연결한다.
int flag = 0;
volatile byte state = LOW;
void sw_pressed() {
state = state ? 0 : 1; // state 0 -> 1 또는 1 -> 0 변환
Serial.println("Interrupt..");
}
void setup()
{
pinMode(8, OUTPUT);
pinMode(2, INPUT);
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(2), sw_pressed, RISING);
// 2번 포트 값이 LOW에서 HIGH로 변경될 때 인터럽트로 간주하고 sw_pressed 함수 실행
}
void loop()
{
digitalWrite(8, state);
delay(1000);
}
=> 스위치를 한번 누르면 확실하게 반응한다.
(루프문으로 인한 딜레이는 존재한다.)
< 세 번째 실습 - Interrupt를 이용한 Morning Alarm 3 >
https://daily-program-ing.tistory.com/97
[Embedded Software] Embedded System 개발 실습
+ 한국항공대학교 최차봉 교수님의 임베디드 SW 과목 내용을 정리한 글입니다. < 첫 번째 실습 - Morning Alarm 제작 > TinkerCad를 이용하여 "Morning Alarm"을 제작하라 - 아침이 밝아 빛의 양이 일정한 수치
daily-program-ing.tistory.com
이전 실습에서 Polling으로 구현한 Morning Alarm의 문제점을 Interrupt로 개선하여 Morning Alarm 3를 제작하라.
- 알람 On/Off 및 알람 끄기 스위치를 Interrupt로 구현한다.
< 검사 방법 >
1. 스위치를 눌러 알람 On/Off 기능을 확인한다.
2. 알람 On 후, 빛을 점점 밝게 설정하여 알람을 재생한다.
3. 알람이 2초마다 반복하는지 확인한다.
4. 스위치를 눌러 알람 중지 기능을 확인한다.
5. 알람 Off 상태일 때, 빛을 다시 어둡게 했다가 밝게 할 경우에도 재생되지 않음을 확인한다.
6. 시리얼 모니터로 상태 정보를 확인한다.
#define DAWN 7 // alram point
#define LONGTIME 2000
int val;
// 빛의 세기
volatile byte butPressed = LOW;
// butPressed가 0이면 알람 Off, 1이면 알람 On
int note[] = {262, 294, 330, 349, 392, 440, 494, 523};
// 도(0), 레(1), 미(2), 파(3), 솔(4), 라(5), 시(6), 도(7)
void sw_pressed(){
butPressed = butPressed ? 0 : 1;
Serial.println("Interrupt ..");
}
int delayC(int t){
// butPressed가 0이면 1을 반환하고 종료, 1이면 delay 후 t밀리초 지연
if (butPressed == 0){
return 1;
}
else{
delay(t); // t밀리초동안 지연
return 0;
}
}
int playNote(int n, int d) {
tone(9, note[n], d);
// note[n] 주파수를 9번 포트에 d millisecond 동안 울려라
return delayC(d); // delay의 반환 값을 반환
}
int playMusic(){
// 연주 중 playNote에서 1이 반환되면 연주 종료 후 1 반환
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(2, INPUT); // 7번 포트를 입력 포트로 설정
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(2), sw_pressed, RISING);
}
void loop()
{
val = map(analogRead(A0), 4, 448 , 1, 10); // 1KΩ
// 아날로그 입력포트 A0번의 전압을 읽어와서 1~10으로 변환
Serial.println(val);
if (butPressed == HIGH){ // 알람 On일 경우
digitalWrite(12, HIGH); // LED On
}
else { // 알람 Off일 경우
digitalWrite(12, LOW); // LED Off
}
if (val > DAWN && butPressed == HIGH) { // 빛의 세기가 DAWN이상이고, 알람 On일 경우
playMusic(); // 연주 시작
delay(LONGTIME);
}
}
=> 스위치를 누를 때 확실하게 알람 On/Off 되고, 알람이 바로 꺼진다.
'Computer Science > Embedded Software' 카테고리의 다른 글
[Embedded Software] Serial Communications (0) | 2023.10.11 |
---|---|
[Embedded Software] PWM 실습 (1) | 2023.10.05 |
[Embedded Software] Interrupt (0) | 2023.09.26 |
[Embedded Software] Embedded System 개발 실습 (0) | 2023.09.21 |
[Embedded Software] Embedded System 개발 (example) (1) | 2023.09.19 |