const byte PIN_RC3 = 2; // das ist INT 1 aber Pin 3 wo das Empfängersignal Blinker eingelesen wird
volatile int ReceivedSpeedValues3[8] = {1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500}; // Array mit 8 Werten für die gemessenen Werte
volatile int Summe3 = 12000; // Summe aus dem Array 8x1500, als Anfangswert
volatile int Mittelwert3 =1500; // Mittelwert aus der Summe
volatile int Zeiger3 =0; // Zeiger für das Array, fängt mit 0 an
volatile long LastSpeedChange3 =0;
volatile long nMicros3 =0;
volatile long nDifference3 =0;
// Für Rückfahrwarner und Bremslicht
unsigned long zeit = 0; // Systemzeit
// Für den Blinker und Fahrlicht
const byte Blink_re=8; // pin 7 - Blinker rechts
const byte Blink_li=11; // pin 8 - Blinker links
const byte Licht_re=9; // pin 9 - Licht rechts
const byte Licht_li=10; // pin 10 - Links links
unsigned long Dauer_re =0; // Dauer wie lange Knüppel rechts war
unsigned long Pos_zeit_re =0; // Positionszeit rechts
unsigned long Dauer_li =0; // Dauer wie lange Knüppel links war
unsigned long Pos_zeit_li =0; // Positionszeit links
unsigned long Takt =0; // Hilfszeit für Blinktakt
bool Umschaltsperre_re = false; // Knüppelposition wird abgefragt
bool Umschaltsperre_li = false; // Knüppelposition wird abgefragt
bool Blink_re_an = false; // Blinkfunktion rechts ein
bool Blink_li_an = false; // Blinkfunktion links ein
bool Blink_re_Status = false; // Blink LED rechts AN/AUS
bool Blink_li_Status = false; // Blink LED rechts AN/AUS
byte i = 0; // Zähler für die Blinktakte
bool WarnBlink = false; // Warnblinker
bool Licht_re_an = false;
bool Licht_li_an = false;
bool Licht_re_Sperre = false; //Einschaltsperre Dauerlicht
bool Licht_li_Sperre = false; //Einschaltsperre Dauerlicht
void setup()
{
pinMode (Blink_re, OUTPUT); // Blinker rechts
pinMode (Blink_li, OUTPUT); // Blinker links
pinMode (Licht_re, OUTPUT); // Licht rechts
pinMode (Licht_li, OUTPUT); // Licht links
pinMode(PIN_RC3, INPUT); // Eingang für Empfängersignal an Pin 3
attachInterrupt( 0, SpeedPositionInterrupt3, CHANGE); // 0=Interrupt 0,also Pin2 / NAME der Interruptroutine / springe zum Interrupt wenn der Wert an Pin 2 sich ändert
Serial.begin(9600); // nur für debugging und Test
}
void SpeedPositionInterrupt3() //Interrupt fragt Pin 3 ab
{
nMicros3 = micros(); // die aktuelle Prozessorzeit wird in der variablen nMicros abgespeichert, dann geht der Zugriff schneller
nDifference3 = (nMicros3 - LastSpeedChange3); // hier wird geprüft wie lange der letzte Pegelwechsel her ist
if ( (nDifference3 > 900 ) && ( nDifference3 < 2100)) // liegt die Zeitdifferenz zwischen 0,9 und 2,1 ms, so ist es ein HIGH Pegal
{
Summe3 -= ReceivedSpeedValues3[Zeiger3]; // Summe = Summe - ReceivedSpeedValues[Zeiger];// substrahiere letzte Messung aus dem Array
ReceivedSpeedValues3[Zeiger3] = nDifference3; // Array mit 8 Werten für die gemessenen Wert
Summe3 += nDifference3; //Summe = Summe + ReceivedSpeedValues[Zeiger]; // addiere Wert zur Summe
Zeiger3 = ( ( Zeiger3 + 1 ) & 0x07 ); // Index erhoehen und ggf. von 8 auf 0 springen
Mittelwert3 = ( Summe3 >> 3 ); //der Befehl >>3 ist bit shift left um drei bit, das ist wie durch 8 teilen
}
LastSpeedChange3 = nMicros3;
}
void loop()
{
zeit = millis (); // aktuelle Systemzeit in zeit1 schreiben
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// Ansteuerung Blinker RECHTS für 8x blinken 420 ms / 420 ms + Licht
if ((Mittelwert3 >= 1800) && (Umschaltsperre_re == false)) { // Knüppelposition erreicht und Umschaltsperre ist frei
Pos_zeit_re = millis (); // aktueller Zeitwert wird geschrieben -> Auswertung der Verweildauer Knüppel
Umschaltsperre_re = true; // Umschaltsperre einschalten, Knüppel muss erst mal wieder nach Null
}
if (Umschaltsperre_re == true){ // Umschaltsperre ausschalten wenn der Knüppel in Null ist
Dauer_re = (millis () - Pos_zeit_re); //hier wird die Verweildauer rechts ausgewertet
if ((Dauer_re <= 800) && (Mittelwert3 <= 1650)) { //Verweildauer kleiner 800 UND Knüppel wieder in Null -> Blinker ein
Blink_re_an = true; //Blinker rechts an
}
if ((Dauer_re >= 1001)&& (Licht_re_Sperre == false)) { //Verweildauer größer 1001 -> Licht ein
Licht_re_an = true;
Dauer_re = 0; //Verweildauer löschen
}
if ((Dauer_re >= 1001)&& (Licht_re_Sperre == true)) { //Verweildauer größer 1001 UND Licht war an -> Licht aus
Licht_re_an = false;
Dauer_re = 0; //Verweildauer löschen
}
}
if (Mittelwert3 <= 1650){ //Knüppel in der Mitte -> Umschaltsperre löschen
Umschaltsperre_re = false;
}
if ((Mittelwert3 <= 1650) && (Licht_re_an == true)) { //Knüppel in der Mitte + Licht AN -> Lichtsperre einschalten
Licht_re_Sperre = true;
}
if ((Mittelwert3 <= 1650) && (Licht_re_an == false)) { //Knüppel in der Mitte + Licht AUS -> Lichtsperre löschen
Licht_re_Sperre = false;
}
if ((Blink_re_an == true) && (Blink_li_an == false)&& (WarnBlink == false)) { //Blinken ein
if (millis () - Takt > 420){ //Blinktatkt 420 ms ein / aus
Takt = millis (); //
Blink_re_Status = !Blink_re_Status; //Ausgangsstatus invertieren
i++; //Zähler 1 erhöhen
}
}
if (i > 15) { //der Blinker blinkt 8 mal, aber der Zähler zählt ja auch die Pause mit (8 Blink + 7 Pause = 15)
Blink_re_an = false; //Blinker rechts aus
Blink_re_Status = false; //Ausgangsstatus Blinker rechts auf LOW
i = 0; //Zähler zurücksetzen
}
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// Ansteuerung Blinker LINKS für 8x blinken 420 ms / 420 ms + Licht
if ((Mittelwert3 <= 1150) && (Umschaltsperre_li == false)) { // Knüppelposition erreicht und Umschaltsperre ist frei
Pos_zeit_li = millis (); // aktueller Zeitwert wird geschrieben -> Auswertung der Verweildauer Knüppel
Umschaltsperre_li = true; // Umschaltsperre einschalten, Knüppel muss erst mal wieder nach Null
}
if (Umschaltsperre_li == true){
Dauer_li = (millis () - Pos_zeit_li); //hier wird die Verweildauer rechts ausgewertet
if ((Dauer_li <= 800) && (Mittelwert3 >= 1350)) { //Verweildauer kleiner 800 UND Knüppel wieder in der Mitte -> Blinker ein
Blink_li_an = true; //Blinker links an
}
if ((Dauer_li >= 1001)&& (Licht_li_Sperre == false)) { //Verweildauer größer 1011 -> Licht ein
Licht_li_an = true;
Dauer_li = 0; //Verweildauer löschen
}
if ((Dauer_li >= 1001)&& (Licht_li_Sperre == true)) { //Verweildauer größer 1001 UND Licht war an -> Licht aus
Licht_li_an = false;
Dauer_li = 0; //Verweildauer löschen
}
}
if (Mittelwert3 >= 1350){ //Knüppel in der Mitte -> Umschaltsperre löschen
Umschaltsperre_li = false;
}
if ((Mittelwert3 >= 1350) && (Licht_li_an == true)) { //Knüppel in der Mitte + Licht AN -> Lichtsperre einschalten
Licht_li_Sperre = true;
}
if ((Mittelwert3 >= 1350) && (Licht_li_an == false)) { //Knüppel in der Mitte + Licht AUS -> Lichtsperre löschen
Licht_li_Sperre = false;
}
if ((Blink_li_an == true) && (Blink_re_an == false)&& (WarnBlink == false)) { // Blinken ein
if (millis () - Takt > 420){ //Blinktatkt 420 ms ein / aus
Takt = millis (); //
Blink_li_Status = !Blink_li_Status; //Ausgangsstatus invertieren
i++; //Zähler 1 erhöhen
}
}
if (i > 15) { //der Blinker blinkt 8 mal, aber der Zähler zählt ja auch die Pause mit (8 Blink + 7 Pause = 15)
Blink_li_an = false; //Blinker links aus
Blink_li_Status = false; //Ausgangsstatus Blinker links auf LOW
i = 0; //Zähler zurücksetzen
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// Warnblinker Logik
if ((Blink_li_an == true) && (Blink_re_an == true) && (WarnBlink == false)) { // Warnblinker ein wenn der andere Blinker schon blinkt
WarnBlink = true; //Warnblinker gesetzt
Blink_li_an = false; //Blinker links aus
Blink_re_an = false; //Blinker rechts aus
Blink_li_Status = false; //LED erst mal aus wegen synchronisation
Blink_re_Status = false; //LED erst mal aus wegen synchronisation
i = 0; //Zähler zurücksetzen
}
if (WarnBlink == true) {
if (millis () - Takt > 420){ //Blinktatkt 420 ms ein / aus
Takt = millis (); //
Blink_re_Status = !Blink_re_Status; //Ausgangsstatus invertieren
Blink_li_Status = !Blink_li_Status;
}
}
if ((WarnBlink == true) && (Blink_re_Status == false) && (Blink_li_Status == false) && ((Blink_li_an == true) || (Blink_re_an == true))) {
// wird nur abgeschaltet wenn LED aus (Pause)
WarnBlink = false;
Blink_li_an = false; //Blinker links aus
Blink_re_an = false; //Blinker rechts aus
Blink_li_Status = false; //LED aus
Blink_re_Status = false; //LED aus
}
digitalWrite (Blink_li,Blink_li_Status); // Blinker links
digitalWrite (Blink_re,Blink_re_Status); // Blinker rechts
digitalWrite (Licht_li,Licht_li_an); // Licht links
digitalWrite (Licht_re,Licht_re_an); // Licht rechts
}