Modellbauer hat eine Frage zu seinem Sketch

Moin zusammen,

ich bin Modellbauer und möchte meine beleuchteten Modelle mit eine Arduino Nano und einer IR Fernbedienung ansteuern.

Den Sketch habe ich soweit auch geschrieben, aber eins verstehe ich nicht so ganz.

ich bin was das programmieren angeht noch totaler Anfänger.

die Ausgänge 11-17 geben keine volle Spannung ab und die Blinkfrequenz stimmt leider auch nicht, soll heißen wenn ich Taste OK,links oder rechts drücke glimmen die Ausgänge nur kurz auf.

kann mir jemand sagen wo mein Denkfehler liegt, vielen Dank

anbei der von mir erstellte Code

grüße Thomas

[code]
/* Programm zur realistischen Darstellung von Fahrzeugbeleuchtungen im Modellbau, gesteuert mit eine IR Fernbdienung */

#include <IRremote.hpp>

int eingang = 0; // Anschluss Empfaenger
int LED = 1; // Begrenzungslicht
int LED1 = 2; // Arbeitsscheinwerfer oder Rueckfahrscheinwerfer
int LED2 = 3; // Fernlicht oder Nebelscheinwerfer
int LED3 = 4; // Warnblinker
int LED4 = 5; // Frontblitzer
int LED5 = 9; // Heck oben links (1)
int LED6 = 10; // Heck zwei links (2)
int LED7 = 11; // Heck unten links (3)
int LED8 = 12; // Heck (4)
int LED9 = 13; // Heck (5)
int LED10 = 14; // Heck (6)
int LED11 = 15; // Heck (7)
int LED12 = 16; // Heck (8)
int LED13 = 17; // Heck (9)


int Taste0 = 0; // Schaltet alles aus
int Taste1 = 0; // Schaltet Begrenzungslicht
int Taste2 = 0; // Schaltet Arbeitsscheinwerfer
int Taste3 = 0; // Schaltet Fernlicht oder Nebelscheinwerfer
int Taste4 = 0; // Schaltet Warnblinker
int Taste5 = 0; // Schaltet Frontblitzer
int Taste6 = 0; // Schaltet Rundumlicht
int Taste7 = 0; // ohne Funktion
int Taste8 = 0; // ohne Funktion
int Taste9 = 0; // ohne Funktion
int TasteOK = 0; // Schaltet X
int Tasterechts = 0; // Schaltet Pfeil rechts
int Tastelinks = 0; // Schaltet Pfeil links

int StatusLed = HIGH;   // Alle werde im Aus Zustand auf den HIGH Zustatnd versetzt, weil GND geschaltet
int StatusLED1 = HIGH;
int StatusLED2 = HIGH;
int StatusLED3 = HIGH; 
int StatusLED4 = HIGH;
int StatusLED5 = HIGH;
int StatusLED6 = HIGH;
int StatusLED7 = HIGH;
int StatusLED8 = HIGH;
int StatusLED9 = HIGH;
int StatusLED10 = HIGH;
int StatusLED11 = HIGH;
int StatusLED12 = HIGH;
int StatusLED13 = HIGH;



unsigned long previousMillisLED3 = 0; // Warnblinker
unsigned long previousMillisLED4 = 0; // Frontblitzer
const long Interval3 = 500; // Zeit für Warnblinker in MS
const long Interval4 = 140; // Zeit für Frontblitzer in MS
unsigned long previousMillisLED5 = 0; // Blinkendes X
const long IntervallX = 400; // Zeit für Leitzeichen (X,rechts und links) in MS
unsigned long previousMillisLED12 = 0; // Blinkender Pfeil rechts
unsigned long previousMillisLED7 = 0; // Blinkender Pfeil links

int LEDrund [3] = {6,7,8}; // Rundumlicht (Anschluss 6,7 und 8)
int counter = 0;
unsigned long previousMillis = 0;
const long intervall = 100; //Zeit für den Wechsel zwischen LEDS der RUL
 


void setup() {
  {
  for (int i = 0;i < 3; i++)
  pinMode (LEDrund [i],OUTPUT);
}

 Serial.begin(9600);
 IrReceiver.begin(eingang);

 pinMode (LED, OUTPUT);
 pinMode (LED1, OUTPUT);
 pinMode (LED2, OUTPUT);
 pinMode (LED3, OUTPUT);
 pinMode (LED4, OUTPUT);
 pinMode (LED5, OUTPUT);
 pinMode (LED6, OUTPUT);
 pinMode (LED7, OUTPUT);
 pinMode (LED8, OUTPUT);
 pinMode (LED9, OUTPUT);
 pinMode (LED10, OUTPUT);
 pinMode (LED11, OUTPUT);
 pinMode (LED12, OUTPUT);
 pinMode (LED13, OUTPUT);
 }
 

void loop() {
  if (IrReceiver.decode()) {
    IrReceiver.printIRResultShort (&Serial);
    switch (IrReceiver.decodedIRData.command) {
      case 0x45: // Schaltet Begrenzungslicht ein oder aus
      if (Taste1 == 0){
        Taste1 = 1;
      }
      else {
        Taste1 = 0;
      } break;
      case 0x46: // schaltet Arbeitsscheinwerfer
      if (Taste2 == 0){
        Taste2 = 1;
      }
      else {
        Taste2 = 0;
      } break;
      case 0x47: // Fernlicht
      if (Taste3 == 0){
        Taste3 = 1;
      }
      else{
        Taste3 = 0;
      } break;
      case 0x44: //Warnblinker
      if (Taste4 == 0){
        Taste4 = 1;
      }
      else {
        Taste4 = 0;
      } break;
      case 0x40: //Frontblitzer
      if (Taste5 == 0){
        Taste5 = 1;
      }
      else {
        Taste5 = 0;
      } break;
      case 0x43: //Rundumlicht
      if (Taste6 == 0){
        Taste6 = 1;
      }
      else {
        Taste6 =0;
      }break;
      case 0x7: //
      if (Taste7 == 0){
        Taste7 =1;
      }
      else{
        Taste7 = 0;
      }break;
      case 0x15: //
      if (Taste8 == 0){
        Taste7 = 1;
      }
      else{
        Taste8 = 0;
      }break;
      case 0x9:  //
      if (Taste9 == 0){
        Taste9 = 1;
      }
      else {
        Taste9 = 0;
      }break;
      case 0x19: // schaltet alles aus
      if (Taste0 == 0){
        Taste0 = 1;
      }
      else {
        Taste0 = 0;
      }break;
      case 0x1c: // Schaltet x
      if (TasteOK == 0){
        TasteOK = 1;
      }
      else {
        TasteOK = 0;
      }break;
      case 0x8: //Pfeil links
      if (Tastelinks == 0){
        Tastelinks = 1;
      }
      else {
        Tastelinks = 0;
      }break;
      case 0x5A: //Pfeil rechts
      if (Tasterechts == 0){
        Tasterechts = 1;
      }
      else{
        Tasterechts = 0;
      }break;
      default:
      break;
    }
    delay (150);
    IrReceiver.resume();
  }
  if (Taste1 == 1) {
    digitalWrite (LED, LOW);
  }
  else{
    digitalWrite (LED, HIGH);
  }
  if (Taste2 == 1) {
    digitalWrite (LED1, LOW);
  }
  else{
    digitalWrite (LED1, HIGH);
  }
  if (Taste3 == 1) {
    digitalWrite (LED2,LOW);
  }
  else{
    digitalWrite (LED2,HIGH);
  }
  if (Taste4 == 1) {
    loop_LED3 ();
  }
  else{
    digitalWrite (LED3, HIGH);
  }
  if (Taste5 == 1) {
    loop_LED4 ();
  }
  else{
    digitalWrite (LED4, HIGH);
  }
  if (Taste6 == 1) {
    loop_rund ();
  }
  else{
    digitalWrite (LEDrund [1],HIGH);
    digitalWrite (LEDrund [2],HIGH);
    digitalWrite (LEDrund [3],HIGH);
  }
  if (TasteOK == 1) {
    loop_LED5 ();
  }
  else {
    digitalWrite (LED5, HIGH);
    digitalWrite (LED7,HIGH);
    digitalWrite (LED8, HIGH);
    digitalWrite (LED9, HIGH);
    digitalWrite (LED10, HIGH);
    digitalWrite (LED12, HIGH);
  }
  if (Tasterechts == 1){
    loop_LED12 ();
  }
  else{
    digitalWrite (LED5, HIGH);
    digitalWrite (LED7, HIGH);
    digitalWrite (LED8, HIGH);
    digitalWrite (LED10, HIGH);
    digitalWrite (LED11, HIGH);
    digitalWrite (LED12, HIGH);
    digitalWrite (LED13, HIGH);
  }
  if (Tastelinks == 1){
    loop_LED7 ();
  }
  else{
    digitalWrite (LED5, HIGH);
    digitalWrite (LED6, HIGH);
    digitalWrite (LED7, HIGH);
    digitalWrite (LED9, HIGH);
    digitalWrite (LED10, HIGH);
    digitalWrite (LED12, HIGH);
    digitalWrite (LED13, HIGH);
  }
  if (IrReceiver.decodedIRData.command == 0x19)
  {
    Taste1 = 0;
    Taste2 = 0;
    Taste3 = 0;
    Taste4 = 0;
    Taste5 = 0;
    Taste6 = 0;
    Taste7 = 0;
    Taste8 = 0;
    Taste9 = 0;
    TasteOK = 0;
    Tasterechts = 0;
    Tastelinks = 0;
  }
}
void loop_LED3 () {
  unsigned long currentMillisLED3 = millis ();
  if (currentMillisLED3 - previousMillisLED3 >= Interval3)
  {
    previousMillisLED3 = currentMillisLED3;
    if (StatusLED3 == HIGH){
      StatusLED3 = LOW;
    }
    else{
      StatusLED3 = HIGH;
    }
    digitalWrite (LED3, StatusLED3);
  }
}
void loop_LED4 (){
  unsigned long currentMillisLED4 = millis ();
  if (currentMillisLED4 - previousMillisLED4 >= Interval4)
  {
    previousMillisLED4 = currentMillisLED4;
    if (StatusLED4 == HIGH){
      StatusLED4 = LOW;
    }
    else{
      StatusLED4 = HIGH;
    }
    digitalWrite (LED4, StatusLED4);
  }
}
void loop_rund (){
  unsigned long currentMillis = millis ();
  if (currentMillis - previousMillis >= intervall){
    previousMillis = currentMillis;
    if (counter == 0){
      digitalWrite (LEDrund [2],HIGH);
    }
    else{
      digitalWrite(LEDrund [counter - 1], HIGH);
    }
    digitalWrite (LEDrund [counter], LOW);
    counter = counter +1;
    if (counter >2){
      counter = 0;
    }
  }
}
void loop_LED5 (){
  unsigned long currentMillisLED5 = millis();
  if (currentMillisLED5 - previousMillisLED5 >= IntervallX){
    previousMillisLED5 = currentMillisLED5;
    if (StatusLED5 == HIGH){
      StatusLED5 = LOW;
      if (StatusLED7 == HIGH){
        StatusLED7 = LOW;
        if (StatusLED8 == HIGH){
          StatusLED8 = LOW;
          if (StatusLED9 == HIGH){
            StatusLED9 = LOW;
            if (StatusLED10 == HIGH){
              StatusLED10 = LOW;
              if (StatusLED11 == HIGH){
                StatusLED11 = LOW;
              }
            }
          }
        }
      }
    }
  }else{
    StatusLED5 = HIGH;
    StatusLED7 = HIGH;
    StatusLED8 = HIGH;
    StatusLED9 = HIGH;
    StatusLED10 = HIGH;
    StatusLED11 = HIGH;
  }
  digitalWrite (LED5, StatusLED5);
  digitalWrite (LED7, StatusLED7);
  digitalWrite (LED8, StatusLED8);
  digitalWrite (LED9, StatusLED9);
  digitalWrite (LED10, StatusLED10);
}
void loop_LED12 (){
  unsigned long currentMillisLED12 = millis ();
  if (currentMillisLED12 - previousMillisLED12 >= IntervallX){
    previousMillisLED12 = currentMillisLED12;
    if (StatusLED5 == HIGH){
      StatusLED5=LOW;
      if (StatusLED7 == HIGH){
        StatusLED7=LOW;
        if(StatusLED8==HIGH){
          StatusLED8=LOW;
          if(StatusLED10==HIGH){
            StatusLED10=LOW; 
           if (StatusLED11==HIGH){
              StatusLED11=LOW;
              if (StatusLED12==HIGH){
                StatusLED12=LOW;
                if(StatusLED13==HIGH){
                  StatusLED13=LOW;
                }
              }
            }
          }
        }
      }
    }
  }
  else{
    StatusLED5=HIGH;
    StatusLED7=HIGH;
    StatusLED8=HIGH;
    StatusLED10=HIGH;
    StatusLED11=HIGH;
    StatusLED12=HIGH;
    StatusLED13=HIGH;
  }
  digitalWrite (LED5, StatusLED5);
  digitalWrite (LED7,StatusLED7);
  digitalWrite (LED8,StatusLED8);
  digitalWrite (LED10,StatusLED10);
  digitalWrite (LED11,StatusLED11);
  digitalWrite (LED12,StatusLED12);
  digitalWrite (LED13,StatusLED13);
}
void loop_LED7 (){
  unsigned long currentMillisLED7 = millis ();
  if (currentMillisLED7 - previousMillisLED7 >= IntervallX){
    previousMillisLED7 = currentMillisLED7;
    if (StatusLED5 == HIGH){
      StatusLED5=LOW;
      if (StatusLED6 == HIGH){
        StatusLED6=LOW;
        if(StatusLED7==HIGH){
          StatusLED7=LOW;
          if(StatusLED9==HIGH){
            StatusLED9=LOW; 
           if (StatusLED10==HIGH){
              StatusLED10=LOW;
              if (StatusLED12==HIGH){
                StatusLED12=LOW;
                if(StatusLED13==HIGH){
                  StatusLED13=LOW;
                }
              }
            }
          }
        }
      }
    }
  }
  else{
    StatusLED5=HIGH;
    StatusLED6=HIGH;
    StatusLED7=HIGH;
    StatusLED9=HIGH;
    StatusLED10=HIGH;
    StatusLED12=HIGH;
    StatusLED13=HIGH;
  }
  digitalWrite (LED5, StatusLED5);
  digitalWrite (LED6,StatusLED6);
  digitalWrite (LED7,StatusLED7);
  digitalWrite (LED9,StatusLED9);
  digitalWrite (LED10,StatusLED10);
  digitalWrite (LED12,StatusLED12);
  digitalWrite (LED13,StatusLED13);
}


[/code]

was für ein Board ist das?

kannst du kurz beschreiben was macht dein Sketch und di ganzen identischen Funktionen?

hoffentlich du hast die LEDs nicht direkt an Arduino Pin angeschlossen

@thomas1911
Dein Sketch ist falsch aufgebaut.
Die Abfrage der Tasten läuft so schnell durch, dass die Led gleich wieder aus geht.
Du musst die Info zwischenspeichern.

Ja.

Ich kann nur empfehlen den Sketch aufzuräumen:

  • verwende array´s für die LEDs
  • verwende switch/case als Ersatz für den if/else/if Salat
  • und viele geschachtelte if´s und andere Programmlogik, die ich nicht verstehe

so geht es einfacher

      case 0x44: //Warnblinker
      
        Taste4 = !Taste4;
      
       break;
  if (millis() - WarnblinkerMillis >= Warnblinker_Interval)
  {
    WarnblinkerMillis += Warnblinker_Interval;
    digitalWrite (WarnblinkerLED, ! digitalRead( WarnblinkerLED ) );
  }

Hallo Kolaha,

das Board ist ein Nano

die Tasten 1-3 sollen LED´s (LED-LED2) ein bzw ausschalten,
Taste 4 schaltet die Warnblinkerfunktion (LED3) ein bzw aus,
Taste 5 schaltet die Frontblitzerfunktion (LED4) ein bzw aus,
Taste 6 schaltet die Funktion Rundumleuchte ein bzw aus,
Taste OK soll ein blinkendes X schalten LED5;7;8;9;10 und 12
Taste rechts soll einen Blinkenden Pfeil schalten LED5;7;8;10;11;12 und 13
Taste links soll einen Blinkenden Pfeil schalten LED5,6,7,9,10,12 und 13

und nein die LED`s sind nicht direkt an den Arduino pin angeschlossen, da ist ein entsprechender Widerstand zwischengeschaltet

also das delay länger machen ??

Bitte nicht.
Bau den Sketch ohne delay() auf. Anders blockierst du dich selbst.

Ohne delay() geht mit der Funktion "millis". dazu kannst du dir das Beispiel "BlinkWithoutDelay" in der IDE anschauen.

Du musst den Wert "Led an" zwischen speichern und dann erst darauf reagieren und wieder speichern "Led aus".

ich glaube ich habe mich in meinem Anfangspost falsch ausgedrückt

es funktioniert alles bis auf

das blinkende X
der pfeil links sowie rechts
hier scheint es mir so das die Ausgange nur eine geringere Spannung ausgeben und die Blinkfrequenz stimmt nicht.

Die 0 und 1 frei lasen ist für Kommunikation zw Nano und PC, auf manchen Nanos stecht drauf D1/ TX und D0/RX.

Der Schein trügt.

Also die helligkeit ist defenitiv geringer.
wenn ich eine von den LEDS an einen anderen Ausgang hänge leuchtet sie kräftiger

Ich gebe Dir mal den guten Tipp: Datenblatt lesen!
ABSOLUTE MAXIMUM
Ein PIN darf maximal 40mA
ABER!
Ein PORT maximal 100mA
ABER!
Der gesamte Chip nur 200mA

Wenn Du alle Deine LED's leuchten lassen willst, darfst Du auf einer LED nicht mehr als 100/8(leds) oder 200/17(leds) -> der geringere Wert zählt.
Somit 200/17=11mA -> Ich empfehle 17*8-9mA, was einen Maximum von 136-153mA ausmachen würde. Auf einem Port lägen dann 8*9=>max 72mA.
Danch musst Du jetzt Deine Vorwiderstände berechnen.
Dann leuchten die auch alle gleich.
Wenn der Chip nicht schon was weg hat...

In der Zwischenzeit schau ich mal auf Deinen Code.
Der sieht mir sehr verückt aus :slight_smile:

Ok ich schau morgen mal nach der stromaufnahme und rechne den Widerstand nochmal nach

sag mal, Du hast eine Fläche mit LEDS, die sowohl einen Pfeil links/rechts als auch ein X darstellen sollen.

Kannst Du das mal in ASCII-Art aufmalen, wie die LED angeordnet sind?

ASCII sagt mir jetzt gerade nichts

Ich versuche es mal so darzustellen

X X X X. 1 6
X X X X. 2. 4 5 7
X X X X. 2. 5 4 7
X X X X. 3 9 9. 8

1 = Led5
2=Led6
3=led7
4=led8
5=led9
6=led10
7=led11
8=led12
9=led13

Ich hoffe das hilft

Ich hab das mal auf die LED PINs aufgelöst:

05       10
06 08 09 11
06 09 08 11
07 13 13 12

Für X: 5, 7, 10, 12, 8, 9
Für links: 6, 7, 9, 10, 13
Für rechts: 5, 8, 11, 12, 13

Ich schau mal, ob ich Dir das noch heute baue.
Du wirst aber umklemmen müssen, da ich 0 und 1 nicht benutze -> bzw. nur den IR-Empfänger auf der seriellen lege, damit sich das nicht beisst.

Das dem Umbau ist kein Problem,

Ich baue mir bei neuen Sachen eh immer das ganze auf einem testboard auf

Ich bedanke mich schon mal für deine Hilfe

Las mir mal noch ein paar Minuten.
Es wird evtl. nicht ganz fertig, aber zumindest aufgeräumt :wink:

1 Like