첫번째 아두이노 개인프로젝트는 신호등 시스템 환경을 구축하는 것이다.
우리가 횡단보도를 건널 때 신호등과 카운터가 있으며
사고위험이 있는 어느 횡단보도는 센서가 있어 차도와 가까워지면 경고음을 울리는 상황을 종종 볼 수 있다.
이런 환경을 소형화해서 아두이노로 만들어 보았다.
설계 방법
1. R, G led로 초록등, 빨간등을 표현한다.
2. 7-세그먼트로 9~0까지 표시하여 0이 되면 led색이 바뀌며 다시 9부터 카운트 한다.
3. 초음파 센서를 이용하여 빨간불일때 일정 거리 가까이 다가오면 경고음을 울린다.
4. 경고음은 피에조 부저로 설정한다.
소스코드
int pins[] = {2, 3, 4, 5, 6, 7, 8};
int num_of_pins = 7;
int delaytime = 1000;
bool segment[10][7] = {
{false, false, false, false, false, false, true}, //0
{true, false, false, true, true, true, true}, //1
{false, false, true, false, false, true, false}, //2
{false, false, false, false, true, true, false}, //3
{true, false, false, true, true, false, false}, //4
{false, true, false, false, true, false, false}, //5
{false, true, false, false, false, false, false}, //6
{false, false, false, true, true, true, true}, //7
{false, false, false, false, false, false, false}, //8
{false, false, false, false, true, false, false}, //9
};
int trig = 22;
int echo = 23;
int piez = 52;
int cnt = 0;
const int gLED = 30; //gled
const int rLED = 31; //rled
int ledState1 = LOW;
int ledState2 = HIGH;
unsigned long previousMillis = 0;
unsigned long segMillis = 0;
void setup() {
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
pinMode(piez, OUTPUT);
for (int i = 0; i < num_of_pins; ++i) {
pinMode(pins[i], OUTPUT);
digitalWrite(pins[i], HIGH);
}
pinMode(gLED, OUTPUT);
pinMode(rLED, OUTPUT);
}
void loop()
{
for (int i = 9; i >= 0; i--) {
seven_segment(segment[i]);
delay(1000);
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= 10000) {
previousMillis = currentMillis;
if (ledState1 == LOW)
ledState1 = HIGH;
else
ledState1 = LOW;
digitalWrite(gLED, ledState1);
if (ledState2 == HIGH)
ledState2 = LOW;
else
ledState2 = HIGH;
digitalWrite(rLED, ledState2);
}
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW); //초음파 발사
int duration = pulseIn(echo, HIGH);
int dis = duration / 29 / 2;
if (ledState2 == HIGH) {
if (dis < 15)
tone(piez, 698);
else {
noTone(piez);
}
}
delay(50);
}
}
void seven_segment(bool arr[]) {
for (int i = 0; i < num_of_pins; ++i) {
arr[i] ? digitalWrite(pins[i], LOW) : digitalWrite(pins[i], HIGH);
}
}
설계 사진 및 영상
결론 및 느낀점
종강 후 처음으로 해보는 개인 프로젝트였다.
간단히 초음파 센서와 피에조 부저 이렇게 모듈 두개만 이용하면 코드 작성하는데 문제가 없었지만
모듈을 사용하면 할수록 프로그램이 원하는대로 동작을 하지 않는 경우가 많았다.
가장 큰 어려움은 바로 delay함수를 사용할 때 문제가 있었다.
일반적으로 처음 아두이노를 배울 때 delay함수를 사용하여 led를 제어하는 법을 배우지만 이는 매우 활용도가 낮은 함수임을 알게 되었다.
delay는 말 그대로 시간을 지연시킨다는 뜻이다.
시간을 지연시킨다는 것은 회로 내에서 아무런 동작을 수행 할 수 없는 상태가 된다는 의미이며
다중작업을 할 수 없다는 소리이다.
만일 컴퓨터의 cpu가 고성능이지만 1초동안 아무런 연산을 할 수 없다면 뭐하러 고성능 cpu를 쓰나?
이런 불편함을 해결하기 위해 millis라는 함수가 도입된다.
millis는 시간을 밀리초단위로, 매우 빠른 시간으로 연산을 하여 마치 다중작업, 멀티테스킹을 하도록 눈속임을 하는 함수이다.
실제로는 하나의 작업밖에 하지 못하지만 이를 매우 짧은 시간 안에 쪼개어 작업을 하기 때문에 우리 눈에는 마치 동시에 작업을 하는 것 처럼 보이는 것이다.
millis함수에 관한 자세한 설명
2021.06.29 - [아두이노/예제] - [아두이노] 멀티테스킹 & 다중작업 millis()
'아두이노 > 프로젝트' 카테고리의 다른 글
[아두이노] 위치에 따라 회전하는 선풍기(다중초음파센서 제어) (4) | 2021.07.11 |
---|---|
[아두이노] 알람시계 프로젝트(RTC, LCD, 블루투스) (3) | 2021.07.01 |