SchuetzeSchulz
Member
- Registriert
- 16.02.2010
- Beiträge
- 386
Hallo Bert,
danke für Deine Hilfe. Ich habe den Code noch ein wenig umgeschrieben und alle ungenutzten Variablen entfernt.
Was soll ich sagen? Es funktioniert jetzt alles so wie es soll. Vielen lieben Dank für Deine Unterstützung.
Der Vollständigkeit halber - falls noch jemand mal nen 4-fach RC-Schalter sucht - hier der Code:
Vorhergehende Abhandlung des Themas ist hier zu finden:
danke für Deine Hilfe. Ich habe den Code noch ein wenig umgeschrieben und alle ungenutzten Variablen entfernt.
Was soll ich sagen? Es funktioniert jetzt alles so wie es soll. Vielen lieben Dank für Deine Unterstützung.
Der Vollständigkeit halber - falls noch jemand mal nen 4-fach RC-Schalter sucht - hier der Code:
Code:
// Eingangs-PIN (Empfängersignal)
const byte PIN_RC = 2; // das ist INT 1 aber Pin 2 an dem das Empfängersignal eingelesen wird
// Ausgangs-PINs
const byte Ausgang1 = 10; // PIN 10 - Knüppel links lang
const byte Ausgang2 = 11; // PIN 8 - Knüppel links kurz
const byte Ausgang3 = 9; // PIN 9 - Knüppel rechts lang
const byte Ausgang4 = 8; // PIN 7 - Knüppel rechts kurz
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXunsigned long Dauer_rechts =0; // Dauer wie lange Knüppel rechts war
unsigned long Dauer_rechts = 0; // Dauer wie lange Knüppel rechts war
unsigned long Dauer_links = 0; // Dauer wie lange Knüppel links war
unsigned long Zeit_rechts = 0; // Positionszeit rechts
unsigned long Zeit_links =0; // Positionszeit links
bool Umschaltsperre_rechts = false; // Knüppelposition wird abgefragt
bool Umschaltsperre_links = false; // Knüppelposition wird abgefragt
bool Ausgang1_an = false;
bool Ausgang2_an = false;
bool Ausgang3_an = false;
bool Ausgang4_an = false;
bool Ausgang1_Sperre = false; //Einschaltsperre Ausgang 1
bool Ausgang2_Sperre = false; //Einschaltsperre Ausgang 2
bool Ausgang3_Sperre = false; //Einschaltsperre Ausgang 3
bool Ausgang4_Sperre = false; //Einschaltsperre Ausgang 4
unsigned long Zeit = 0; // Systemzeit
volatile int ReceivedSpeedValues3[8] = {1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500}; // Array mit 8 Werten für die gemessenen Werte
volatile int Summe = 12000; // Summe aus dem Array 8x1500, als Anfangswert
volatile int Mittelwert = 1500;
volatile int Zeiger = 0;
volatile long LastSpeedChange = 0;
volatile long nMicros = 0;
volatile long nDifference =0;
void setup()
{
pinMode (PIN_RC, INPUT); // Eingang für Empfängersignal
pinMode (Ausgang1, OUTPUT);
pinMode (Ausgang2, OUTPUT);
pinMode (Ausgang3, OUTPUT);
pinMode (Ausgang4, OUTPUT);
attachInterrupt( 0, SpeedPositionInterrupt, CHANGE); // 0=Interrupt 0,also Pin2 / NAME der Interruptroutine / springe zum Interrupt wenn der Wert an Pin 2 sich ändert
}
void SpeedPositionInterrupt() // Interrupt fragt Empfängersignal-PIN ab
{
nMicros = micros(); // die aktuelle Prozessorzeit wird in der variablen nMicros abgespeichert, dann geht der Zugriff schneller
nDifference = (nMicros - LastSpeedChange); // hier wird geprüft wie lange der letzte Pegelwechsel her ist
if ( (nDifference > 900 ) && ( nDifference < 2100)) // liegt die Zeitdifferenz zwischen 0,9 und 2,1 ms, so ist es ein HIGH Pegal
{
Summe -= ReceivedSpeedValues3[Zeiger]; // Summe = Summe - ReceivedSpeedValues[Zeiger];// substrahiere letzte Messung aus dem Array
ReceivedSpeedValues3[Zeiger] = nDifference; // Array mit 8 Werten für die gemessenen Wert
Summe += nDifference; // Summe = Summe + ReceivedSpeedValues[Zeiger]; // addiere Wert zur Summe
Zeiger = ( ( Zeiger + 1 ) & 0x07 ); // Index erhoehen und ggf. von 8 auf 0 springen
Mittelwert = ( Summe >> 3 ); // der Befehl >>3 ist bit shift left um drei bit, das ist wie durch 8 teilen
}
LastSpeedChange = nMicros;
}
void loop()
{
Zeit = millis (); // aktuelle Systemzeit in Variable "Zeit" schreiben
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// Ansteuerung Knüppel RECHTS
if ((Mittelwert >= 1800) && (Umschaltsperre_rechts == false)) // Knüppelposition erreicht und Umschaltsperre ist frei
{
Zeit_rechts = millis (); // aktueller Zeitwert wird geschrieben -> Auswertung der Verweildauer Knüppel
Umschaltsperre_rechts = true; // Umschaltsperre einschalten, Knüppel muss erst mal wieder nach Null
}
if (Umschaltsperre_rechts == true) // Umschaltsperre ausschalten wenn der Knüppel in Null ist
{
Dauer_rechts = (millis () - Zeit_rechts); // hier wird die Verweildauer rechts ausgewertet
if ((Dauer_rechts <= 800) && (Mittelwert <= 1650) && (Ausgang4_Sperre == false)) // Verweildauer kleiner 800 UND Knüppel wieder in Null -> Ausgang 4 schalten
{
Ausgang4_an = true;
Dauer_rechts = 0;
}
if ((Dauer_rechts <= 800) && (Mittelwert <= 1650) && (Ausgang4_Sperre == true)) // Verweildauer kleiner 800 UND Knüppel wieder in Null -> Ausgang 4 aus
{
Ausgang4_an = false;
Dauer_rechts = 0;
}
if ((Dauer_rechts >= 1001)&& (Ausgang3_Sperre == false)) // Verweildauer größer 1001 UND Knüppel wieder in Null -> Ausgang 3 schalten
{
Ausgang3_an = true;
Dauer_rechts = 0; // Verweildauer löschen
}
if ((Dauer_rechts >= 1001)&& (Ausgang3_Sperre == true)) // Verweildauer größer 1001 UND Ausgang war an -> Ausgang ausschalten
{
Ausgang3_an = false;
Dauer_rechts = 0; // Verweildauer löschen
}
}
if (Mittelwert <= 1650) // Knüppel in der Mitte -> Umschaltsperre löschen
{
Umschaltsperre_rechts = false;
}
if ((Mittelwert <= 1650) && (Ausgang4_an == true)) // Knüppel in der Mitte + Ausgang 4 AN -> Sperre Ausgang 4 einschalten
{
Ausgang4_Sperre = true;
}
if ((Mittelwert <= 1650) && (Ausgang4_an == false)) // Knüppel in der Mitte + Ausgang 4 AUS -> Sperre Ausgang 4 löschen
{
Ausgang4_Sperre = false;
}
if ((Mittelwert <= 1650) && (Ausgang3_an == true)) // Knüppel in der Mitte + Ausgang 3 AN -> Sperre Ausgang 3einschalten
{
Ausgang3_Sperre = true;
}
if ((Mittelwert <= 1650) && (Ausgang3_an == false)) //Knüppel in der Mitte + Ausgang 3 AUS -> Sperre Ausgang 3 löschen
{
Ausgang3_Sperre = false;
}
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// Ansteuerung Knüppel LINKS
if ((Mittelwert <= 1150) && (Umschaltsperre_links == false)) // Knüppelposition erreicht und Umschaltsperre ist frei
{
Zeit_links = millis (); // aktueller Zeitwert wird geschrieben -> Auswertung der Verweildauer Knüppel
Umschaltsperre_links = true; // Umschaltsperre einschalten, Knüppel muss erst mal wieder nach Null
}
if (Umschaltsperre_links == true)
{
Dauer_links = (millis () - Zeit_links); // hier wird die Verweildauer rechts ausgewertet
if ((Dauer_links <= 800) && (Mittelwert >= 1350) && (Ausgang2_Sperre == false)) // Verweildauer kleiner 800 UND Knüppel wieder in der Mitte -> Blinker ein
{
Ausgang2_an = true; // Ausgang 2 EIN
Dauer_links = 0;
}
if ((Dauer_links <=800) && (Mittelwert <= 1350) && (Ausgang2_Sperre == true)) // Verweildauer kleiner 800 UND Knüppel wieder in Null -> Ausgang 2 aus
{
Ausgang2_an = false;
Dauer_links = 0;
}
if ((Dauer_links >= 1001)&& (Ausgang1_Sperre == false)) // Verweildauer größer 1011 -> Ausgang 1 ein
{
Ausgang1_an = true;
Dauer_links = 0; // Verweildauer löschen
}
if ((Dauer_links >= 1001)&& (Ausgang1_Sperre == true)) // Verweildauer größer 1001 UND Licht war an -> Ausgang 1 aus
{
Ausgang1_an = false;
Dauer_links = 0; // Verweildauer löschen
}
}
if (Mittelwert >= 1350) // Knüppel in der Mitte -> Umschaltsperre löschen
{
Umschaltsperre_links = false;
}
if ((Mittelwert >= 1350) && (Ausgang2_an == true)) // Knüppel in der Mitte + Ausgang 2 AN -> Sperre Ausgang 2 einschalten
{
Ausgang2_Sperre = true;
}
if ((Mittelwert >= 1350) && (Ausgang2_an == false)) // Knüppel in der Mitte + Blink AUS -> Blinksperre löschen
{
Ausgang2_Sperre = false;
}
if ((Mittelwert >= 1350) && (Ausgang1_an == true)) // Knüppel in der Mitte + Ausgang 1 AN -> Sperre Ausgang 1 einschalten
{
Ausgang1_Sperre = true;
}
if ((Mittelwert >= 1350) && (Ausgang1_an == false)) // Knüppel in der Mitte + Licht AUS -> Lichtsperre löschen
{
Ausgang1_Sperre = false;
}
digitalWrite (Ausgang1,Ausgang1_an); // Licht links
digitalWrite (Ausgang2,Ausgang2_an); // Blinker links
digitalWrite (Ausgang3,Ausgang3_an); // Licht rechts
digitalWrite (Ausgang4,Ausgang4_an); // Blinker rechts
}
Vorhergehende Abhandlung des Themas ist hier zu finden: