chicken_stall_door/chicken_stall_door_software/chicken_stall_door_software...

301 lines
6.5 KiB
C++

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