/*
  이게 코드인데요

  지금 까지 한거는

  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 ~~~");
    }
}