// Torsteuerung:
// by Erhard Frießnik
// V 1.0 - 2019
// letzte Änderung 01.01.2022
#include <SoftwareSerial.h>
//#include <arduino.h>
#include "motor.h"
#define LS 9
#define TASTER 8 // 12 V Taster
#define TASTER_5V 10 //PIN 10 - Taster welche nur mit 5V versorgt sind
#define OUTPUT_5V 11 //PIN zur 5V Stromersorgung für Taster (workaround !!!)
#define REMOTE 7
#define MAGNET_O 6
#define MAGNET_C 5
#define DIR 4
#define POWER 3
#define FLASH 2
#define LED 13
MOTOR motor;
int iState = 0;
int sBarrier = 0;
boolean sTaster, sRemote, sprint;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
sTaster = sRemote = sBarrier = false;
sprint = true;
pinMode(LS, INPUT);
pinMode(MAGNET_O, INPUT);
pinMode(MAGNET_C, INPUT);
pinMode(TASTER, INPUT);
pinMode(TASTER_5V, INPUT);
pinMode(OUTPUT_5V, OUTPUT);
pinMode(REMOTE, INPUT);
pinMode(DIR, OUTPUT);
pinMode(POWER, OUTPUT);
pinMode(FLASH, OUTPUT);
pinMode(LED, OUTPUT);
digitalWrite(OUTPUT_5V, HIGH);
Serial.println ("Programm gestartet");
}
void loop() {
// put your main code here, to run repeatedly:
if (digitalRead(LS) == LOW)
{ motor.halt(); //sofortiger STOPP auslösen bei Lichtschrankenunterbrechung
//Serial.println("Lichtschranke");
if(!sBarrier)
{ Serial.println ("Lichtschranke unterbrochen");
if(Flash_ON == true) // läuft der Motor?
{ sBarrier = 2;
if(motor.barrier()) // prüfen ob wenden oder Richtung beibehalten
{ Serial.println ("Tor wird wegen LS-Unterbrechung wieder geöffent");
}
}
else
{
sBarrier = 1;
}
}
}
else //Lichtschranke nicht oder nicht mehr unterbrochen
{ if(sBarrier == 1 && motor.checkTimer(0)) // Motor ist bei LS-Unterbrechung nicht gelaufen und Timer ist nun abgelaufen
{ Serial.println ("Timer wird verlängert nach LS-Unterbrechung"); // Timer wird um TIMER_EXTENSION verlängert
motor.setTimer(millis()-TIME_OPEN+TIMER_EXTENSION);
}
if(sBarrier == 2) // Motor ist bei LS-Unterbrechung bereits gelaufen:
{ motor.start(); // wird wieder gestartet
Serial.println ("Motorstart nach LS-Unterbrechung");
}
sBarrier=0; // LS-Unterbrechung wird aufgehoben
}
if (digitalRead(MAGNET_O) == HIGH && Motor_ON == true)
{ Serial.println ("Magnetschalter offen");
if(!motor.magnetic(OPEN))
{ motor.halt();
}
}
if (digitalRead(MAGNET_C) == HIGH && (Motor_ON == true || motor.getError() == true))
{ Serial.println ("Magnetschalter geschlossen");
if(!motor.magnetic(CLOSE))
{ motor.halt();
}
}
if (digitalRead(TASTER) == HIGH || digitalRead(REMOTE) == HIGH || digitalRead(TASTER_5V) == HIGH)
{ if (!sTaster)
{ Serial.println ("Taster gedrückt ...");
sTaster = true;
if(motor.button())
{ motor.start();
Serial.println ("Motor startet");
}
else
{ motor.halt();
Serial.println ("Motor stoppt");
}
}
}
else
{
sTaster = false;
}
if (motor.checkTimer(0)) // Timer wird überprüft
{ Serial.println ("Timer abgelaufen");
if(sBarrier == 0) // Ist die Lichtschranke frei, wird Timer deaktiviert und Motor gestartet
{ motor.setTimer(0);
motor.start();
}
}
// Motor- und Flashflag setzen um Motor bzw. Flash zu aktivieren/deaktivieren
//if (motor.get_stime() > 0 && (millis() - motor.get_stime()) < ((unsigned long)TIME_RUNNING + (unsigned long)FLASH_TIME))
if (motor.get_stime() > 0 && motor.getPosition() <= (unsigned long)TIME_RUNNING)
{ Flash_ON = true;
if (millis() - motor.get_stime() > FLASH_TIME)
{ Motor_ON = true;
motor.setPosition();
}
}
else
{ Motor_ON = false;
Flash_ON = false;
}
// FLASH einschalten und im Intervall toggeln
{ if (Flash_ON && ((motor.getDir() && ((int) millis()/FLASH_CLOSE) % 2 ) || (!motor.getDir() && ((int) millis()/FLASH_OPEN) % 2)) || (motor.getError() && ((int) millis()/FLASH_ERROR) % 2))
{ digitalWrite(FLASH, true);
digitalWrite(LED, true);
}
else
{ digitalWrite(FLASH, false);
digitalWrite(LED, false);
}
}
// Statusinformation auf Serial-Port ausgeben
if(((int) (millis()/1000))%2)
{ if(sprint == true)
{ if(Motor_ON)
{ Serial.print("Motor läuft - ");
Serial.println(motor.getDir());
}
if(sBarrier)
Serial.println("Lichtschranke unterbrochen");
motor.printInfo();
sprint = false;
}
}
else
{ sprint = true;
}
// DIR_RELAY ausrichten bevor Motor läuft
if(Motor_ON)
{ digitalWrite (DIR, motor.getDir());
delay(50);
}
// MOTOR ein-/abschalten
digitalWrite (POWER, Motor_ON);
delay(10);
// DIR_RELAY abschalten nachdem Motor stoppt
if(!Motor_ON)
{ digitalWrite(DIR, LOW);
}
}