Cílem projektu bylo vytvořit inteligentní systém, který detekuje otevřené a zavřené dveře na základě senzoru detekce překážek a umožňuje manuální ovládání pomocí tlačítek. Tento systém je navržen tak, aby zlepšil bezpečnost a kontrolu přístupu do prostorů, kde se pohybuje VZV, aby byl řidič VZV informován zvukovou signalizací o přítomnosti osoby v konkrétním sektoru.
Schéma zapojení:
- Arduino Pin 2 -> Relé IN
- Arduino Pin 3 -> Signálový pin IR senzoru
- Arduino Pin 4 -> Jeden pin tlačítka pro otevření (openbutton)
- Arduino Pin 5 -> Jeden pin tlačítka pro zavření (closebutton)
- Arduino Pin 6 -> Rezistor -> Anoda LED2
- Arduino Pin 7 -> Rezistor -> Anoda LED1
- Arduino Pin 8 -> IN1 na ULN2003
- Arduino Pin 9 -> IN2 na ULN2003
- Arduino Pin 10 -> IN3 na ULN2003
- Arduino Pin 11 -> IN4 na ULN2003
Kód pro Arduino:
#include <Arduino.h>
const int rele1 = 2;
const int IR = 3;
const int led1 = 7;
const int led2 = 6;
const int IN1 = 8;
const int IN2 = 9;
const int IN3 = 10;
const int IN4 = 11;
const int openbutton = 4;
const int closebutton = 5;
int lastsensorState = HIGH;
const int stepsPerRevolution = 2048; // Počet kroků pro úplnou otáčku (pro 24BYJ48)
const int stepsForOpen = 512; // Upravit podle mechaniky dveří
const int stepsForClose = 512; // Upravit podle mechaniky dveří
unsigned long lastDebounceTimeOpen = 0; // čas posledního stisku openbutton
unsigned long lastDebounceTimeClose = 0; // čas posledního stisku closebutton
const unsigned long debounceDelay = 50; // zpoždění pro debouncing v milisekundách
int lastButtonOpenState = HIGH; // poslední stav tlačítka openbutton
int lastButtonCloseState = HIGH; // poslední stav tlačítka closebutton
// deklarace funkcí
void stepForward();
void stepBackward();
void moveMotor(int steps, bool direction);
void setup() {
Serial.begin(9600);
pinMode(rele1, OUTPUT);
pinMode(IR, INPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(openbutton, INPUT_PULLUP);
pinMode(closebutton, INPUT_PULLUP);
}
void loop() {
int sensorState = digitalRead(IR);
int buttonOpenState = digitalRead(openbutton);
int buttonCloseState = digitalRead(closebutton);
if (sensorState == HIGH) {
digitalWrite(rele1, LOW);
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
} else {
digitalWrite(rele1, HIGH);
digitalWrite(led1, LOW);
digitalWrite(led2, HIGH);
}
// Výpis změny stavu na sériový monitor z IR senzoru
if (sensorState == HIGH & lastsensorState == LOW) {
Serial.println("Open door");
}
if (sensorState == LOW & lastsensorState == HIGH) {
Serial.println("Closed door");
}
lastsensorState = sensorState;
// Debouncing pro openbutton
if (buttonOpenState != lastButtonOpenState) {
lastDebounceTimeOpen = millis(); // reset debounce časovače
}
if ((millis() - lastDebounceTimeOpen) > debounceDelay) {
if (buttonOpenState == LOW) {
digitalWrite(rele1, LOW);
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
Serial.println("Manual door opening");
moveMotor(stepsForOpen, true);
}
}
lastButtonOpenState = buttonOpenState;
// Debouncing pro closebutton
if (buttonCloseState != lastButtonCloseState) {
lastDebounceTimeClose = millis(); // reset debounce časovače
}
if ((millis() - lastDebounceTimeClose) > debounceDelay) {
if (buttonCloseState == LOW) {
Serial.println("Manual door closing");
moveMotor(stepsForClose, false);
}
}
lastButtonCloseState = buttonCloseState;
}
// funkce pro ovládání krokového motoru
void moveMotor(int steps, bool direction) {
for (int i = 0; i < steps; i++) {
if (direction) {
stepForward();
} else {
stepBackward();
}
delay(1); // Nastavení rychlosti krokování (upravit podle potřeby)
}
}
// Sekvence pro krokování dopředu
void stepForward() {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
delay(2);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
delay(2);
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
delay(2);
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
delay(2);
}
// Sekvence pro krokování dozadu
void stepBackward() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
delay(2);
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
delay(2);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
delay(2);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
delay(2);
}