Bremslicht für RC-Auto programmieren

Dann änder mal den Hysteresewert.
Wenn der um 5 bis 10 erhöht wird, ist wahrscheinlich noch genügend Platz.

Ansonsten müsste man wirklich das setzen der lastForwardTime erst dann ausführen, wenn eine bestimmte Zeit forward läuft, oder ein einzelner Mindestwert erfüllt ist.

Für den Blinker und das Backfire hab ich mal was eingebastelt.

const byte bremsLichtPin = LED_BUILTIN;
const byte backFirePin = 12;
const byte linksBlinkPin = 11;
const byte rechtsBlinkPin = 10;
const uint8_t numCh = 5;
const uint8_t chInputPin[numCh] = {A2, A3, A4, A5, A0};
const char myType[numCh][10] = {"gas", "taster", "3-pos", "poti-1", "poti-2"};
volatile uint16_t aktChTime[numCh] = {0};
volatile uint16_t altChTime[numCh] = {0};
volatile bool aktChStatus[numCh] = {0};
volatile bool altChStatus[numCh] = {0};
volatile uint16_t altChInput[numCh] = {0};

uint16_t chInput[numCh] = {0};

void setup()
{
  Serial.begin(115200);
  delay(500);
  Serial.println("\nStart ...");
  for (byte b = 0; b < numCh; b++)
  {
    pinMode(chInputPin[b], INPUT);
  }
  digitalWrite(bremsLichtPin, LOW);
  pinMode(bremsLichtPin, OUTPUT);
  pinMode(backFirePin, OUTPUT);
  pinMode(linksBlinkPin, OUTPUT);
  pinMode(rechtsBlinkPin, OUTPUT);
  PCICR |= B00000010;   // Enable PCIE1 Bit2 = 1 (Port C)
  PCMSK1 |= B00000111;  // Enable PCINT16  & PCINT17 & PCINT18 (Pins A0 & A1 & A2)
  randomSeed(A1);
}

void loop()
{
  printSerialChInput();
  myBremsLicht();
  backFire();
  blinkLicht();
}

ISR (PCINT1_vect)  // Port C Interrupt occured
{
  for (byte b = 0; b < numCh; b++)
  {
    aktChStatus[b] = digitalRead(chInputPin[b]);
    if (altChStatus[b] != aktChStatus[b])
    {
      altChStatus[b] = aktChStatus[b];
      if (aktChStatus[b])
      {
        altChInput[b] = micros();
      }
      else
      {
        aktChTime[b] = micros() - altChInput[b];
      }
    }
  }
}

void printSerialChInput()
{
  for (byte b = 0; b < numCh; b++)
  {
    if (abs(int(altChTime[b] - aktChTime[b])) > 10)
    {
      Serial.print(myType[b]);
      Serial.print(": ");
      Serial.print(aktChTime[b]);
      Serial.println('\t');
      altChTime[b] = aktChTime[b];
    }
  }
}


void blinkLicht()
{
  enum status {links, aus, rechts};
  static byte zustand = status::aus;
  const uint32_t blinkTime = 500;
  uint32_t lastBlinkTime = 0;
  if ((aktChTime[5] < 1600) && (aktChTime[5] > 1400))
  { zustand = status::aus; }
  switch (zustand)
  {
    case links:
      if (millis() - lastBlinkTime > blinkTime)
      {
        lastBlinkTime = millis();
        digitalWrite(linksBlinkPin, !digitalRead(linksBlinkPin));
      }
      break;
    case aus:
      digitalWrite(linksBlinkPin, LOW);
      digitalWrite(rechtsBlinkPin, LOW);
      if (aktChTime[5] > 1700)
      {
        zustand = links;
        digitalWrite(linksBlinkPin, HIGH);
        lastBlinkTime = millis();
      }
      if (aktChTime[5] < 1300)
      {
        zustand = rechts;
        digitalWrite(rechtsBlinkPin, HIGH);
        lastBlinkTime = millis();
      }
      break;
    case rechts:
      if (millis() - lastBlinkTime > blinkTime)
      {
        lastBlinkTime = millis();
        digitalWrite(rechtsBlinkPin, !digitalRead(rechtsBlinkPin));
      }
      break;
  }
}


void backFire()
{
  const uint16_t minSpeed = 1700;
  static uint32_t blinkTime = 0;
  static uint32_t lastFireTime = 0;
  if (aktChTime[0] > minSpeed)
  {
    if (millis() - lastFireTime > blinkTime)
    {
      blinkTime = random(200, 1200);
      digitalWrite(backFirePin, !digitalRead(backFirePin));
      lastFireTime = millis();
    }
  }
  else
  { digitalWrite(backFirePin, LOW); }
}
//
void myBremsLicht()
{
  enum condition {forward, neutral, backward};         //
  static byte myState = condition::neutral;
  static uint32_t lastForwardTime = 0;                 // Zeitmerker
  const uint32_t reaktionsZeit = 200;                  // Zeit in ms... Das muss getestet werden
  const uint16_t neutralSpeed = 1490;                  // Hier ist nüscht
  const uint8_t  hysterese = 21;                       // Pendel der Neutralstellung +/-
  switch (myState)
  {
    case condition::forward:
      if (aktChTime[0] < neutralSpeed + hysterese)       // Neutralbereich erreicht?
      {
        myState = condition::neutral;                  // Zustand setzen
        lastForwardTime = millis();                    // Zeit merken
      }
      if (aktChTime[0] < neutralSpeed - hysterese)       // Neutralbereich unterschritten?
      {
        myState = condition::backward;
      }
      break;
    case condition::neutral:
      if (aktChTime[0] < neutralSpeed - hysterese)       // Neutralbereich rückwärts verlassen?
      {
        myState = condition::backward;
      }
      else if (aktChTime[0] > neutralSpeed + hysterese)  // Neutralbereich vorwärts verlassen?
      {
        myState = condition::forward;
      }
      digitalWrite(bremsLichtPin, LOW);                // Bremse deaktivieren
      break;
    case condition::backward:
      if (millis() - lastForwardTime < reaktionsZeit)  // Zeit nicht abgelaufen ...
      {
        digitalWrite(bremsLichtPin, HIGH);  // ... Bremse aktiviert!
      }
      if (aktChTime[0] > neutralSpeed - hysterese)       // Neutralbereich vorwärts verlassen?
      {
        myState = condition::neutral;  // Zustand setzen
      }
      break;
  }
}

Achso, verstehe, klingt auch logisch :+1:

Stimmt, das hab ich außer Acht gelassen.
Also, jetzt noch kurz wie der auf 5 Kanäle erweiterte #27 Sketch war: deutliche Verzögerungen. Habe noch bisschen am giveUp rumprobiert: auf 10000 gestellt, da ging gar nichts mehr, ebenso wie auf 20000 und 30000. Bei 40000 hat das Bremslicht wieder funktioniert, aber immer noch mit stark spürbarem delay (kaum Unterschied zu giveUp = 50000). Im Vergleich ist also #35 um einiges besser.

Denke mal NANO. Bis jetzt habe ich noch nichts bestellt und hatte eben vor, mit dem UNO erstmal alles auszuprobieren. Je unkomplizierter letztendlich der Sketch vom UNO dann auf einen kleineren Arduino übertragen werden kann, desto besser.

Ne, die kenn ich nicht … ich dachte einfach an transparente standard 5mm common cathode RGB LEDs. Für meine Zwecke muss ich ja eigentlich sowieso nur die Helligkeit von der blauen LED steuern können. Grün und Rot kann ja dauerhaft auf 100% sein …

Ich glaube, die Pins vom UNO und auch vom NANO reichen aus. Wie gesagt, die OUTPUT Pins sollen Transistoren aktivieren, an welche die LEDs angeschlossen sind. Der Strom für die LEDs kommt dann direkt vom RC-Empfänger und muss nicht durch den Arduino durch. Somit kann ich also auch mehr als zwei LEDs mit einem Pin steuern.

Ja, in der Tat :sweat_smile:
Ums übersichtlicher zu machen, habe ich mal die UNO Pins beschriftet:

  • Analog Pins als Inputs
  • Pin 13: Das „dritte Bremslicht“ ist das, was hier programmiert wurde: ausschließlich beim Bremsvorgang an, ansonsten ausgeschaltet.
  • Pin 11: Das „Brems-/Rückfahrlicht“ soll mit PWM gedimmt sein, nur wenn gebremst wird, auf 100% Helligkeit springen.
  • Pin 10: Das „Rücklicht“ soll mit PWM dauerhaft auf die gleiche Helligkeit von Pin 11 gedimmt sein
  • Pin 5&6: Wäre schick, wenn die vorderen Blinker dauerhaft gedimmt eingeschaltet sind (so ne Art orangenes Standlicht, so wie es in den USA üblich ist). Wenn der Blinker an ist, sollen sie zwischen gedimmt und 100% Helligkeit wechseln.
  • Pin 9: Die Türgriff-Beleuchtung stelle ich mir so vor: https://img.motor-talk.de/JxZPwqarPWT0vb0h.131.jpg. Diese LEDs sollen natürlich nicht zu hell leuchten … sie könnten entweder ebenfalls mit PWM gedimmt werden, oder mit einem hohen Widerstand …

Noch was zur Verwendung von CH3: Der könnte z. B. so verwendet werden:

  • 1 Click = Warnblinkanlage an/aus.
  • Doppelclick = Türgriff-Beleuchtung an/aus.
  • 3× Click = Backfire an/aus
  • Longpress = Nebelscheinwerfer an/aus.
    … oder so ähnlich …

Die UNO-Programme laufen auch auf einem Nano.

grafik

Die werden für USB benötigt!

Ahh, da wusste ich nicht genau, ob und wie diese zwei Pins verwendet werden können … Die können dann also auch nicht verwendet werden, wenn der Arduino gar nicht mehr mit dem Computer verbunden ist oder? Der Arduino, der letztendlich in meinem RC-Modell sein wird, ist ja logischerweise nicht mehr mit dem Computer verbunden.

Wenn Pin 0 und 1 frei bleiben müssen, könnten Frontscheinwerfer und die Türgriff-LEDs zusammen auf Pin A1. Frontscheinwerfer auf maximale Helligkeit und Türgriff-LEDs mit höheren Widerständen dimmen. Die Rückfahrscheinwerfer könnten somit auf Pin 9. Würde das nicht funktionieren?

Da Du ja LED-Treiber verwenden wirst, dürften die recht hochohmig an den digitalen Pins angeschlossen sein. Möglicherweise funktioniert das dann sogar, probiert habe ich es aber noch nicht. Testausgaben auf den seriellen Monitor funktionieren dann aber nicht mehr, daher würde ich das nicht machen.

Oder Du nimmst den ProMini wie von @agmue in #40 vorgeschlagen.
Da gibt es noch zwei Pin A6 und A7 die liessen sich als Inputs mitnutzen.
Müsste man missbrauchen...
Mit den kleinen Megas habe ich i.Ü. auch gute Erfahrungen gemacht. :slight_smile:

Hab's gerade getestet: Bei einer Erhöhung von 5 bis 10 habe ich keinen Unterschied feststellen können. Allerdings habe ich ihn dann einfach weiter und weiter erhöht und bei einem Hysteresewert von 200 ist das Problem weggegangen. Bei hysterese = 300 wurde es dann wieder schlechter. Deswegen habe ich es jetzt einfach mal auf 200 gelassen :grin:.

Soeben getestet, siehe Video: https://www.youtube.com/shorts/zgLayFSfnuA
Das konnte ich beobachten:

      if (aktChTime[5] > 1700)

… habe ich zu …

      if (aktChTime[4] > 1700)

… geändert (damit die Blinker mit CH6 funktionieren).

  • Das Bremslicht funktioniert gut (mit hysterese = 200).
  • Backfire geht bei ungefähr halb gedrücktem Vorwärts-Gas an und blinkt relativ langsam (siehe Video). Wäre vielleicht besser, wenn es erst kurz vor Vollgas anspringt und schneller blinkt (wie hier zu sehen: https://youtu.be/taLOaiiBFOA?t=15).
  • Die Blinker waren falsch herum, deswegen habe ich einfach die Zahlen vertauscht. Sprich, linksBlinkPin = 10 und rechtsBlinkPin = 11 war dann richtig herum. Allerdings blinken sie nicht, sondern gehen einfach nur an (sieht man auch auf dem Video). Ansonsten funktioniert es aber sehr gut mit dem CH6-Potentiometer. Einfach nach rechts/links drehen und die dementsprechende LED springt zuverlässig an :smiley:!

@agmue dann machen wir das besser so wie hier beschrieben, oder?

Sollte das nicht funktionieren, findet sich bestimmt eine Alternative :wink:

Ach ja, Du nutzt ja ch1 nicht - dann ist's natürlich logisch... Meine Logik mir nen Streich gespielt.
Die Zuordnung der Blinker war blind - dein Schematic habe ich grad gesehen.
Das mit dem Blinken schau ich nochmal.

Dann hab ich das mit dem bremsen gelesen. Da brauchts für die PWM's nur eine zusätzliche Zeile. Fürs Licht muss man sehen.

Die Blinker vorne gehen dann genauso wie die Bremslichter zu steuern.
ich schau mal, was mir da unter gegangen ist.

Habe gerade gemerkt, dass mir das gleiche passiert ist, was das hier betrifft:

Das ist ja insofern unpraktisch, da ich mit CH3 ja nur noch Frontscheinwerfer und Türgriff-Beleuchtung zusammen an- und ausschalten kann. Beim fahren möchte ich aber die Frontscheinwerfer an und die Türgriff-LEDs aus haben …
Deswegen hier eine neue Idee: Ich leg die rote und grüne LED der RGB LED zusammen auf einen Pin (die müssen ja sowieso beide dauerhaft auf 100% Helligkeit) und habe dadurch wieder einen Pin frei. Somit sind Frontscheinwerfer und Türgriff-LEDs wieder unabhängig voneinander.
Hier mein neues Schematic …

[EDIT]: Habe Pin 2 und 4 vertauscht. Somit steckt die RGB LED an den zwei äußeren Pins. Ist so etwas übersichtlicher, auch für die Verkabelung etc. dann später … (Bild ist aktualisiert).

Und hier blinkt und backfired es. Und bremsen tuts auch.
Wenn Du alles angeschlossen hast, sollte das gehen.
[EDIT: PWM für Blinker vorne gesetzt]

const byte bremsLichtPin = LED_BUILTIN;
const byte backFirePin = 12;
const byte bremsLichtPwmPin = 11;
const byte rueckLichtPwmPin = 10;
const byte griffPwmPin = 9;
const byte rechtsBlinkPin = 8;
const byte linksBlinkPin = 7;
const byte rechtsBlinkPwmPin = 6;
const byte linksBlinkPwmPin = 5;

const uint8_t numCh = 5;
const uint8_t chInputPin[numCh] = {A2, A3, A4, A5, A0};
const char myType[numCh][10] = {"gas", "taster", "3-pos", "poti-1", "poti-2"};
volatile uint16_t aktChTime[numCh] = {0};
volatile uint16_t altChTime[numCh] = {0};
volatile bool aktChStatus[numCh] = {0};
volatile bool altChStatus[numCh] = {0};
volatile uint16_t altChInput[numCh] = {0};

uint16_t chInput[numCh] = {0};

void setup()
{
  Serial.begin(115200);
  delay(500);
  Serial.println("\nStart ...");
  for (byte b = 0; b < numCh; b++)
  {
    pinMode(chInputPin[b], INPUT);
  }
  for (byte b = 3; b <= 13; b++) // Output setzen anhand PIN Nummern.
  {
    digitalWrite(b, LOW);
    pinMode(b, OUTPUT);
  }
  /*
    digitalWrite(bremsLichtPin, LOW);
    pinMode(bremsLichtPin, OUTPUT);
    pinMode(backFirePin, OUTPUT);
    pinMode(linksBlinkPin, OUTPUT);
    pinMode(rechtsBlinkPin, OUTPUT);
  */
  PCICR |= B00000010;   // Enable PCIE1 Bit2 = 1 (Port C)
  PCMSK1 |= B00000111;  // Enable PCINT16  & PCINT17 & PCINT18 (Pins A0 & A1 & A2)
  randomSeed(A1);
}

void loop()
{
  printSerialChInput();
  myBremsLicht();
  backFire();
  blinkLicht();
}

ISR (PCINT1_vect)  // Port C Interrupt occured
{
  for (byte b = 0; b < numCh; b++)
  {
    aktChStatus[b] = digitalRead(chInputPin[b]);
    if (altChStatus[b] != aktChStatus[b])
    {
      altChStatus[b] = aktChStatus[b];
      if (aktChStatus[b])
      {
        altChInput[b] = micros();
      }
      else
      {
        aktChTime[b] = micros() - altChInput[b];
      }
    }
  }
}

void printSerialChInput()
{
  for (byte b = 0; b < numCh; b++)
  {
    if (abs(int(altChTime[b] - aktChTime[b])) > 10)
    {
      Serial.print(myType[b]);
      Serial.print(": ");
      Serial.print(aktChTime[b]);
      Serial.println('\t');
      altChTime[b] = aktChTime[b];
    }
  }
}


void blinkLicht()
{
  enum status {links, aus, rechts};
  static byte zustand = status::aus;
  const uint32_t blinkTime = 500;
  static uint32_t lastBlinkTime = 0;
  if ((aktChTime[4] < 1600) && (aktChTime[4] > 1400))
  { zustand = status::aus; }
  switch (zustand)
  {
    case links:
      if (millis() - lastBlinkTime > blinkTime)
      {
        lastBlinkTime = millis();
        digitalWrite(linksBlinkPin, !digitalRead(linksBlinkPin));
      }
       digitalRead(linksBlinkPin) ?
       analogWrite(linksBlinkPwmPin, 255) :
       analogWrite(linksBlinkPwmPin, 0);
      break;
    case aus:
      digitalWrite(linksBlinkPin, LOW);
      digitalWrite(rechtsBlinkPin, LOW);
      analogWrite(linksBlinkPwmPin, 50);
      analogWrite(rechtsBlinkPwmPin, 50);
      if (aktChTime[4] > 1700)
      {
        zustand = links;
        digitalWrite(linksBlinkPin, HIGH);
        lastBlinkTime = millis();
      }
      if (aktChTime[4] < 1300)
      {
        zustand = rechts;
        digitalWrite(rechtsBlinkPin, HIGH);
        lastBlinkTime = millis();
      }
      break;
    case rechts:
      if (millis() - lastBlinkTime > blinkTime)
      {
        lastBlinkTime = millis();
        digitalWrite(rechtsBlinkPin, !digitalRead(rechtsBlinkPin));
      }
       digitalRead(rechtsBlinkPin) ?
       analogWrite(rechtsBlinkPwmPin, 255) :
       analogWrite(rechtsBlinkPwmPin, 0);
      break;
  }
}


void backFire()
{
  const uint16_t minSpeed = 1880;
  static uint32_t blinkTime = 0;
  static uint32_t lastFireTime = 0;
  if (aktChTime[0] > minSpeed)
  {
    if (millis() - lastFireTime > blinkTime)
    {
      digitalWrite(backFirePin, !digitalRead(backFirePin));
      blinkTime = random(30, 100);
      if (!digitalRead(backFirePin))
      {
        blinkTime *= 3;
      }
      lastFireTime = millis();
    }
  }
  else
  { digitalWrite(backFirePin, LOW); }
}
//
void myBremsLicht()
{
  enum condition {forward, neutral, backward};         //
  static byte myState = condition::neutral;
  static uint32_t lastForwardTime = 0;                 // Zeitmerker
  const uint32_t reaktionsZeit = 200;                  // Zeit in ms... Das muss getestet werden
  const uint16_t neutralSpeed = 1490;                  // Hier ist nüscht
  const uint8_t  hysterese = 21;                       // Pendel der Neutralstellung +/-
  switch (myState)
  {
    case condition::forward:
      if (aktChTime[0] < neutralSpeed + hysterese)       // Neutralbereich erreicht?
      {
        myState = condition::neutral;                  // Zustand setzen
        lastForwardTime = millis();                    // Zeit merken
      }
      if (aktChTime[0] < neutralSpeed - hysterese)       // Neutralbereich unterschritten?
      {
        myState = condition::backward;
      }
      break;
    case condition::neutral:
      if (aktChTime[0] < neutralSpeed - hysterese)       // Neutralbereich rückwärts verlassen?
      {
        myState = condition::backward;
      }
      else if (aktChTime[0] > neutralSpeed + hysterese)  // Neutralbereich vorwärts verlassen?
      {
        myState = condition::forward;
      }
      digitalWrite(bremsLichtPin, LOW);                // Bremse deaktivieren
      analogWrite(bremsLichtPwmPin, 0);
      break;
    case condition::backward:
      if (millis() - lastForwardTime < reaktionsZeit)  // Zeit nicht abgelaufen ...
      {
        digitalWrite(bremsLichtPin, HIGH);  // ... Bremse aktiviert!
        analogWrite(bremsLichtPwmPin, 255);
      }
      if (aktChTime[0] > neutralSpeed - hysterese)       // Neutralbereich vorwärts verlassen?
      {
        myState = condition::neutral;  // Zustand setzen
      }
      break;
  }
}

Ich wurde ESP32 oder Mega nehmen aber

  1. ESP32 klein, genügend Pins Nachteil nur 3,3V
  2. Mega 5V Pins ohne Ende aber 2cm länger

Noch was Das Teil soll sich bewegen also wegriss steckbare Sachen

Nee, die Breite unterscheidet sich:

"5V in" nur, wenn kein USB angeschlossen ist, sonst bekämpfen die sich.

Sonst tendiere ich zum kleinen Mega2560, hat Erweiterungsmöglichkeiten.

Ich meinte Standard Mega.
Bei Pro Mini ist löten angesagt und es gibt kein screw terminal anders gesagt, nicht gefunden.

Keine Option im Modellbau :roll_eyes:

Ja, daher Mega2560 mit Steckbrett zum Testen und Mega2560 Pro Mini zum Löten.

Ja, genau :+1: Wenn der Arduino im Modell ist, ist USB frei und der Empfänger versorgt den Arduino mit 5V über den 5V Pin.

@my_xy_projekt habe gerade deinen Sketch aus post #50 getestet.
Ich hab einfach mal alle LEDs angeschlossen, die du hier schon definiert hast, auch wenn noch nicht alle fertig programmiert sind:

const byte bremsLichtPin = LED_BUILTIN; //Bremslicht
const byte backFirePin = 12;  //Backfire
const byte bremsLichtPwmPin = 11; //Brems- und Rücklicht mit PWM
const byte rueckLichtPwmPin = 10; //Rücklicht mit PWM
const byte griffPwmPin = 9; //Türgriffe PWM
const byte rechtsBlinkPin = 8;  //Blinker hinten rechts
const byte linksBlinkPin = 7; //Blinker hinten links
const byte rechtsBlinkPwmPin = 6; //Blinker vorne rechts PWM
const byte linksBlinkPwmPin = 5;  //Blinker vorne links PWM

Habe wieder ein Video von meinem Test gemacht: https://youtu.be/YkqqSkAfh1M
Der Pin ganz links ist Pin 13, ganz rechts ist Pin 5 (einfach absteigend der Reihenfolge nach). Nicht wundern, dass die Blinker grüne LEDs sind, habe gerade keine orangenen bei mir.
Das habe ich beobachtet:

  1. Brems- und Rücklicht:

    • Pin 13: Funktioniert super. Habe die hysterese wieder von 21 auf 200 verstellt, damit das Problem mit dem versehentlichen Auslösen des Bremslichts nicht mehr da ist.
    • Pin 11: Ist im Moment noch identisch zu Pin 13, da nur das Bremslicht funktioniert. PWM noch nicht da.
    • Pin 10 (Rücklicht): Hier tut sich noch nix, PWM noch nicht da.
  2. Backfire (Pin 12): Viel besser im Vergleich zu Sketch aus post #40! Jetzt wird die LED erst kurz vor Vollgas aktiv und blinkt schneller (siehe Video) :+1:

  3. Beleuchtung der Türgriffe (Pin 9): Hier tut sich noch nix, PWM noch nicht da.

  4. Blinker: Absolut perfekt, bin total begeistert!! Die vorderen Blinker (Pin 6 und 5) sind gedimmt, die hinteren (Pin 8 und 7) ausgeschaltet. Wenn ich das CH6-Potentiometer nach bspw. links drehe, blinken Blinker vorne links (Pin 5) und Blinker hinten links (Pin 7) synchron. Top :smiley:

Etwas Kosmetik :slightly_smiling_face:

Mein schlampiger Kommentar, habe ich in meinen Beiträgen korrigiert zu:

PCMSK1 |= B00000111;  // Enable PCINT8 & PCINT9 & PCINT10 (Pins A0 & A1 & A2)

Zukünftig dann

  PCMSK1 |= B00111101;  // Enable PCINT8 (Pin A0) & PCINT10(Pin A2) & PCINT11(Pin A3) & PCINT12(Pin A4) & PCINT13(Pin A5)

Das war mir bewusst. Ich hab noch ein Verständnisproblem. Spöter mehr dazu.

Na siehste geht doch :wink: Die entscheidenen Zeilen sind die Berechnung der Zeiten und die Begrenzung sowie Verschiebung.

      blinkTime = random(30, 100);                          // neue Zufallszeit
      if (!digitalRead(backFirePin))                        // Pin ist aus?...
      { blinkTime *= 3; }                                   // ... Auszeit verlängern

Da muss man ggfls. ein wenig experimentieren.

Ja, das hab ich vorbereitet, aber auch hier brauch ich einen Verständnistipp.
Wenn ich das richtig verstehe willst Du mit dem taster das Grifflicht anmachen.
Auch habe ich das mit dem Warnblink, dem Nebel und dem Rückfahrer gesehen, aber mir ist nicht klar, wann die Fahrzeugbeleuchtung vorne und hinten angehen soll. Sollen dann die Griffe allein aus oder Licht aus, wenn Griffe an etc. p..
Die könnte natürlich angehen, wenn sich das Fahrzeug im zustand forward oder backward befindet, aber wenn der im neutral ist, gehts aus. Oder man lässt da noch einen Nachlauftimer mitlaufen.
Alternativ noch einen auf die Taste setzen.

Nu kommt der Warnblinker noch dazu - da muss also ein wenig umgebaut werden. Der soll ja echt aussehen und nicht links und rechts im Wechsel :wink:

Nehme ich mit.
danke!

Bitte gerne :slightly_smiling_face:

Hab einfach mal ein Foto aus dem Internet genommen und beschriftet :slight_smile:

Hier mal noch eine genauere Erklärung zu CH4 (3 position switch) und CH3 (Taster):

CH4:

  • Position Mitte = alle LEDs ausnahmslos ausgeschaltet. Egal ob ich an einem Potentiometer drehe, auf den Taster Drücke oder bremse, alle LEDs sollen ausgeschaltet bleiben.
  • Position links = Lichtsteuerung aktiv:
    • Frontscheinwerfer (Pin A1),
    • orangenes PWM Standlicht (Pin 5 und 6),
    • Nebelscheinwerfer (Pin 2 und 3),
    • PWM Rücklicht (Pin 10) und
    • Bremslicht mit PWM (Pin 11) einschalten.
      Wenn ich jetzt stark Gas gebe, springt Backfire (Pin 12) an und wenn ich bremse, gehen Pin 11 und 13 auf 100% Helligkeit. Blinker gehen nur an, wenn ich das CH6-Potentiometer dementsprechend nach links/rechts drehe.
      Dieser Modus simuliert also Autofahren nachts.
  • Position rechts = Ausschließlich
    • … Rückfahrscheinwerfer (Pin 4),
    • orangenes PWM Standlicht,
    • Backfire und
    • die zwei Brems-Pins sind aktiv. Hier verändert sich jetzt aber noch was bei Pin 11: Jetzt sollte das gedimmte PWM Licht wegfallen und stattdessen identisch zu Pin 13 sein. Also komplett ausgeschaltet und nur beim Bremsen auf 100% Helligkeit.
      Dieser Modus simuliert sozusagen, Tagsüber Auto zu fahren.

CH3-Taster:

Das mit CH3 habe ich mir so vorgestellt: Der Taster kann ja zwei Werte liefern: Wenn die Fernsteuerung eingeschaltet wird, liegt der CH3 Wert immer bei 995 (±2). Wenn ich den Taster dann einmal drücke, liegt der Wert zwischen 1985 und 2000. Drücke ich ein zweites Mal auf den Taster, sind wir wieder bei 995.

CH3 könnte also auf diese Art und Weise folgende Lichter steuern:

  • Warnblinkanlage ein-/ausschalten = 1× drücken
  • Türgriffe ein-/ausschalten = 2× hintereinander drücken
  • orangenes PWM Standlicht ein-/ausschalten = 3× hintereinander drücken
  • Backfire ein-/ausschalten = 4× hintereinander drücken
  • Nebelscheinwerfer ein-/ausschalten = 5× hintereinander drücken
    Gedrückt halten habe ich jetzt erstmal weggelassen, glaub eher nicht, dass das mit diesem Taster an der Fernsteuerung möglich ist … oder lieg ich da falsch? :thinking:

CH3 ist natürlich abhängig von der CH4 Position:

  • Ist CH4 mittig, ist natürlich auch CH3 lahmgelegt. Also egal wie oft man den Taster drückt, die LEDs bleiben immer alle aus.
  • Ist CH4 links, geht das PWM Standlicht bei 3× drücken aus. Drückt man weitere 3×, geht es wieder an. Gleiches Prinzip bei den Nebelscheinwerfern: erst aus, dann wider an.
  • Ist CH4 rechts, umgekehrtes Prinzip bei Standlicht und Nebelscheinwerfern: Sie gehen erst an, dann wieder aus.

Hoffe das ist soweit verständlich, ansonsten gerne nochmal nachhaken :wink:

Na das wird ja was spannendes... Mit den Abhänigkeiten muss ich mal sehen, ob ich das im Kopf hinkriege. Sonst dauerts länger.

Mal sehen. was mir jetzt einfällt..