#include <AccelStepper.h>
#define SWITCH_COVERUP 5
#define SWITCH_SOLENOID 18
#define DIR_PIN 2
#define STEP_PIN 4
#define SLEEPHIGH_PIN 15
#define SOLENOID_PIN 19
AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);
bool coverUpPressed = false;
bool coverUpPrevState = false;
bool solenoidActivated = false;
bool solenoidPrevState = false;
unsigned long coverUpStartTime = 0;
unsigned long solenoidStartTime = 0;
unsigned long solenoidDuration = 1000; // Duration for which the solenoid remains active in milliseconds
bool solenoidTimerStarted = false;
unsigned long solenoidTimerStartTime = 0; // Timer start time for the solenoid
bool sleepActive = false;
bool sleepTimerStarted = false;
unsigned long sleepStartTime = 0;
unsigned long sleepDuration = 5000; // Duration for which the sleep mode remains active in milliseconds
void setup() {
pinMode(SWITCH_COVERUP, INPUT_PULLUP);
pinMode(SWITCH_SOLENOID, INPUT_PULLUP);
pinMode(SLEEPHIGH_PIN, OUTPUT);
pinMode(SOLENOID_PIN, OUTPUT);
stepper.setMaxSpeed(5000);
stepper.setAcceleration(2500);
}
void loop() {
bool currentCoverUpState = !digitalRead(SWITCH_COVERUP);
bool currentSolenoidState = !digitalRead(SWITCH_SOLENOID);
unsigned long currentMillis = millis();
// Handle cover opening and closing
if (currentCoverUpState && !coverUpPressed) {
coverUpPressed = true;
coverUpStartTime = currentMillis;
stepper.moveTo(4675);
} else if (!currentCoverUpState && coverUpPressed) {
coverUpPressed = false;
stepper.moveTo(0);
}
// Check if the cover action duration has elapsed
if (coverUpPressed && currentMillis - coverUpStartTime >= 1000) {
coverUpPressed = false;
stepper.moveTo(0);
}
// Handle solenoid activation at rising edge
if (currentSolenoidState && !solenoidPrevState && !solenoidActivated) {
solenoidStartTime = currentMillis;
solenoidActivated = true;
digitalWrite(SOLENOID_PIN, HIGH);
}
// Check if the solenoid duration has elapsed
if (solenoidActivated && currentMillis - solenoidStartTime >= solenoidDuration) {
solenoidActivated = false;
digitalWrite(SOLENOID_PIN, LOW);
}
// Handle sleep mode
if (currentCoverUpState && !coverUpPrevState && !sleepTimerStarted) {
sleepTimerStarted = true;
sleepStartTime = currentMillis;
digitalWrite(SLEEPHIGH_PIN, HIGH);
}
// Check if the sleep duration has elapsed
if (sleepTimerStarted && currentMillis - sleepStartTime >= sleepDuration) {
sleepTimerStarted = false;
digitalWrite(SLEEPHIGH_PIN, LOW);
}
// Update previous coverUp state
coverUpPrevState = currentCoverUpState;
// Update previous solenoid state
solenoidPrevState = currentSolenoidState;
stepper.run();
}