- Registriert
- 08.08.2007
- Beiträge
- 1.949
Hallo,
ich braucht für mein "neues" Projekt noch eine Lichtsteuerung. Eigentlich war die erst später im Jahr vorgesehen.
- Basis Arduino Nano
- zwei Servosignale werden eingelesen: Fahrtenregler und ein Schaltkanal
- der Fahrtenregler steuert das Bremslicht, den Rückfahrwarner und den Rückfahrscheinwerfer
- Der Schaltkanal steuert: als Tastfunktion die Blinker/Warnblinker
- als Schaltfunktion z.B. Fahrlicht und Fernlicht
Schalten tut der Arduino +5V, da muss man noch eine Treiberstufe dranhängen wenn man mehrere LEDs ansteuern will.
Der Code ist schon was für Fortgeschrittene, aber sonst komplett kommentiert (ich such sonst selber zu lange rum )
ich braucht für mein "neues" Projekt noch eine Lichtsteuerung. Eigentlich war die erst später im Jahr vorgesehen.
- Basis Arduino Nano
- zwei Servosignale werden eingelesen: Fahrtenregler und ein Schaltkanal
- der Fahrtenregler steuert das Bremslicht, den Rückfahrwarner und den Rückfahrscheinwerfer
- Der Schaltkanal steuert: als Tastfunktion die Blinker/Warnblinker
- als Schaltfunktion z.B. Fahrlicht und Fernlicht
Schalten tut der Arduino +5V, da muss man noch eine Treiberstufe dranhängen wenn man mehrere LEDs ansteuern will.
Code:
// Pin 2: Schaltmodul mit Bremslicht und Rückfahrscheinwerfer und Rückfahrwarner
// Pin 3: Schaltmodul mit Blinker/Warnblinker und zwei unabhängigen Lichtkanälen
// für Arduino Nano
const byte PIN_RC = 2; // das ist INT 0 aber Pin 2 wo das Empfängersignal Rückfahrwarmer & Bremslicht eingelesen wird
// alles was im Interrupt läuft muss als volatile deklariert werden
//volatile int RcValue; // Eingelesener Wert direkt aus dem RAM w.g. volatile)
volatile int ReceivedSpeedValues[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; // Mittelwert aus der Summe
volatile int Zeiger =0; // Zeiger für das Array, fängt mit 0 an
volatile long LastSpeedChange =0;
volatile long nMicros =0;
volatile long nDifference =0;
const byte PIN_RC3 = 3; // 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
const byte LED = 4; // pin 4 - Rückfahr LED weiß
const byte LEDrt = 5; // pin 5 - Bremslicht rot
const byte speakerPin = 6; // pin 6 (PWM) - Lautsprecher
boolean Null = 0; // Nullstellung wird erkannt
boolean vorher_Null = 0; // Nullstellung vorher
int frequency = 1300; // 1300Hz für den Pieper
int duration = 400; // Dauer des Tons
unsigned long zeit = 0; // Systemzeit
unsigned long zeit1_alt =0; // alte Systemzeit 1 Rücklicht
unsigned long zeit2_alt =0; // alte Systemzeit 2 Bremslicht
bool RVS = false; // Status Rückwärts
// Für den Blinker und Fahrlicht
const byte Blink_re=7; // pin 7 - Blinker rechts
const byte Blink_li=8; // 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 (LED, OUTPUT); // Rückfahrlicht
pinMode (LEDrt, OUTPUT); // Bremslicht LED
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_RC, INPUT); // Eingang für Empfängersignal an Pin 2
pinMode(PIN_RC3, INPUT); // Eingang für Empfängersignal an Pin 3
attachInterrupt( 0, SpeedPositionInterrupt, CHANGE); // 0=Interrupt 0,also Pin2 / NAME der Interruptroutine / springe zum Interrupt wenn der Wert an Pin 2 sich ändert
attachInterrupt( 1, SpeedPositionInterrupt3, CHANGE); // 1=Interrupt 1,also Pin3 / NAME der Interruptroutine / springe zum Interrupt wenn der Wert an Pin 3 sich ändert
Serial.begin(9600); // nur für debugging und Test
}
void SpeedPositionInterrupt() //Interrupt fragt Pin 2 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 -= ReceivedSpeedValues[Zeiger]; // Summe = Summe - ReceivedSpeedValues[Zeiger];// substrahiere letzte Messung aus dem Array
ReceivedSpeedValues[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 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
// Rückfahrlicht + Pieper
if (Mittelwert < 1450) { // Fahrzeug fährt rückwärts
digitalWrite (LED,HIGH); // Rückfahrscheinwerfer ein
RVS = true; // Status Rückwärts
}
if (RVS == true && (zeit - zeit1_alt >=800)) { // Status Rückwärts UND Zeitdifferenz ist größer 800 ms
tone(speakerPin, frequency, duration); // 400 ms Ton ausgeben
zeit1_alt = zeit; // aktuelle Zeit in Zeit1_alt schreiben -> hierdurch wird der Intervall gemacht.
}
if (Mittelwert >1451) { // Fahrzeug ist in Neutral oder fährt vorwärts
digitalWrite (LED,LOW); // Rückfahrscheinwerfer aus
RVS = false; // Status Rückwärts
}
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
//
// Bremslicht
if ((Mittelwert >1450) &&(Mittelwert <1550)) { // war 1450 und 1550 Abfrage Nullstellung
Null = true;
}
if (vorher_Null == false && Null == true)
{ //vorher kein Null -> jetzt Null-> Bremslicht an
digitalWrite (LEDrt,HIGH); //LED Bremslicht ein
zeit2_alt = millis (); //Zeit für Timer setzen
}
if ((zeit - zeit2_alt >= 3000) || Null == false) { // wenn timer = 3000 ODER wieder FWD bzw RVS, dann Bremslicht aus
digitalWrite (LEDrt,LOW); //LED Bremslicht aus
}
vorher_Null = Null; // alten Null Wert speichern
Null = false; // aktuellen Nullwert zurück setzen
//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 ein/aus
digitalWrite (Blink_re,Blink_re_Status); // Blinker rechts ein/aus
digitalWrite (Licht_li,Licht_li_an); // Licht links ein/aus
digitalWrite (Licht_re,Licht_re_an); // Licht rechts ein/aus
/*// Serial.print ("Mittelwert ");
//Serial.println(Mittelwert); // Anzeige des Mittelwertes
Serial.print ("Knüppelzeit li ");
Serial.println(Dauer_li); // Anzeige des Mittelwertes
Serial.print ("Knüppelzeit re ");
Serial.println(Dauer_re); // Anzeige des Mittelwertes
Serial.print ("Rechts ");
Serial.println(Rechts); // Anzeige des Mittelwertes
Serial.print ("Rechts an ");
Serial.println(Rechts_an); // Anzeige des Mittelwertes
Serial.print ("Takt ");
Serial.println(Takt); // Anzeige des Mittelwertes
/*/
}
Der Code ist schon was für Fortgeschrittene, aber sonst komplett kommentiert (ich such sonst selber zu lange rum )