#include <Stepper.h>
// 스텝모터 설정
const int stepsPerRevolution = 200;
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
// 센서 핀
const int sensorLeft = 2;
const int sensorRight = 3;
// 이전 상태 저장
int prevLeft = LOW;
int prevRight = LOW;
// 상태 플래그
bool reversing = false;
unsigned long reverseStartTime = 0;
void setup()
{
    pinMode(sensorLeft, INPUT);
    pinMode(sensorRight, INPUT);
    Serial.begin(9600);
    Serial.println("[SETUP] Serial started, initializing stepper and sensors");
    myStepper.setSpeed(7); // 속도 설정
    Serial.print("[SETUP] Stepper speed set to ");
    Serial.println(7);
    Serial.print("[SETUP] Sensor pins: Left=");
    Serial.print(sensorLeft);
    Serial.print(", Right=");
    Serial.println(sensorRight);
    Serial.println("[SETUP] Initial state: prevLeft=LOW, prevRight=LOW, reversing=false");
}
// 가상 센서 신호 생성 함수
int getVirtualSensorLeft()
{
    unsigned long t = millis() / 5000;
    return (t % 2 == 0) ? LOW : HIGH;
}
int getVirtualSensorRight()
{
    // Left와 항상 같은 값 반환
    return getVirtualSensorLeft();
}
void loop()
{
    // 실제 센서 대신 가상 신호 사용
    int left = getVirtualSensorLeft();
    int right = getVirtualSensorRight();
    Serial.print("[LOOP] Virtual Sensor: LEFT=");
    Serial.print(left);
    Serial.print(" | RIGHT=");
    Serial.println(right);
    // 1. 둘 다 LOW -> HIGH로 바뀌는 순간 감지 -> 정회전
    if (prevLeft == LOW && prevRight == LOW && left == HIGH && right == HIGH)
    {
        Serial.println("[EVENT] 양발 감지: 정회전 시작");
        Serial.print("[ACTION] Stepper forward: steps=");
        Serial.println(stepsPerRevolution);
        myStepper.step(stepsPerRevolution); // 정회전 1바퀴
        Serial.println("[ACTION] Stepper forward complete");
        Serial.println("[ACTION] Delay 5초 (5000ms) 시작");
        delay(5000); // 잠깐 멈춤
        Serial.println("[ACTION] Delay 5초 (5000ms) 종료");
    }
    // 2. 둘 다 HIGH -> LOW로 바뀌는 순간 감지 -> 역회전
    if (prevLeft == HIGH && prevRight == HIGH && left == LOW && right == LOW)
    {
        Serial.println("[EVENT] 양발 해제: 역회전 시작");
        Serial.print("[ACTION] Stepper reverse: steps=-");
        Serial.println(stepsPerRevolution);
        myStepper.step(-stepsPerRevolution); // 역회전 1바퀴
        Serial.println("[ACTION] Stepper reverse complete");
        Serial.println("[ACTION] Delay 5초 (5000ms) 시작");
        delay(5000); // 잠깐 멈춤
        Serial.println("[ACTION] Delay 5초 (5000ms) 종료");
    }
    // 현재 상태를 이전 상태로 업데이트 (항상 loop 마지막에 위치)
    prevLeft = left;
    prevRight = right;
    Serial.print("[STATE] prevLeft=");
    Serial.print(prevLeft);
    Serial.print(", prevRight=");
    Serial.println(prevRight);
    Serial.println("[ACTION] Delay 1초 (1000ms) 시작");
    delay(1000); // polling 속도
    Serial.println("[ACTION] Delay 1초 (1000ms) 종료");
}
// [출처] 적외선 센서&스텝모터 코드 관련.. 미치겠습니다 (아두이노  스토리) | 작성자 13579123