301 lines
6.5 KiB
Arduino
301 lines
6.5 KiB
Arduino
|
/*
|
||
|
Hasenklappe
|
||
|
Author: dustinbrun
|
||
|
licensed under CC BY 4.0
|
||
|
Version 09.2022
|
||
|
|
||
|
Source 433Mhz Receiver: https://funduino.de/nr-03-433mhz-funkverbindung
|
||
|
|
||
|
|
||
|
------ Serial Communication, Baud: 9600 ------
|
||
|
- Request State of the Door: 'S'
|
||
|
- Returns: 1 - Door is open, 0 - Door is closed, 2 - Unknown Position
|
||
|
- Open Door: 'U'
|
||
|
- Returns: 'U'
|
||
|
- If it fails or not possible (already open): 'E'
|
||
|
- Open Door: 'D'
|
||
|
- Returns: 'D'
|
||
|
- If it fails or not possible (already closed): 'E'
|
||
|
- Stop Movement: 'H'
|
||
|
- Returns: 'H'
|
||
|
|
||
|
*/
|
||
|
|
||
|
|
||
|
#include "RCSwitch.h" // https://github.com/sui77/rc-switch
|
||
|
|
||
|
//Variables
|
||
|
int motor_timeout = 20000; //Motor stops after this limit (in ms) is reached, Maximum time for the Opening-/Closing- Process
|
||
|
int solenoid_on_time = 2000; //Time for the solenoid to be switched on (in ms) after the opening process was started. The door should exceed the solenoid position within this interval
|
||
|
|
||
|
//Remote Codes
|
||
|
long int remote_code_up = 5592512; //Received Remote Codes, to which the Arduino reacts to, change to the Values of your remote. You can read those code using the "ReceiveDemo_Simple.ino"-code from the rc-switch Library
|
||
|
long int remote_code_down = 5592368;
|
||
|
long int remote_code_stop = 5592332;
|
||
|
|
||
|
|
||
|
// Pins
|
||
|
const int button_down = 12;
|
||
|
const int button_up = 11;
|
||
|
const int button_stop = 10;
|
||
|
const int led_error = 9;
|
||
|
const int led_motor = 8;
|
||
|
const int led_power = 7;
|
||
|
const int motor_a = 6;
|
||
|
const int motor_b = 5;
|
||
|
const int limit_top = A1;
|
||
|
const int limit_bottom = A2;
|
||
|
const int remote_interrupt_pin = 0; // Interrupt-Pin 0 = Arduino Pin D2
|
||
|
const int lock_pin = 4;
|
||
|
|
||
|
|
||
|
unsigned long motor_start_time = 0;
|
||
|
bool go_up = false;
|
||
|
bool go_down = false;
|
||
|
bool stop = false;
|
||
|
|
||
|
RCSwitch remote = RCSwitch();
|
||
|
|
||
|
void setup()
|
||
|
{
|
||
|
Serial.begin(9600);
|
||
|
remote.enableReceive(remote_interrupt_pin);
|
||
|
|
||
|
pinMode(button_down, INPUT_PULLUP); //Pressed = LOW
|
||
|
pinMode(button_up, INPUT_PULLUP);
|
||
|
pinMode(button_stop, INPUT_PULLUP);
|
||
|
pinMode(led_error, OUTPUT);
|
||
|
pinMode(led_motor, OUTPUT);
|
||
|
pinMode(led_power, OUTPUT);
|
||
|
pinMode(motor_a, OUTPUT);
|
||
|
pinMode(motor_b, OUTPUT);
|
||
|
pinMode(lock_pin, OUTPUT);
|
||
|
pinMode(limit_top, INPUT_PULLUP); //Triggered = LOW
|
||
|
pinMode(limit_bottom, INPUT_PULLUP);
|
||
|
|
||
|
digitalWrite(motor_a, LOW);
|
||
|
digitalWrite(motor_b, LOW);
|
||
|
digitalWrite(lock_pin, LOW);
|
||
|
digitalWrite(led_error, HIGH);
|
||
|
digitalWrite(led_motor, HIGH);
|
||
|
digitalWrite(led_power, HIGH);
|
||
|
|
||
|
delay(200);
|
||
|
digitalWrite(led_error, LOW);
|
||
|
digitalWrite(led_motor, LOW);
|
||
|
|
||
|
//Serial.print("A");
|
||
|
}
|
||
|
|
||
|
void loop()
|
||
|
{
|
||
|
if ((digitalRead(button_down) == LOW || go_down) && digitalRead(limit_bottom) != LOW)
|
||
|
{
|
||
|
delay(100);
|
||
|
stop = false;
|
||
|
motor_start_time = millis();
|
||
|
motor_down();
|
||
|
|
||
|
while (digitalRead(limit_bottom) != LOW &&
|
||
|
millis() - motor_start_time < motor_timeout &&
|
||
|
stop != true)
|
||
|
{
|
||
|
check_messages();
|
||
|
delay(10);
|
||
|
}
|
||
|
|
||
|
motor_stop();
|
||
|
|
||
|
if ((millis() - motor_start_time >= motor_timeout) || stop == true)
|
||
|
{
|
||
|
digitalWrite(led_error, HIGH);
|
||
|
Serial.print("E");
|
||
|
delay(500);
|
||
|
digitalWrite(led_error, LOW);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
digitalWrite(led_error, LOW);
|
||
|
Serial.print(get_pos());
|
||
|
}
|
||
|
|
||
|
go_down = false;
|
||
|
stop = false;
|
||
|
delay(200);
|
||
|
}
|
||
|
else if ((digitalRead(button_down) == LOW || go_down) && digitalRead(limit_bottom) == LOW)
|
||
|
{
|
||
|
digitalWrite(led_error, HIGH);
|
||
|
Serial.print("E");
|
||
|
delay(500);
|
||
|
digitalWrite(led_error, LOW);
|
||
|
go_down = false;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
if ((digitalRead(button_up) == LOW || go_up) && digitalRead(limit_top) != LOW)
|
||
|
{
|
||
|
delay(100);
|
||
|
stop = false;
|
||
|
door_unlock();
|
||
|
motor_start_time = millis();
|
||
|
motor_up();
|
||
|
|
||
|
while (digitalRead(limit_top) != LOW &&
|
||
|
millis() - motor_start_time < motor_timeout &&
|
||
|
stop != true)
|
||
|
{
|
||
|
check_messages();
|
||
|
delay(10);
|
||
|
if(millis() - motor_start_time > solenoid_on_time)
|
||
|
{
|
||
|
door_lock();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
motor_stop();
|
||
|
door_lock();
|
||
|
|
||
|
if ((millis() - motor_start_time >= motor_timeout) || stop == true)
|
||
|
{
|
||
|
digitalWrite(led_error, HIGH);
|
||
|
Serial.print("E");
|
||
|
delay(500);
|
||
|
digitalWrite(led_error, LOW);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
digitalWrite(led_error, LOW);
|
||
|
Serial.print(get_pos());
|
||
|
}
|
||
|
|
||
|
go_up = false;
|
||
|
stop = false;
|
||
|
delay(200);
|
||
|
}
|
||
|
else if ((digitalRead(button_up) == LOW || go_up) && digitalRead(limit_top) == LOW)
|
||
|
{
|
||
|
digitalWrite(led_error, HIGH);
|
||
|
Serial.print("E");
|
||
|
delay(500);
|
||
|
digitalWrite(led_error, LOW);
|
||
|
go_up = false;
|
||
|
|
||
|
}
|
||
|
|
||
|
check_messages();
|
||
|
delay(10);
|
||
|
|
||
|
}
|
||
|
|
||
|
void check_messages()
|
||
|
{
|
||
|
if (Serial.available()) {
|
||
|
char serial_message = Serial.read();
|
||
|
led_power_blink();
|
||
|
|
||
|
if (serial_message == 'S') // Get State
|
||
|
{
|
||
|
Serial.print(get_pos()); // 1 - Door is open, 0 - Door is closed, 2 - Unknown Position
|
||
|
}
|
||
|
else if (serial_message == 'U')
|
||
|
{
|
||
|
go_up = true;
|
||
|
Serial.print("U");
|
||
|
}
|
||
|
else if (serial_message == 'D')
|
||
|
{
|
||
|
go_down = true;
|
||
|
Serial.print("D");
|
||
|
}
|
||
|
else if (serial_message == 'H')
|
||
|
{
|
||
|
stop = true;
|
||
|
Serial.print("H");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (remote.available())
|
||
|
{
|
||
|
long int remote_message = remote.getReceivedValue();
|
||
|
led_power_blink();
|
||
|
|
||
|
if (remote_message == remote_code_up)
|
||
|
{
|
||
|
go_up = true;
|
||
|
}
|
||
|
else if (remote_message == remote_code_down)
|
||
|
{
|
||
|
go_down = true;
|
||
|
}
|
||
|
else if (remote_message == remote_code_stop)
|
||
|
{
|
||
|
stop = true;
|
||
|
}
|
||
|
/*else // Unknown Code
|
||
|
{
|
||
|
digitalWrite(led_error, HIGH);
|
||
|
Serial.print("E");
|
||
|
delay(100);
|
||
|
digitalWrite(led_error, LOW);
|
||
|
}*/
|
||
|
|
||
|
remote.resetAvailable();
|
||
|
}
|
||
|
|
||
|
if (digitalRead(button_stop) == LOW)
|
||
|
{
|
||
|
stop = true;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
int get_pos()
|
||
|
{
|
||
|
if (digitalRead(limit_top) == LOW) return 1;
|
||
|
else if (digitalRead(limit_bottom) == LOW) return 0;
|
||
|
else return 2;
|
||
|
}
|
||
|
|
||
|
|
||
|
void motor_down()
|
||
|
{
|
||
|
digitalWrite(led_motor, HIGH);
|
||
|
digitalWrite(motor_a, LOW); //Motor going down
|
||
|
digitalWrite(motor_b, HIGH);
|
||
|
}
|
||
|
void motor_up()
|
||
|
{
|
||
|
digitalWrite(led_motor, HIGH);
|
||
|
digitalWrite(motor_a, HIGH); //Motor going up
|
||
|
digitalWrite(motor_b, LOW);
|
||
|
}
|
||
|
void motor_stop()
|
||
|
{
|
||
|
digitalWrite(led_motor, LOW);
|
||
|
digitalWrite(motor_a, LOW); //Motor stop
|
||
|
digitalWrite(motor_b, LOW);
|
||
|
}
|
||
|
|
||
|
void door_lock() //Normally closed Solenoid Lock
|
||
|
{
|
||
|
digitalWrite(lock_pin, LOW);
|
||
|
}
|
||
|
void door_unlock()
|
||
|
{
|
||
|
digitalWrite(led_motor, HIGH);
|
||
|
digitalWrite(lock_pin, HIGH);
|
||
|
delay(200);
|
||
|
digitalWrite(led_motor, LOW);
|
||
|
delay(200);
|
||
|
}
|
||
|
|
||
|
void led_power_blink()
|
||
|
{
|
||
|
digitalWrite(led_power, LOW);
|
||
|
delay(50);
|
||
|
digitalWrite(led_power, HIGH);
|
||
|
}
|