๋ธ๋ฃจํฌ์ค ํต์ ์ ํตํ ์ถฉ๋ ์๋ฆผ ๋ฐ ๋ช ๋ น์ด๊ธฐ๋ฐ ์ฅ์ ๋ฌผ ํ์ง ๊ฑฐ๋ฆฌ ์ ์ด
ํ๋ก ๊ตฌ์ฑ
- ํํธ ์ค์์น๋ฅผ ํตํด ์์คํ ์ ON(๊ฑฐ๋ฆฌ๊ฐ์ง๋ชจ๋ ํ์ฑํ), OFF(๊ฑฐ๋ฆฌ๊ฐ์ง๋ชจ๋ ๋น ํ์ฑํ)
- ON์ผ ๊ฒฝ์ฐ ์๋์ฐจ์ ์ฅ์ ๋ฌผ๊ณผ์ ๊ฑฐ๋ฆฌ๋ฅผ LCD์ ํ์.
- ์ฅ์ ๋ฌผ๊ณผ์ ๊ฑฐ๋ฆฌ์ ๋ฐ๋ผ LED๊ฐ ์ ๋ฑ๋๋ ์ ๋ฐ๋.
- ์ฅ์ ๋ฌผ๊ณผ ๋งค์ฐ ๊ฐ๊น๋ค : ๋นจ๊ฐ์ LED ์ ๋ฑ
- ์ฅ์ ๋ฌผ๊ณผ ๊ฐ๊น๋ค : ๋ ธ๋์ LED ์ ๋ฌ
- ์ฅ์ ๋ฌผ๊ณผ์ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ๋ค : ์ด๋ก์ LED ์ ๋ฑ
- LED๋ ์ด์ ์์ ์์ผ๋ฅผ ๊ฐ๋ฆด ์ ์๊ธฐ ๋๋ฌธ์ ์กฐ๋์ผ์๋ฅผ ์ด์ฉํ์ฌ ์ฐจ ๋ด๋ถ ๋น ๋ฐ๊ธฐ์ ๋ฐ๋ผ LED์ ๋ฐ๊ธฐ๊ฐ ์กฐ์ ๋๋ค.
- ๋ธ๋ฃจํฌ์ค ํต์ ์ผ๋ก, ์ ๋ฑ๋๋ LED ๊ฑฐ๋ฆฌ์ ๋ฌผ๋ฆฌ์ ์ธ ๊ธฐ์ค๊ฐ์ ๋ฐ๊พธ์ด ์ฌ์ฉ์๊ฐ ์ปค์คํฐ๋ง์ด์ง ํ ์ ์๋ค.
- ์ฐจ์ ์ฅ์ ๋ฌผ๊ณผ์ ์ถฉ๋์ด ์ผ์ด๋ **์์ (๋ ์ง, ์๊ฐ)**์ ์ ์ฅํ๊ณ ๋ธ๋ฃจํฌ์ค ํต์ ์ ํตํ์ฌ ํธ๋ํฐ์ผ๋ก ์๋ฆผ์ ์ ์กํ๋ค.
- ์ด์ํ ์ผ์
- ์กฐ๋ ์ผ์
- LCD ํจ๋
- ๋ธ๋ฃจํฌ์ค ๋ชจ๋(HC-06)
- LED
- ํ๋ก์ ํธ ๋ฐฐ๊ฒฝ
- ์ข์ ๊ธธ์ ์ด์ ํ ๋ ๋ถ์ํ ๋ง์์ ๊ฐ์ง๊ฒ ๋๋ค.
- ์ด์ ์ด ๋ฏธ์ํ๋ค๋ฉด ๋ณธ์ธ ์ฐจ์ ํฌ๊ธฐ์ ๋ถํผ๋ฅผ ๊ฐ๋ ํ๊ธฐ ์ด๋ ต๋ค.
- ๋ฌธ์ฝ์ด๋ ๊ธํ๊ณผ ๊ฐ์ ์ฌ๊ณ ๊ฐ ๋ ๋ชฐ๋ ์ผ์ด๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
- ๋ฌธ์ ์ ์
- ๊ธฐ์กด ์ฐจ๋๋ค์ ์๋ฆฌ๋ฅผ ํตํด ์ฅ์ ๋ฌผ๊ณผ ๊ฑฐ๋ฆฌ๋ฅผ ์๋ ค์ฃผ์ง๋ง ๋ฌผ๋ฆฌ์ ์ธ ๊ฑฐ๋ฆฌ๋ฅผ ์ ๊ณตํด์ฃผ์ง ์๋๋ค.
- ๊ตํต์ฌ๊ณ ๊ฐ ์๋์ด์ ์ฐจ์ ์์์ ์ธ์ ์ด๋์ ์ผ์ด๋ฌ๋์ง ์๊ธฐ๊ฐ ์ด๋ ค์ ์ถฉ๋์๊ฐ์ ๊ธฐ๋กํ ํ์๊ฐ ์๋ค.
- ํ๋ก์ ํธ ๋ชฉํ
- ์๋์ด๋ ธ๋ฅผ ํ์ฉํ ์๋์ฐจ ๊ธํ ๋ฐฉ์ง๋ฅผ ์ํด ๋ฌผ์ฒด ๊ฐ ๊ฑฐ๋ฆฌ ํ์ง ๋ฐ ๊ฒฝ๊ณ ์๋ฆผ ํด๋ํฐ ์ ์ก ์์คํ ๊ฐ๋ฐ
- ์๋์ด๋
ธ ํ๋ก ๊ตฌ์ฑ
- ํ๋กํ ํ์์ ํด๊ฒฐํ๊ธฐ์ํ ํ๋ค์ด ์ ํญ ์ฑํ
- ์ง๊ด์ ์ธ ์ํฉ(Press : HIGH)์ ์ํด ํ๋ค์ด ์ ํญ ์ฌ์ฉ
- ์๋์ด๋
ธ ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ฐ
- ์กฐ๋์ผ์์ sensing ๊ฐ์ ์ญ๋งคํ, PWM ์ ํตํ ๋ฐ๊ธฐ์ ์ด
- ์ฝ๋์ ํจ์ํ๋ฅผ ํตํ ์ํํ ๋๋ฒ๊น ํ๊ฒฝ ์กฐ์ฑ
- ์ค์์น์ ๋ฐ์ด์ฑ ํ์์ ํด๊ฒฐํ๊ธฐ์ํ ๋ก์ง ๊ตฌํ
- LCD ๊ฐ์ฒด ์์ฑ ๋ฐ ๊ฒฐ๊ณผ ์๊ฐํ
- ๋ธ๋ฃจํฌ์ค ๊ธฐ๋ฐ ๋น ๋๊ธฐ์ ํต์ ๊ตฌํ
- ๋ธ๋ฃจํฌ์ค ํต์ ์ ํตํ ๋ช ๋ น์ด๊ธฐ๋ฐ ์์คํ ์ ์ด
- ๋ธ๋ฃจํฌ์ค ํต์ ๊ธฐ๋ฐ ์ถฉ๋ ๊ฐ์ง ๋ชจ๋ํฐ๋ง
- ํ๋ก์์์์ ํ๊ณ(๋ฐ์ด์ฑ ํ์)๋ฅผ ํ๋ก๊ทธ๋๋ฐ ์ฝ๋๋ก ํด๊ฒฐ ํ ์ ์๋ ๋ฒ์ ๋ฐฐ์ฐ๊ฒ ๋จ
- IoT๋ฅผ ํ์ฉํ๊ฒ ํ๋์จ์ด๋ฅผ ์ ์ฐํ๊ฒ ์ปจํธ๋กคํ ์ ์๊ฒ ๋์ด ์ ์ง ๋ฐ ๋ณด์๊ฐ ๊ฐํธํด์ง์ ์๊ฒ ๋จ.
- ์ผ์ฑ๋ data๋ฅผ ์์ง, ์ ์ฒ๋ฆฌ ๋ถ์์ ํตํด ์๋น์คํ๋ฅผ ํ ์ ์๋ ์ญ๋ ๊ฐํ
-
์ด์ํ์ผ์๋ฅผ ์ด์ฉํ์ฌ ์ฝ์ ๊ฐ์ด 0์ผ ๊ฒฝ์ฐ โ์ถฉ๋ ํ๋ค" ๋ผ๊ณ ํ๋จํ๊ณ ์ด ํ๋ก์ ํธ๋ฅผ ์งํ ํ์์ผ๋, ์ด์ํ์ผ์๋ ๊ฑฐ๋ฆฌ๊ฐ 0์ธ ์ํ๋ฅผ ์ ์ก์๋ด์ง ๋ชปํ์๋ค.
โ ๋ณธ์ธ์ ๊ฑฐ๋ฆฌ๊ฐ 5cm ๋ฏธ๋ง์ผ์ โ์ถฉ๋ํ๋ค"๋ผ๊ณ ๊ฐ์ ํ๊ณ ์ด ํ๋ก์ ํธ๋ฅผ ์งํํ๊ฒ ๋์๋ค.
-
์กฐ๋ ์ผ์๋ฅผ ํตํด ์ป์ ๊ฐ์ ์ญ ๋งคํํ์ฌ LED์ ๋ฐ๊ธฐ๋ฅผ ์ ์ด ํ์ผ๋, ์กฐ๋ ์ผ์์ ๋ถ๋์ผ๋ก ํ์ฌ ์กฐ๋๊ฐ์ ์ ์ฝ์ด๋ด์ง ๋ชปํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ค.
โ ๊ทน๋จ์ ์ธ ์กฐ๋ ์ผ์ฑ๊ฒฐ๊ณผ๋ LED ๋ฐ๊ธฐ ์ฐจ์ด๋ฅผ ๋ณด์ฌ์ฃผ์๊ธฐ ๋๋ฌธ์ ํ์ง ์ข์ ์กฐ๋์ผ์๋ฅผ ์ด์ฉํด์ผ๋ง ํ๋ค.
#include <Wire.h>
#include <SoftwareSerial.h> // ๋ธ๋ฃจํฌ์ค
#include <hd44780.h> // lcd
#include <hd44780ioClass/hd44780_I2Cexp.h> //lcd
#include <core_build_options.h>
#include <swRTC.h> // ์๊ฐ๋ชจ๋
swRTC rtc; //ํด๋์ค ๊ฐ์ฒด ์ ์ธ
hd44780_I2Cexp lcd; // lcd ๊ฐ์ฒด ์์ฑ
unsigned int trigPin = 11; // trig
unsigned int echoPin = 12; // echo
#define button 2 // ๋ฒํผ ์ฐ๊ฒฐ ํ
int red_led = 10; // ๋นจ๊ฐ์ led ํ ๋ฒํธ
int yellow_led = 4; // ๋
ธ๋์ led ํ๋ฒํธ
int green_led = 13; // ์ด๋ก์ led ํ๋ฒํธ
// ๋๋ฐ์ด์ฑ์ ์ํ ๋ณ์
int cur = 0; // current
int before = 0;
int state = 0;
int cnt = 0; // count
long distance; // lcd์ ํ์๋ ๊ธธ์ด
long timeDistance;
String input = ""; //input ์ด๊ธฐํ
String get_string(String input);
int d_red = 10; // ๋นจ๊ฐ๋ถ์ด ์ผ์ง ์กฐ๊ฑด(๊ฑฐ๋ฆฌ๊ฐ 10 ๋ฏธ๋ง์ผ๋)
int d_yellow = 50; // ๋
ธ๋๋ถ์ด ์ผ์ง ์กฐ๊ฑด( ๊ฑฐ๋ฆฌ๊ฐ 50 ๋ฏธ๋ง์ผ๋)
boolean key1 = true;
boolean key2 = true;
boolean key3 = true;
void setup(){
Serial.begin(9600);
Serial1.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(button, INPUT);
lcd.init(); // lcd ์ด๊ธฐํ
lcd.backlight();
pinMode(yellow_led, OUTPUT);
pinMode(red_led,OUTPUT);
pinMode(green_led,OUTPUT);
digitalWrite(red_led, LOW);
digitalWrite(green_led, LOW);
rtc.stopRTC(); //์ ์ง
rtc.setTime(02, 15, 30); //์, ๋ถ, ์ด
rtc.setDate(12, 6, 2021); //์ผ, ์, ๋
rtc.startRTC(); //์์
}
void loop(){
input = get_string(input);
if(input == "reset"){
d_yellow = 50; // ๋
ธ๋๋ถ์ด ๊บผ์ง๋ ๊ฑฐ๋ฆฌ๊ฐ 50cm๋ก ์ฌ ์ด๊ธฐํ
d_red = 10; // ๋นจ๊ฐ๋ถ์ด ๊บผ์ง๋ ๊ฑฐ๋ฆฌ๊ฐ 10cm๋ก ์ฌ ์ด๊ธฐํ
}else if( input.substring(0,1) == "y"){ // ๋ช
๋ น์ด์ ์ฒซ๋ฒ์จฐ ๊ธ์๊ฐ y์ผ ๊ฒฝ์ฐ
// ๋ช
๋ น์ด๊ฐ y๋ก ์์ํ๋ฉด์ ๋ฐ๋๋ ์์น๊ฐ์ด d_red๋ณด๋ค ํด ๊ฒฝ์ฐ!(๋
ธ๋๋ถ์ ๋ฑ ๊ฑฐ๋ฆฌ๊ฐ ๋นจ๊ฐ๋ถ ์ ๋ฑ ๊ฑฐ๋ฆฌ๋ณด๋ค ์งฆ์ ์ ์๊ธฐ๋๋ฌธ)
if(input.substring(1).toInt() > d_red){
d_yellow = input.substring(1).toInt(); // ๋ช
๋ น์ด์ ์ซ์๋งํผ์ ๊ฑฐ๋ฆฌ๊ฐ์ผ๋ก ๋ณํํจ
key1 = true;
}else if(key1 && key2){ // yellow์ ๊ฑฐ๋ฆฌ๊ฐ์ด red๋ณด๋ค ์์์ง๊ฒฝ์ฐ(๋ง์ด ์๋๋ ์ํฉ)
Serial1.print(d_red);
Serial1.write("๋ณด๋ค ํฌ๊ฒ ์
๋ ฅํ์
์ผ ํฉ๋๋ค.\n");
key1 = false;
}
}else if(input.substring(0,1) =="r" ){ // ๋ช
๋ น์ด์ ์ฒซ๋ฒ์จฐ ๊ธ์๊ฐ r์ผ ๊ฒฝ์ฐ
// ๋ช
๋ น์ด๊ฐ r๋ก ์์ํ๋ฉด์ ๋ฐ๋๋ ์์น๊ฐ์ด d_yellow๋ณด๋ค ์์ ๊ฒฝ์ฐ๋ง!( ๋นจ๊ฐ๋ถ ์ ๋ฑ๊ฑฐ๋ฆฌ๊ฐ ๋
ธ๋๋ถ ์ ๋ฑ๊ฑฐ๋ฆฌ๋ณด๋ค ํด ์ ์๋ค.)
if(input.substring(1).toInt() < d_yellow){
d_red = input.substring(1).toInt(); // ๋ช
๋ น์ด์ ์ซ์๊ฐ์ผ๋ก ๋นจ๊ฐ๋ถ์ด ์ ๋ฑ๋ ๊ฑฐ๋ฆฌ๊ฐ ์ด๊ธฐํ
key2 = true;
}else if (key1 && key2){ // red์ ๊ฑฐ๋ฆฌ๊ฐ์ด yellow์ ๊ฑฐ๋ฆฌ๊ฐ๋ณด๋ค ์ปค์ง๊ฒฝ์ฐ ( ๋ง์ด ์๋๋ ๊ฒฝ์ฐ)
Serial1.print(d_yellow);
Serial1.write("๋ณด๋ค ์๊ฒ ์
๋ ฅํ์
์ผ ํฉ๋๋ค.\n");
key2 = false;
}
}
int cur = digitalRead(button); // ๋ฒํผ์ ์ํ ๊ฒ์ฌ
// ๋๋ฐ์ด์ฑ ํด๊ฒฐ
if(cur != before){
delay(5);
cur = digitalRead(button);
}
if( cur == HIGH && before == LOW){
state != state;
Serial.println("๋ฐ๋");
cnt+=1; // ๋ฒํผ ํด๋ฆญ๋น cnt๊ฐ 1์ฉ ์ฆ๊ฐ
}
before = cur;
// Serial.print(cnt);
// cnt๊ฐ ์ง์์ผ๋ ํ์์ผ๋ ๋๋์ด์ ๊ธฐ๋ฅ ์คํ
if(cnt%2==0){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("PRESS BUTTON");
lcd.setCursor(0,1);
lcd.print("FOR DISTANCE");
delay(200);
digitalWrite(red_led, LOW);
digitalWrite(green_led, LOW);
}else{
showDistance(); // ๊ฑฐ๋ฆฌ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ฉ์๋
showLight(); // ๋น์ ๋ณด์ฌ์ฃผ๋ ๋ฉ์๋
}
}
// ๋ฒํผ์ผ๋ก ์ ์ดํ๊ธฐ์ํด ํจ์๋ก ์์ฑ
void showDistance(){
digitalWrite(trigPin, LOW);// trigํ์์ ์ด์ํ ๋ด๋ณด๋ ์ผ๋จ low๋ก ์ด๊ธฐํํจ
delayMicroseconds(2); //2 microsecond๋์ ์ ๊น delay
digitalWrite(trigPin, HIGH); // ์ด์ํ๋ฅผ ๋ด๋ณด๋ด๊ธฐ์ํด HIGH
delayMicroseconds(10); // 10 microsecond๋์ ์ ๊น delay
digitalWrite(trigPin, LOW); // ์ด์ ๊ทธ๋ง ๋ด๋ณด๋ด๊ธฐ ์ํด LOW๋ก ๋ค์ ๋ฐ๊ฟ์ค
if( digitalRead(echoPin) == LOW){
// ์ด์ํ์ผ์ ๊ฐ๋ค๊ฐ ๋ค์ ๋์์ค๊ธฐ๋๋ฌธ์ 2๋ก ๋๋์ด์ค, 1cm ์ด๋ํ๋๋ฐ ๊ฑธ๋ฆฌ๋์๊ฐ 29.41us
distance = (float)pulseIn(echoPin, HIGH)/29/2;
}else{
pinMode(echoPin, OUTPUT);
digitalWrite(echoPin, LOW);
pinMode(echoPin, INPUT);
}
if( distance <= 3){
time(); // ํ์ฌ์ ์๊ฐ ์ถ๋ ฅ
Serial.write(" ์ถฉ๋ํ์์ต๋๋ค\n"); // ์ถฉ๋๋ฉ์ธ์ง ์ ๋ฌ
Serial1.write(" ์ถฉ๋ํ์์ต๋๋ค\n");
}
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Distance : ");
lcd.setCursor(0,1);
lcd.print(distance);
lcd.print("cm");
delay(500); // 0.5์ด๋ง๋ค ์ซ์ ๋ฐ๋๋๋ก
}
void showLight(){
/*
* 100 ๋ฐ์
* 400 ํ์ ํ๊ด๋ฑ
* 800 ์ด๋์
*/
int cds = analogRead(A1); // ํ์ฌ์ ์กฐ๋๊ฐ์ ์ฝ์ด์ด
int bright = map(cds, 0, 1023, 255, 0); // ์ด๋์์ง๋ฉด LED๋ ์ด๋์์ง๊ฒ ์ญ๋งคํ
// Serial.println(cds);
if (distance < d_red){
// ๊ฑฐ๋ฆฌ๊ฐ d_red ๋ฏธ๋ง์ผ์ ๋นจ๊ฐ๋ถ ํ์ํ๋๋ฐ ํ์ฌ ๋ฐ๊ธฐ์ ๊ณ ๋ คํ์ฌ ๋น ๋ฐ๊ด
analogWrite(red_led, bright); // ํ์ฌ ์กฐ๋๊ฐ์ ๋ฐ๋น๋กํ์ฌ ๋ฐ๊ธฐ ์กฐ์
digitalWrite(green_led, LOW);
digitalWrite(yellow_led,LOW);
}else if(distance < d_yellow){
// // ๊ฑฐ๋ฆฌ๊ฐ d_red ์ด๊ณผ d_yellow ์ด์์ผ์ ๋
ธ๋๋ถ ํ์, ํ์ฌ ๋ฐ๊ธฐ์ ๊ณ ๋ คํ์ฌ ๋น ๋ฐ๊ด
analogWrite(yellow_led, bright);// ํ์ฌ ์กฐ๋๊ฐ์ ๋ฐ๋น๋กํ์ฌ ๋ฐ๊ธฐ ์กฐ์
digitalWrite(green_led, LOW);
digitalWrite(red_led, LOW);
}else{
// ๊ฑฐ๋ฆฌ๊ฐ d_yellow ์ด์์ผ์ ์ด๋ก๋ถ ํ์, ํ์ฌ ๋ฐ๊ธฐ์ ๊ณ ๋ คํ์ฌ ๋น ๋ฐ๊ด
digitalWrite(red_led, LOW);
analogWrite(green_led, bright);// ํ์ฌ ์กฐ๋๊ฐ์ ๋ฐ๋น๋กํ์ฌ ๋ฐ๊ธฐ ์กฐ์
digitalWrite(yellow_led, LOW);
}
delay(100);
}
String get_string(String input){
String inputString = ""; // ์๋ฌด๊ฒ๋ ์
๋ ฅํ์ง ์์์ ๋ ๋น ๋ฌธ์์ด
while(Serial1.available()) { // ๋ธ๋ฃจํฌ์ค ํต์ ์ ๋ฐ์ดํฐ๊ฐ ์
๋ ฅ๋๋ฉด(์ค๋งํธํฐ -> ์๋์ด๋
ธ)
delay(3); // ๋ฐ์ดํฐ ์์ ์ด ์ ์ด๋ฃจ์ด์ง๊ธฐ ์ํด 3ms ๊ธฐ๋ค๋ฆผ
if (Serial1.available() >0) { // ์์ ๋ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด
char c = Serial1.read(); // ์์ ๋ ๋ฐ์ดํฐ 1๊ฐ๋ฅผ ๋ฐ์ c๋ก ์ ์ฅ(์ดํ์๋ ๊ทธ๋ค์๊ฑธ ๋ฐ์ c๋ก ์ ์ฅ
inputString += c; // ์์ ๋ ๋ฐ์ดํฐ๋ฅผ c์ ๋ถ์.
}
}
if(inputString.length() == 0) return input; // ๋ฌธ์์ด ๊ธธ์ด๊ฐ 0์ด๋ฉด(๋ฐ์ดํฐ๋ฅผ ์
๋ ฅ๋ฐ์ง ์์๋ค๋ฉด) ๊ธฐ์กด์ ๊ฐ์ ๋ฐํ
else return inputString; // ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅ๋ฐ์๋ค๋ฉด ํด๋น ๋ฌธ์์ด์ ์ถ๋ ฅ
}
// ํ์ฌ ์๊ฐ ์ถ๋ ฅํจ์
void time(){
Serial1.print(rtc.getYear(), DEC); // ์ฐ๋
Serial1.print("/");
Serial1.print(rtc.getMonth(), DEC); // ์
Serial1.print("/");
Serial1.print(rtc.getDay(), DEC); // ์ผ
Serial1.print("\t");
Serial1.print(rtc.getHours(), DEC); // ์
Serial1.print(":");
Serial1.print(rtc.getMinutes(), DEC); // ๋ถ
Serial1.print(":");
Serial1.print(rtc.getSeconds(), DEC); // ์ด
}