/*
이게 코드인데요
지금 까지 한거는
1.버튼 누르면 led와 부저 상태를 켠다.
2.켠상태에서 초음파센서기준으로 일정거리(35cm)이상 떨어지면 led가 켜지고 부저가 울리며, 그 이하면 led가 꺼지고 부저가 울리지 않는다.
3."2"의 상태에서 버튼한번 더 누르면 led, 부저 상태가 꺼진다.
그외 일정시간동안"2"의 상태가 유지되면 둘다 꺼진다를 만들고싶은데 이게 더 어려운거 같아요
나머지 lcd모니터에 값 나타내고,전원공급장치는 하겠는데..
코딩들은 8월 초부터 구글에서 검색하고 지식인에 물어보고 부품 구해서 적용한것들입니다
[출처] 이 상태에서 일정시간동안 있으면 자동으로 꺼지게하고싶습니다. (아두이노 스토리) | 작성자 마이아두이노
상태머신 처럼 순서도 그려보기
idle 상태 1
버튼 눌림 체크 -> 버튼 눌림 1/2 -> led , buzzer on 상태 2
초음파 거리 값에 따른 led , buzzer on / off 상태 3
버튼 눌림 체크가 되면 상태 3의 상태 상관없이 -> 버튼 눌림 2/2 -> led , buzzer off 상태 4
test 1 https://wokwi.com/projects/374586138478398465
https://wokwi.com/projects/374586264748979201
*/
// 초음파 센서 핀 상수 선언 ( 앞으로 상수는 대문자와 _로 표기)
const int TRIGER_PIN = 2; // 트리거 핀
const int ECHO_PIN = 4; // 에코 핀
// 부저와 LED 핀 상수 선언
const int BUZZER_PIN = 12; // 부저 핀
const int LED_PIN = 13; // LED 핀
// 버튼 핀 상수 선언
const int BUTTON_PIN = 8; // 버튼 핀
// 부저 , LED , 버튼 상태를 저장하는 변수들 선언
boolean buzzerOn = false;
boolean ledOn = false;
boolean currentBtnState = false;
boolean btnReleased = true;
void setup()
{
Serial.begin(9600);
pinMode(TRIGER_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
void loop()
{
// 버튼 눌렸는지 체크하는 함수
checkButton();
if (btnReleased == false)
{
// 초음파 센서 거리값 되돌려주는 함수
readUltrasonicDistance();
// 초음파 거리값이 35cm 미만일때 와 35cm 이상일때의 led , buzzer 상태를 변경하는 함수
changeBuzzerLedState();
}
}
// 버튼 눌렸는지 체크하는 함수
boolean checkButton()
{
int current_btnState = digitalRead(BUTTON_PIN);
if (current_btnState == LOW && btnReleased == true)
{
btnReleased = !btnReleased; // 버튼이 눌렸음을 알려주는 변수를 false로 변경
buzzerOn = !buzzerOn; // 부저 상태를 LOW -> HIGH로 변경
ledOn = !ledOn; // led 상태를 LOW -> HIGH로 변경
}
if (current_btnState == HIGH)
{
btnReleased = true;
}
return current_btnState;
}
// 초음파 센서 거리값 되돌려주는 함수
int readUltrasonicDistance()
{
digitalWrite(TRIGER_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGER_PIN, LOW);
int duration = pulseIn(ECHO_PIN, HIGH);
int distance = duration / 29 / 2;
return distance;
}
// 초음파 거리값이 35cm 미만일때 와 35cm 이상일때의 led , buzzer 상태를 변경하는 함수
void changeBuzzerLedState()
{
if (readUltrasonicDistance() >= 35 && buzzerOn && ledOn)
{
digitalWrite(BUZZER_PIN, buzzerOn);
digitalWrite(LED_PIN, ledOn); // LED 켜짐
Serial.print(readUltrasonicDistance());
Serial.println("cm true ~~~");
}
// 초음파 거리 값이 35cm 이하이고, 부저상태값이 LOW 이고 LED 상태값이 LOW 일 때
else
{
digitalWrite(BUZZER_PIN, buzzerOn);
digitalWrite(LED_PIN, ledOn); // LED 꺼짐
Serial.print(readUltrasonicDistance());
Serial.println("cm false ~~~");
}
}