#include <Stepper.h>
// =========================
// Кроковий двигун
// =========================
const int stepsPerRevolution = 200;
// Скільки кроків потрібно, щоб повністю відкрити/закрити
const int stepsToMove = 200;
Stepper myStepper(
stepsPerRevolution,
8, 9, 10, 11
);
// =========================
// LDR
// =========================
const int ldrPin = A1;
const int ldrThreshold = 500;
// =========================
// Світлодіоди
// =========================
const int greenLED = 3; // відкрито (є освітлення)
const int redLED = 2; // закрито (немає освітлення)
// Поточний стан механізму
bool isOpen = false;
// =========================
// Допоміжні функції
// =========================
void openStep() {
myStepper.step(stepsToMove); // рух в один бік
digitalWrite(redLED, LOW);
digitalWrite(greenLED, HIGH);
isOpen = true;
Serial.println("OPEN -> green LED");
}
void closeStep() {
myStepper.step(-stepsToMove); // рух у зворотний бік
digitalWrite(greenLED, LOW);
digitalWrite(redLED, HIGH);
isOpen = false;
Serial.println("CLOSED -> red LED");
}
// =========================
// SETUP
// =========================
void setup() {
myStepper.setSpeed(50);
pinMode(greenLED, OUTPUT);
pinMode(redLED, OUTPUT);
// На старті вважаємо, що закрито
digitalWrite(greenLED, LOW);
digitalWrite(redLED, HIGH);
Serial.begin(9600);
}
// =========================
// LOOP
// =========================
void loop() {
int ldrValue = analogRead(ldrPin);
// Є освітлення, якщо значення вище порогу
bool lightPresent = ldrValue < ldrThreshold;
Serial.print("LDR: ");
Serial.print(ldrValue);
Serial.print(" | Light: ");
Serial.println(lightPresent ? "YES" : "NO");
// Є світло, а було закрито -> відкриваємо
if (lightPresent && !isOpen) {
delay(100);
if (analogRead(ldrPin) < ldrThreshold) { // було >
openStep();
delay(500);
}
}
// Світла немає, а було відкрито -> закриваємо
else if (!lightPresent && isOpen) {
delay(100);
if (analogRead(ldrPin) >= ldrThreshold) { // було <=
closeStep();
delay(500);
}
}
delay(50);
}