옵션 |
|
전체적인 준비물은 각 led램프가 red4개, green4개 한묶음으로 2개가 있으며 중간에 사용될 센서달린 스피커 한개해서 총 3개가 있습니다.
제가 원하는 동작을 순서대로 나열하자면
첫 번째 red 4개가 다 켜집니다. 그리고 10초 뒤 red 1개 꺼지구요. 2.5초 뒤 1개가 또 꺼집니다. 이렇게 2.5초 2.5초 지나면 red 램프 4개가 다 꺼집니다.
두 번째도 마찬가지로 색깔만 다를 뿐 순서와 시간 똑같이 첫 번째의 red4개가 다 켜질때 green4개가 다 켜져있습니다. 첫 번째 red 1개가 10초 뒤 꺼지면 두번째는 동시간대에 green이 1개 10초뒤에 꺼지구요.
이렇게 led램프가 4개 켜졌다가 다 꺼지는 17.5초 뒤에는
3개 전부(led묶음 2개, 센서달린 스피커)다 동시간 대에서
첫 번째의 green 4개가 다 켜집니다. 그리고 10초 뒤 green 1개 꺼지구요. 2.5초 뒤 1개가 또 꺼집니다. 이렇게 2.5초 2.5초 지나면 green 램프 4개가 다 꺼집니다.
두 번째도 마찬가지로 색깔만 다를 뿐 순서와 시간 똑같이 첫 번째의 red4개가 다 켜질때 green4개가 다 켜져있습니다. 첫 번째 red 1개가 10초 뒤 꺼지면 두번째는 동시간대에 green이 1개 10초뒤에 꺼지구요.
여기까지가 35초 간의 led 1cycle입니다. 다시 위로 돌아가서 17.5초 밑의 17.5초 총 35초를 또 반복하는 거구요.
대신 위랑 다른 점은 밑에는 센서달린 스피커도 동작을 합니다.
센서는 20cm이내에 물체가 감지되면 "danger"라는 소리를 나게끔 할 것이구요. 밑의 17.5초 간의 동작만 시킬 것입니다.
이후 다시 위로 가서 led만 있는 1/2 cycle, 밑에 센서달린 신호등 포함 1/2cycle 무한 반복이구요..
제가 이번에 아두이노 코딩을 처음 짜봐야 해서 친구에게 일단 물어보면서 해보았습니다..
#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초 딜레이
}
}