//MST Rainer
// by dqb312
int Gas; //Variable für Gasstellung
int Lenk; //Variable für Lenkung
int Schalt; //Variable für Schaltkanal
int Dimm = 50; //Variable Dimmer (Rücklicht und Fernlicht normal)
int Dimmrand = 15; //Variable Dimmer (Rücklicht und Fernlicht Effekt)
boolean Blink = LOW; //Variable für Blinker
int Wait = 3000; //Zeit bis Warnblinker oder Blinker an geht
long Waitmillis = 0; //Variable für Wartezeitermittlung, auf 0 für erste Verwendung
int Blinkspeed = 500; //Blinkgeschwindigkeit
long Blinkmillis = 0; //Variable zur Ermittlung der Blinkerschaltung, auf 0 für erste Verwendung
int Monitor = 1; //Werte an seriellen Monitor senden (0=aus, 1=an)
long An = 0; //Fernsteuerung aus?
int Gasup = 4; //oberer Gaswert
int Gasdown = -4; //unterer Gaswert
int randNumber; //Variable für Zufallswert
void setup()
{
if (Monitor==1)
{
Serial.begin(9600); //startet Serielle Kommunikation
}
pinMode(0, INPUT); //Rauschen empfangen
pinMode(2, INPUT); //Gas vom Empfänger
pinMode(3, OUTPUT); //Scheinwerfer
pinMode(4, INPUT); //Lenkung vom Empfänger
pinMode(5, OUTPUT); //Rücklicht
pinMode(6, OUTPUT); //Rücklicht
pinMode(7, INPUT); //Schaltkanal vom Empfänger
pinMode(8, OUTPUT); //Blinker links
pinMode(9, OUTPUT); //Blinker links
pinMode(10, OUTPUT); //drittes Bremslicht
pinMode(11, OUTPUT); //Scheinwerfer
pinMode(12, OUTPUT); //Blinker rechts
pinMode(13, OUTPUT); //Blinker rechts
//pinMode(A0, OUTPUT); //
//pinMode(A1, OUTPUT); //
pinMode(A2, OUTPUT); //Bremslicht
pinMode(A3, OUTPUT); //Bremslicht
pinMode(A4, OUTPUT); //Bremslicht
pinMode(A5, OUTPUT); //Bremslicht
}
void loop()
{
An = millis();
Gas = pulseIn(2, HIGH); //PWM vom Empfänger messen Gas
Lenk = pulseIn(4, HIGH); //PWM vom Empfänger messen Lenkung
Schalt = pulseIn(7, HIGH); //PWM vom Empfänger messen Schaltkanal
An = millis() - An;
if (Monitor==1)
{
Serial.print(Gas);
Serial.print(" ");
Serial.print(Lenk);
Serial.print(" ");
Serial.print(Schalt);
Serial.print(" ");
}
Gas = map(Gas, 890, 2074, -100, 100); //Arbeitswerte erzeugen (die ersten beiden Werte aus min / max des Kanals ableiten)
Lenk = map(Lenk, 890, 2074, 100, -100); //Arbeitswerte erzeugen (die ersten beiden Werte aus min / max des Kanals ableiten)
Schalt = map(Schalt, 890, 2074, 100, -100); //Arbeitswerte erzeugen (die ersten beiden Werte aus min / max des Kanals ableiten)
if (Monitor==1)
{
Serial.print(Gas);
Serial.print(" ");
Serial.print(Lenk);
Serial.print(" ");
Serial.println(Schalt);
}
if (An > 500) //wenn die Funke aus ist
{
//alles aus
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(10, LOW);
digitalWrite(8, LOW);
digitalWrite(3, LOW);
digitalWrite(11, LOW);
digitalWrite(A2, LOW);
digitalWrite(A3, LOW);
digitalWrite(A4, LOW);
digitalWrite(A5, LOW);
//Blinker 3x blinken
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
delay(100);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
delay(100);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
delay(100);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
delay(100);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
delay(100);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
analogWrite(3, Dimm);
analogWrite(5, Dimm);
analogWrite(6, Dimm);
digitalWrite(10, HIGH);
analogWrite(11, Dimm);
digitalWrite(A2, HIGH);
digitalWrite(A3, HIGH);
digitalWrite(A4, HIGH);
digitalWrite(A5, HIGH);
delay(100);
}
else //wenn die Funke an ist
{
//Normales Licht
if (Schalt > -70)
{
//Scheinwerfer
if (Schalt <= 70)
{
digitalWrite(3, HIGH);
digitalWrite(11, HIGH);
}
else
{
digitalWrite(3, LOW);
digitalWrite(11, LOW);
}
//Blinker
if(Gas > Gasdown && Gas < Gasup) //ausführen, wenn Gas im Neutralbereich ist
{
//Timer für Wartezeit vor Blinken
if (millis() - Waitmillis > Wait) //ausführen, wenn Timer für Wartezeit um ist
{
//Scheinwerfer dimmen
if (Schalt <= 70)
{
analogWrite(3, Dimm);
analogWrite(11, Dimm);
}
//Timer für Blinkfrequenz
if (millis() - Blinkmillis > Blinkspeed) //ausführen, wenn Blinktimer um ist
{
Blinkmillis = millis();
Blink = !Blink;
if(Lenk >=-10) //linker Blinker
{
digitalWrite(8, Blink);
digitalWrite(9, Blink);
}
else
{
digitalWrite(8, LOW);
digitalWrite(9, LOW);
}
if(Lenk <=10) //rechter Blinker
{
digitalWrite(12, Blink);
digitalWrite(13, Blink);
}
else
{
digitalWrite(12, LOW);
digitalWrite(13, LOW);
}
}
}
}
else //ausführen, Wenn Gas nicht im Neutralbereich ist
{
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
Waitmillis = millis(); // aktuelle Zeit abspeichern
}
//Rücklicht
if (Schalt <=70)
{
analogWrite(5, Dimm);
analogWrite(6, Dimm);
}
else
{
analogWrite(5, 0);
analogWrite(6, 0);
}
//Bremslicht
if (Gas > Gasdown && Gas < Gasup)
{
digitalWrite(10, HIGH);
digitalWrite(A2, HIGH);
digitalWrite(A3, HIGH);
digitalWrite(A4, HIGH);
digitalWrite(A5, HIGH);
}
else
{
digitalWrite(10, LOW);
digitalWrite(A2, LOW);
digitalWrite(A3, LOW);
digitalWrite(A4, LOW);
digitalWrite(A5, LOW);
}
}
else //Effektprogramm
{
delay(100);
randNumber = random(0,2);
if (randNumber > 0)
{
digitalWrite (3, HIGH);
digitalWrite (11, HIGH);
}
else
{
analogWrite (3, Dimmrand);
analogWrite (11, Dimmrand);
}
randNumber = random(0,2);
if (randNumber > 0)
{
digitalWrite (5, HIGH);
digitalWrite (6, HIGH);
}
else
{
analogWrite (5, Dimmrand);
analogWrite (6, Dimmrand);
}
randNumber = random(0,2);
if (randNumber > 0)
{
digitalWrite (8, HIGH);
digitalWrite (9, HIGH);
digitalWrite (12, HIGH);
digitalWrite (13, HIGH);
}
else
{
digitalWrite (8, LOW);
digitalWrite (9, LOW);
digitalWrite (12, LOW);
digitalWrite (13, LOW);
}
randNumber = random(0,2);
if (randNumber > 0)
{
digitalWrite (10, HIGH);
digitalWrite (A2, HIGH);
digitalWrite (A3, HIGH);
digitalWrite (A4, HIGH);
digitalWrite (A5, HIGH);
}
else
{
digitalWrite (10, LOW);
digitalWrite (A2, LOW);
digitalWrite (A3, LOW);
digitalWrite (A4, LOW);
digitalWrite (A5, LOW);
}
}
}
}