Go Down

Topic: WS2812 , KFZ Fussraum LED Steuerung mit Türkontakt und Zentralverriegelung (Read 4195 times) previous topic - next topic

Akropolis

hey klasse die delay erseztung hat mir sehr geholfen.. mit der Bounce Library konnte ich nicht so gut rumspielen mit variablen und abläufen wie auf meine Weise :D Hauptsache es läuft jezt genau so wie ich es wollte :)
Habe dafür auch viel gelernt. gute 45Stunden Arbeit inkl. Learning by Doing :P

Ach ja.. es war die For Schleife die dann andere Befehle in der IF Konstruktion nicht beachtete

Falls wer mal eine "Intelligente" :D Fussraumbeleuchtung braucht... hier:
Nur noch die HIGH/LOW Pegel definieren, je nach KFZ FZ Steuerung, (Masse oder Plus geschaltet)

Code Funktionen Beinhaltet:
-Einstellbarer Timer für Autom. LED Off Schaltung. (schlafmodus)
 (wen ZV Open = weiss gedimmt leuchtet, aber nach 1min. kein TK oder Zünd+ Signal kommt, gehe schlafen.
-Stromsparmodus.
-Schlafmodus bei ZV Close oder wen TK Türen 1min. nicht geöffnet wird nach dem aufschliessen des Fahrzeuges.
-Led Indikator-Licht ROT = ZV Close, Grün = ZV Open.
-TK offen = Weiss Hell, TK zu = Weiss gedimmt.
-Zündplus ON = Gelb gedimmt.
-Kein Indikator Licht, wenn Zünd+ ON ist und ZV Open oder ZV Close Signal kommt.
-ZV Open Interrupt lässt ihn erwachen.
-TK Open Interrupt lässt ihn erwachen.
-Zustandswechsel wen Zünd+ = ON und Türe TK offen ist, von Gelb gedimmt zu weiss hell.
-Schneller LED Indikator-licht Status-wechsel ohne delay, außer bei ZVClose, wo es nicht stört!

Kann noch verbessert oder gekürzt werden..
Alle Logischen Funktionen sollten geschrieben sein!
Ansonsten nehme ich Tipps oder Kritik gerne entgegen.
Langsam ist Präzise und Präzise ist schnell ;)

Akropolis

Code: [Select]

include <Adafruit_NeoPixel.h>
#include <avr/sleep.h>     // Bibliothek fuer den Schlafmodus
#include <avr/power.h>     // Bibliothek fuer die Abschaltung der Peripherie
#include <CountUpDownTimer.h>
const int ZVOpen=2; //Das Wort „ZVOpen Zentralverriegelungs Impuls oeffnen" steht jetzt für den Wert 2. Mit Interrupt
int ZVOpenStatus=0; //Das Wort „ZVOpenStatus" steht jetzt zunaechst für den Wert 0. Später wird unter dieser Variable gespeichert, ob der ZV Impuls High oder Low ist.
const int TK=3; //Das Wort „TK Türkontakt" steht jetzt für den Wert 3. Mit Interrupt
int TKStatus=0; //Das Wort „TKStatus" steht jetzt zunaechst für den Wert 0. Spaeter wird unter dieser Variable gespeichert, ob der Türkontakt geschlossen ist oder nicht.
const int Zuendplus=8; //Das Wort Zuendplus steht jetzt für den Wert 8.
int ZuendplusStatus=0; //Das Wort „ZuendplusStatus" steht jetzt zunächst für den Wert 0. Spaeter wird unter dieser Variable gespeichert, ob Zuendplus High oder Low ist
const int ZVClose=9; //Das Wort „ZVClose Zentralverriegelungs Impuls schliessen" steht jetzt für den Wert 9.
int ZVCloseStatus=0; //Das Wort „ZVCloseStatus" steht jetzt zunächst für den Wert 0. Spaeter wird unter dieser Variable gespeichert, ob der ZV Impuls High oder Low ist.
CountUpDownTimer T(DOWN);

const int LEDFussraum = 6;// LED Fussraum Bel.=Pin6
#define NUM_LEDS 8 //8 ws2812 LEDS conected
Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(NUM_LEDS, LEDFussraum, NEO_RGB + NEO_KHZ800);

// Interrupt.0 befindet sich beim digitalen Pin 2 bei 328p MCU
// Interrupt.1 befindet sich beim digitalen Pin 3 bei 328p MCU
// SCHLAFMODUS 1 // ISR fuer ZVOpen Pin2 (Int.0). bei 328p MCU
void ZVOpenisr(void) {
  detachInterrupt(0);} // detach Interrupt, damit er nur einmal auftritt
void enter_sleep1(void) {
  attachInterrupt(0, ZVOpenisr, LOW);
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  sleep_mode();
  sleep_disable();}   
// SCHLAFMODUS 2 // ISR fuer TK Pin3 (Int.1). bei 328p MCU
void TKisr(void) {
  detachInterrupt(1);} // detach Interrupt, damit er nur einmal auftritt
void enter_sleep2(void) {
  attachInterrupt(1, TKisr, LOW);
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  sleep_mode();
  sleep_disable(); }

void setup() {
 pinMode(ZVOpen, INPUT_PULLUP); //Der Pin mit dem ZVOpen Anschluss (Pin 2) ist jetzt ein Eingang. Mit Interrupt
 pinMode(TK, INPUT_PULLUP); //Der Pin mit dem TK Anschluss (Pin 3) ist jetzt ein Eingang. Mit Interrupt
 pinMode(Zuendplus, INPUT_PULLUP); //Der Pin mit dem Zuendplus Anschluss (Pin 8) ist jetzt ein Eingang.
 pinMode(ZVClose, INPUT_PULLUP); //Der Pin mit dem ZVClose Anschluss (Pin 9) ist jetzt ein Eingang.
 strip1.begin();
 T.SetTimer(0,1,0); // Timer Einstellung, Stunde/Min./Sek.
 T.StartTimer();
}
Langsam ist Präzise und Präzise ist schnell ;)

Akropolis

Code: [Select]

void loop() {
 TKStatus=digitalRead(TK);
 ZVOpenStatus=digitalRead(ZVOpen);
 ZVCloseStatus=digitalRead(ZVClose);
 ZuendplusStatus=digitalRead(Zuendplus);
 static uint32_t jetzt = 0, farbMillis = 0, verzoegerung = 0;
 jetzt = millis();
 
            if (TKStatus == HIGH && ZVOpenStatus == HIGH && ZVCloseStatus == HIGH && ZuendplusStatus == HIGH && (verzoegerung == 0))  // Türe Zu ohne ohne zuendplus
              { detachInterrupt(0);                              // Hier gehts nach dem Schlafen weiter: ZV Open
                detachInterrupt(1);                              // Hier gehts nach dem Schlafen weiter: Tuerkontakt TK Open
                strip1.setPixelColor(0, strip1.Color(30,30,30)); // weiss gedimmt      led 1
                strip1.setPixelColor(1, strip1.Color(30,30,30)); // weiss gedimmt      led 2
                strip1.setPixelColor(2, strip1.Color(30,30,30)); // weiss gedimmt      led 3
                strip1.setPixelColor(3, strip1.Color(30,30,30)); // weiss gedimmt      led 4
                strip1.setPixelColor(4, strip1.Color(30,30,30)); // weiss gedimmt      led 5
                strip1.setPixelColor(5, strip1.Color(30,30,30)); // weiss gedimmt      led 6
                strip1.setPixelColor(6, strip1.Color(30,30,30)); // weiss gedimmt      led 7
                strip1.setPixelColor(7, strip1.Color(30,30,30)); // weiss gedimmt      led 8
                strip1.show();
                T.Timer(); // Startet den Timer
                }
            if (TKStatus==LOW||ZVOpenStatus==LOW||ZuendplusStatus==LOW||ZVCloseStatus==LOW) // Wenn einer der 4 Zustände zutrifft
              { T.ResetTimer(); }                                                           // Resetet den Timer wieder auf den vor eingestellten Wert.
            if (T.Timer() == 0)                                                             // Wenn Timer abgeloffen = 0 Sek. mache..
              { LEDOFF(); }                                                                 // Sleep Modus verlinkung
             
            if (TKStatus == HIGH && ZVOpenStatus == HIGH && ZVCloseStatus == HIGH && ZuendplusStatus == LOW) // Türe zu mit Zuendplus, für die Fahrt
              { strip1.setPixelColor(0, strip1.Color(36, 18,0)); // Gelb gedimmt      led 1
                strip1.setPixelColor(1, strip1.Color(36, 18,0)); // Gelb gedimmt      led 2
                strip1.setPixelColor(2, strip1.Color(36, 18,0)); // Gelb gedimmt      led 3
                strip1.setPixelColor(3, strip1.Color(36, 18,0)); // Gelb gedimmt      led 4
                strip1.setPixelColor(4, strip1.Color(36, 18,0)); // Gelb gedimmt      led 5
                strip1.setPixelColor(5, strip1.Color(36, 18,0)); // Gelb gedimmt      led 6
                strip1.setPixelColor(6, strip1.Color(36, 18,0)); // Gelb gedimmt      led 7
                strip1.setPixelColor(7, strip1.Color(36, 18,0)); // Gelb gedimmt      led 8
                strip1.show();}               
            if (TKStatus == LOW && ZVOpenStatus == HIGH && ZVCloseStatus == HIGH)                         // Türe Offen
              { strip1.setPixelColor(0, strip1.Color(255,255,255)); // weiss hell      led 1
                strip1.setPixelColor(1, strip1.Color(255,255,255)); // weiss hell      led 2
                strip1.setPixelColor(2, strip1.Color(255,255,255)); // weiss hell      led 3
                strip1.setPixelColor(3, strip1.Color(255,255,255)); // weiss hell      led 4
                strip1.setPixelColor(4, strip1.Color(255,255,255)); // weiss hell      led 5
                strip1.setPixelColor(5, strip1.Color(255,255,255)); // weiss hell      led 6
                strip1.setPixelColor(6, strip1.Color(255,255,255)); // weiss hell      led 7
                strip1.setPixelColor(7, strip1.Color(255,255,255)); // weiss hell      led 8
                strip1.show();}   
            if (TKStatus == HIGH && ZVOpenStatus == LOW && ZuendplusStatus == HIGH&&ZVCloseStatus == HIGH) // ZV Open
              { strip1.setPixelColor(0, strip1.Color(0,255,0)); // Gruen      led 1
                strip1.setPixelColor(1, strip1.Color(0,255,0)); // Gruen      led 2
                strip1.setPixelColor(2, strip1.Color(0,255,0)); // Gruen      led 3
                strip1.setPixelColor(3, strip1.Color(0,255,0)); // Gruen      led 4
                strip1.setPixelColor(4, strip1.Color(0,255,0)); // Gruen      led 5
                strip1.setPixelColor(5, strip1.Color(0,255,0)); // Gruen      led 6
                strip1.setPixelColor(6, strip1.Color(0,255,0)); // Gruen      led 7
                strip1.setPixelColor(7, strip1.Color(0,255,0)); // Gruen      led 8
                verzoegerung = 5000;   
                farbMillis = jetzt;
                strip1.show();} 
            if (ZVCloseStatus == LOW && TKStatus == HIGH&& ZuendplusStatus == HIGH && ZVOpenStatus == HIGH) // ZV Close
              { strip1.setPixelColor(0, strip1.Color(255,0,0)); // Rot      led 1
                strip1.setPixelColor(1, strip1.Color(255,0,0)); // Rot      led 2
                strip1.setPixelColor(2, strip1.Color(255,0,0)); // Rot      led 3
                strip1.setPixelColor(3, strip1.Color(255,0,0)); // Rot      led 4
                strip1.setPixelColor(4, strip1.Color(255,0,0)); // Rot      led 5
                strip1.setPixelColor(5, strip1.Color(255,0,0)); // Rot      led 6
                strip1.setPixelColor(6, strip1.Color(255,0,0)); // Rot      led 7
                strip1.setPixelColor(7, strip1.Color(255,0,0)); // Rot      led 8
                strip1.show();
                delay(5000);
                LEDOFF();}         
if ((jetzt - farbMillis >= verzoegerung) && (verzoegerung > 0))
 { verzoegerung = 0;
 }}

void LEDOFF()                                                 // ZV Close LEDs OFF
             {  strip1.setPixelColor(0, strip1.Color(0,0,0)); // Rot  OFF    led 1
                strip1.setPixelColor(1, strip1.Color(0,0,0)); // Rot  OFF    led 2
                strip1.setPixelColor(2, strip1.Color(0,0,0)); // Rot  OFF    led 3
                strip1.setPixelColor(3, strip1.Color(0,0,0)); // Rot  OFF    led 4
                strip1.setPixelColor(4, strip1.Color(0,0,0)); // Rot  OFF    led 5
                strip1.setPixelColor(5, strip1.Color(0,0,0)); // Rot  OFF    led 6
                strip1.setPixelColor(6, strip1.Color(0,0,0)); // Rot  OFF    led 7
                strip1.setPixelColor(7, strip1.Color(0,0,0)); // Rot  OFF    led 8
                strip1.show();
                // Schlafmodus //
                attachInterrupt(1, TKisr, LOW);               // Aktiviere Interrupt auf Pin3, TK           
                attachInterrupt(0, ZVOpenisr, LOW);           // Aktiviere Interrupt auf Pin2, ZV Open           
                set_sleep_mode(SLEEP_MODE_PWR_DOWN);          // Einstellung welcher Modus
                sleep_mode();                                 // Schlafen legen                                                             
                }
Langsam ist Präzise und Präzise ist schnell ;)

agmue

hey klasse die delay erseztung hat mir sehr geholfen.
Freut mich :)

Ansonsten nehme ich Tipps oder Kritik gerne entgegen.
Gratulation, Du gehörst zu den wenigen, die hier im Forum im Zusammenhang mit dem Thema Auto aufschlagen, die zu einem Ergebnis kommen und dies auch noch präsentieren. Dafür zolle ich Dir meinen ausdrücklichen Respekt!

Wenn das Programm tut, was Du Dir vorstellst, dann ist es ein gutes Programm, so wurde mir mal geschrieben. Das gebe ich weiter.

Solltest Du mal C++ mit Schleifen und Funktionen lernen wollen, dann melde Dich :)

Frohe Festtage!
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Akropolis

Freut mich :)
Gratulation, Du gehörst zu den wenigen, die hier im Forum im Zusammenhang mit dem Thema Auto aufschlagen, die zu einem Ergebnis kommen und dies auch noch präsentieren. Dafür zolle ich Dir meinen ausdrücklichen Respekt!

Wenn das Programm tut, was Du Dir vorstellst, dann ist es ein gutes Programm, so wurde mir mal geschrieben. Das gebe ich weiter.

Solltest Du mal C++ mit Schleifen und Funktionen lernen wollen, dann melde Dich :)

Frohe Festtage!

Das hört man gerne :) na wen es schon so nette Leute hier gibt die einem Helfen. Darf man / Sollte man auch ab und zu mal was fertiges Präsentieren :D

Danke Wünsche ich dir auch noch :)

Ja ich bin halt Schweizer.. wie willst du mir da C++ beibringen... im Heidiland :D
Langsam ist Präzise und Präzise ist schnell ;)

agmue

Das hört man gerne :) na wen es schon so nette Leute hier gibt die einem Helfen. Darf man / Sollte man auch ab und zu mal was fertiges Präsentieren :D
Das würde ich als Banner über das Forum schreiben wollen. Besonders frustrierend finde ich Themen, die einfach so mittendrin abbrechen. Erfolg, Aufgabe oder gesundheitliche Probleme (ja, gab es auch schon)? Daher schreibe ich jenen, die ein Thema mit einer Rückmeldung abrunden, ein extra Lob.

Ja ich bin halt Schweizer.. wie willst du mir da C++ beibringen... im Heidiland :D
Ein Klischee, aber gerne doch!

Heidi kam aus Frankfurt und beflügelte die Schweizer zu besonderen Leistungen. Das scheint doch eine gute Verbindung zu sein. Außerdem gäbe es ohne Weiterbildung und Fortschritt keine präzisen schweizer Uhren. Oder?

Heidi hätte die gepflückten Blumen doch auch nicht einfach so auf dem Tisch verteilt, sondern zu einem Strauß gebunden in eine Vase gestellt. Da könntest Du auch ein paar Programmzeilen zu einer Schleife bündeln.

Wenn Du aber lieber Dein Auto beleuchten möchtest, dann finde ich das auch gut, man muß halt Prioritäten setzen. Das tue ich auch, ich spaziere dann mal jetzt in der Sonne.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Akropolis

Mich würde interessieren, wie viel Strom Deine LEDs bei der Farbe Schwarz und Dein StepDown im Leerlauf benötigen.

mich auch.. mit so einem usb Spannungsmesser bekomme ich werte wen die leds lauffen, A und mAh anzeige.. im schlafmodus zeigt es mir selbst über nacht immer 0000 mAh an. also entweder unter 1mAh oder dass teil misst nicht so gut :D muss mal mit  Multimeter  messen. hab ja den grössten stromsparmodus PWR Down Mode. Led leuchtet noch mit halt ein Nano, aber im PWR Down modus schaltet der ja auch den Rest ab den usb treiber chip wird ja abgeschaltet. darum wohl so wenig verbrauch...
Langsam ist Präzise und Präzise ist schnell ;)

agmue

im schlafmodus zeigt es mir selbst über nacht immer 0000 mAh an.
Das ist etwas wenig. Mal zum Vergleich mein Aufbau 12V - StepDown - UNO - 9xAPA106(LEDs)
mit Strommessung in mA an 12V:

weiß240
schwarz33
UNO31
PWR_DOWN21

Wenn diese Schaltung in mein Auto sollte, würde ich die 12V mittels Schalter, Relais oder Selbsthaltung trennen, weil PWR_DOWN mit 10 mA nicht der Bringer ist.

Ich bin nun auf Deine Messung gespannt.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Akropolis

Das ist etwas wenig. Mal zum Vergleich mein Aufbau 12V - StepDown - UNO - 9xAPA106(LEDs)
mit Strommessung in mA an 12V:

weiß240
schwarz33
UNO31
PWR_DOWN21

Wenn diese Schaltung in mein Auto sollte, würde ich die 12V mittels Schalter, Relais oder Selbsthaltung trennen, weil PWR_DOWN mit 10 mA nicht der Bringer ist.

Ich bin nun auf Deine Messung gespannt.
Versuche ich morgen, Danke für deine auflistung. :) eventuell auf den arduino mini Pro umschreiben wen nötig. der ist ja Low power. auf meinem Nano jetzt noch die Betriebs led runter gelötet zum Messen.

Schalter kommt nicht in Frage :D Das währe sinnlos :D

Das Problem Mit nachlauf Relais/ Zeitverzögertes Relais oder kurzer Erhaltungs schaltung ist, beim Abschliessen habe ich dann zwar die 5 Sek Rot an der LED, aber wen ich aufschliesse will ich ja Sofort im innern 5 Sek Grün im Fussraum. 
Dazu gibbt es ja keine Möglichkeit ;) Sind ja keine Standart LED oder Sofitten Lampen im FZ welche ohne MCU auskommen.

Impuls der ZV für Open kommt, --> Relais schaltet arduino an den Strom. Dann brauchts 3 Sek bis die erste LED das Programm  Abarbeitet nach dem Code, vorher leuchten die Leds 3 Sek weiss Hell und Flackernd,  weil keine DIN Ansteuerung erfolgt während der Arduino Nano aufwacht :P Bleibt nur der Sleep Modus will ich eine wirklich direkte ansprechung der LED. ansonsten ist es mist... Habe ja eine 74Ah Batterie im Fahrzeug, Standart von 53bis60 Ah was angeboten wird für meinen FZ .. da sollte ich genug Reserve habe für Mehrere Module und Fahrzeug wird nie all zu lange stehe gelassen.

ach ja das Flackern könnte man mit einem verzgerungsreilais umgehen 2 sek wartend bis der arduino aufgewacht ist/ oder Gestartet ist. ist aber ja auch sinnlos weil der arduino dann immernoch 2-3 sek verspätet aufstartet und ich vlt schon die FZ türe in der Hand habe und es nicht mal mehr zum Grün leuchten kommt so wie ich es jezt programmiert habe.
Langsam ist Präzise und Präzise ist schnell ;)

Go Up