옵션 |
|
전체 준비물은 a랑 b가 있고 각 led램프가 red4개, green4개가 있으며 중간에 사용될 센서달린 스피커가 있습니다.
제가 원하는 동작을 순서대로 나열하자면
a의 red 4개가 다 켜집니다. 그리고 10초 뒤 red 1개 꺼지구요. 2.5초 뒤 1개가 또 꺼집니다. 이렇게 2.5초 2.5초 지나면 red 램프 4개가 다 꺼집니다.
b도 마찬가지로 색깔만 다를 뿐 a의 red4개가 다 켜질때 green4개가 다 켜져있습니다. 시간도 똑같이 순차적으로 꺼지구요.
그 다음 3개 전부다 동시간 대에서
a의 green 4개가 다 켜집니다. 그리고 10초 뒤 green 1개 꺼지구요. 2.5초 뒤 1개가 또 꺼집니다. 이렇게 2.5초 2.5초 지나면 green 램프 4개가 다 꺼집니다.
b도 마찬가지로 색깔만 다르게 a의 green4개가 다 켜질때 red4개가 다 켜져있습니다. 시간도 똑같게 순차적으로 꺼지구요.
센서달린 스피커도 동작을 합니다. 센서가 20cm이내에 물체가 감지되면 "danger"라는 소리를 낼거구요. 동작 타이밍은 a의 green4개가 다 켜지고 순차적으로 꺼지는 사이와 b의 red4개가 다 켜지고 순차적으로 꺼지는 사이에만 동작을 해야 합니다.
이후 다시 위로 가서 a의 red 4개가 다 켜지고 이를 반복하는 것 입니다.
제가 이번에 아두이노 코딩을 처음 짜봐야 해서 친구에게 일단 물어보면서 해보았습니다..
#include "talkie.h"
Talkie voice;
//Danger 음성 데이터
Const uint8_t spDANGER[] PROGMEM = {0x2D, 0xBF, 0x21, 0x92, 0x59, 0xB4, 0x9F, 0xA2, 0x87, 0x10, 0x8E, 0xDC, 0x72, 0xAB, 0x5B, 0x9D, 0x62, 0xA6, 0x42, 0x9E, 0x9C, 0xB8, 0xB3, 0x95, 0x0D, 0xAF, 0x14, 0x15, 0xA5, 0x47, 0xDE, 0x1D, 0x7A, 0x78, 0x3A, 0x49, 0x65, 0x55, 0xD0, 0x5E, 0xAE, 0x3A, 0xB5, 0x53, 0x93, 0x88, 0x65, 0xE2, 0x00, 0xEC, 0x9A, 0xEA, 0x80, 0x65, 0x82, 0xC7, 0xD8, 0x63, 0x0A, 0x9A, 0x65, 0x5D, 0x53, 0xC9, 0x49, 0x5C, 0xE1, 0x7D, 0x2F, 0x73, 0x2F, 0x47, 0x59, 0xC2, 0xDE, 0x9A, 0x27, 0x5F, 0xF1, 0x8B, 0xDF, 0xFF, 0x03};
//출력핀(trig)과 입력핀(echo) 연결 설정
int trigPin = 5;
int echoPin = 4;
float duration, distance, previous;
void setup() {
//시리얼 속도설정, trigPin을 출력, echoPin을 입력으로 설정
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(13, OUTPUT); //적색1
pinMode(12, OUTPUT); //적색2
pinMode(11, OUTPUT); //적색3
pinMode(10, OUTPUT); //적색4
pinMode(9, OUTPUT); //청색1
pinMode(8, OUTPUT); //청색2
pinMode(7, OUTPUT); //청색3
pinMode(6, OUTPUT); //청색4
}
void loop() {
digitalWrite(13, 1);
digitalWrite(12, 1);
digitalWrite(11, 1);
digitalWrite(10, 1);
digitalWrite(9, 0);
digitalWrite(8, 0);
digitalWrite(7, 0);
digitalWrite(6, 0);
delay(10000); //10초 딜레이
digitalWrite(13, 0);
delay(2500); //2.5초 딜레이
digitalWrite(12, 0);
delay(2500); //2.5초 딜레이
digitalWrite(11, 0);
delay(2500); //2.5초 딜레이
digitalWrite(10, 0);
digitalWrite(9, 1);
digitalWrite(8, 1);
digitalWrite(7, 1);
digitalWrite(6, 1);
//초음파를 보낸다. 다 보내면 echo가 HIGH(신호받기) 상태로 대기
digitalWrite(trigPin, HIGH);
delay(10);
digitalWrite(trigPin, LOW);
// echoPin 이 HIGH를 유지한 시간을 저장 한다.
duration = pulseIn(echoPin, HIGH);
// HIGH 였을 때 시간(초음파가 보냈다가 다시 들어온 시간)을 가지고 거리를 계산 한다.
// 340은 초당 초음파(소리)의 속도, 10000은 밀리세컨드를 세컨드로, 왕복거리이므로 2로 나눠준다.
distance = ((float)(340 * duration) / 10000) / 2;
// 20cm 이내에 물체가 감지면
// Danger 나옴
if(distance < 20 ) {
voice.say(spDANGER);
voice.say(spDANGER);
}
delay(40000); //40초 딜레이
digitalWrite(9, 0);
delay(10000); //10초 딜레이
digitalWrite(8, 0);
delay(10000); //10초 딜레이
digitalWrite(7, 0);
delay(10000); //10초 딜레이
}
}
얼추 이정도 까지 코딩을 했는데 led a랑 b는 서로 색깔만 달리해서 순차적으로 잘 작동을 하나 센서달린 스피커의 동작 타이밍인 "a의 green4개가 다 켜지고 순차적으로 꺼지는 사이와 b의 red4개가 다 켜지고 순차적으로 꺼지는 사이에만 동작을 합니다." 이 부분이 제 마음대로 되지 않고 danger라는 소리가 안나오거나 저 타이밍 외에도 작동을 하고 있네요.. 하ㅠㅠ
저 위의 코딩에서 수정할 부분이 어딘지 알 수 없을까요?..