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