Arduino UNO Ver 3

Hallo liebe Community,

ich bin komplett neu hier im Forum und habe seit 2 Tagen einen Arduino UNO Ver 3.

Ich möchte für meine Modellbahn verschiedene LED´s programmieren, komme jedoch mit der Goggle-Suche nicht weiter.

Ich bräuchte einen Code für das IDE um 5 LED´s zu steuern.

Zwei Paare mit jeweils 2 LED´s und eine einzelne.

Paar 1 und 2, jeweils eine rote und gelbe LED sollen unregelmäßig glimmen um Kohle/Glut, in einer Ausschlacke-Anlage darzustellen. Ich plane zwei Glutherde an 2 verschiedenen Stellen.

Die 5. LED´s soll ein Schweißen simmulieren, also mehrere kurze (verschieden lange) Lichtblitze abgeben.

Könnt ihr mir helfen, oder einen Code schreiben?

Viele Grüße und einen schönen Sonntag euch allen.

ich hätte da eine Library. Die einzelnen Effekte sind hier beschrieben:

ich denke das wäre eine gute Ausgangsbasis.

Die Flicker z.B. für die Glut,

Die Rhythm fürs schweissen, die müsstest halt per Random Funktion noch ein und Ausschalten.

Aber eines nach dem anderen.

Hallo,

tja, dass nennt sich Programmieren lernen. Für den Anfang und weil Sonntag ist.

const byte ledPin = 9;

void setup() {
  pinMode(ledPin, OUTPUT);
  randomSeed(analogRead(0)); 
}

void loop() {
  const byte helligkeit = random(80, 255);  
  analogWrite(ledPin, helligkeit);   

  const byte flackerDelay = random(30, 100); 
  delay(flackerDelay);
}

Das musst du jetzt verstehen, anwenden, erweitern usw.
Irgendwann möchtest/musst du vom delay() weg.
Dafür gibt es das Beispiel in der IDE "BlinkWithoutDelay"

Ich möchte für meine Modellbahn verschiedene LED´s programmieren, komme jedoch mit der Goggle-Suche nicht weiter.

Vielleicht möchtest du gerne die Beispiele in der IDE durcharbeiten.
Und dazu ein C++ Buch oder Tutorial lesen.

Tipp:
Selber lernen macht selber schlau!

Hallo Doc_Arduino,

vielen Dank für den Anfang, jedoch komme ich hier schon ins Trudeln.

Ich definiere in der ersten Zeile die Anzahl der LED´s, wenn ich jetzt versuche mehrere einzubinden, kann ich nicht mehr ohne Fehler Kompilieren.

Ps. das Flackern schaut schon echt fein aus :grin:

Da wir hier alle Hellseher sind, sehen wir natürlich, dass du in Zeile 42 ein Semikolon vergessen hast.

Erinnerung:
Ohne C++ Grundlagen lernst du nicht den Freischwimmer.

const byte ledPin = 9;
const byte ledPin = 10;
const byte ledPin = 11;
const byte ledPin = 12;

void setup() {
  pinMode(ledPin9, OUTPUT);
  randomSeed(analogRead(0)); 
  pinMode(ledPin10, OUTPUT);
  randomSeed(analogRead(0));
  pinMode(ledPin11, OUTPUT);
  randomSeed(analogRead(0));
  pinMode(ledPin12, OUTPUT);
  randomSeed(analogRead(0));
}

void loop() {
  const byte helligkeit = random(80, 255);  
  analogWrite(ledPin9, helligkeit);   

  const byte flackerDelay = random(30, 100); 
  delay(flackerDelay);

  const byte helligkeit = random(80, 255);  
  analogWrite(ledPin10, helligkeit);   

  const byte flackerDelay = random(30, 100); 
  delay(flackerDelay);

  const byte helligkeit = random(80, 255);  
  analogWrite(ledPin11, helligkeit);   

  const byte flackerDelay = random(30, 100); 
  delay(flackerDelay);

  const byte helligkeit = random(80, 255);  
  analogWrite(ledPin12, helligkeit);   

  const byte flackerDelay = random(30, 100); 
  delay(flackerDelay);
}

Oh entschuldigung, mein Fehler.

Ich hatte mit einem ähnlichen Code experimentiert. Da konnte ich zumindest 4 LED´s einbinden. Es funktiniert hier jedoch nicht.

Hallo,

kontrolliere deine Variablennamen. Fällt dir dabei etwas auf?
Du verwendest mehrere gleichnamige Namen.
Tja so leicht ist das dann leider doch nicht.
Wenn das Namenproblem behoben ist, wirst du die Auswirkung von delay() feststellen.
Aber teste das erstmal ruhig um auch das zu verstehen was da passiert.
Ab musste das IDE Bsp. verstehen und anwenden lernen.
Und stelle ggf. deine IDE für mehr Ausgaben ein.
Fehlerbehebung immer von oben nach unten. Weitere Fehlermeldungen können "auch nur" Folgen der ersten Fehlermeldung sein die es zu bearbeiten gilt.

randomSeed(analogRead(0));

Der mehrfache Aufruf ist in dieser Form mehr als flüssig.
Überflüssig und Unsinnig.

Programmieren ist nicht blindes ausprobieren, sondern die konsequente Anwendung von erlerntem.

OK, ich habe das jetzt 3 mal sagen dürfen, mit unterschiedlichen Worten.

@Doc_Arduino definiert in der ersten Zeile die Pin-Nummer, an der er seine (einzige) LED angeschlossen hat.

Das wird nicht.
Der PIN kann kein PWM. Damit ist der nur an oder aus.

Ich greife mal den Vorschlag von @noiasca auf, der versteckt auf seinen Seiten scheinbar für alle Anwendungen eine Bibliothek parat hält. Ich weiche nur etwas ab, weil ich sein Flickern für das Schweißlicht und den Heartbeat für die Glut verwende, denn beim Heartbeat kann ich die Parameter per Zufall variieren.

Testprogramm (Klapp mich aus, dann siehst Du mich!)
#include <Noiasca_led.h>
#include <utility/Noiasca_discrete.h>

FlickerPin schweisslicht{ 3 }; // UNO PWM pins 3, 5, 6, 9, 10, 11
HeartbeatPin glutA_gelb{ 5 };  // UNO PWM pins 3, 5, 6, 9, 10, 11 (on any other pin the LED will just blink)
HeartbeatPin glutA_rot{ 6 };   // UNO PWM pins 3, 5, 6, 9, 10, 11 (on any other pin the LED will just blink)
HeartbeatPin glutB_gelb{ 9 };  // UNO PWM pins 3, 5, 6, 9, 10, 11 (on any other pin the LED will just blink)
HeartbeatPin glutB_rot{ 10 };  // UNO PWM pins 3, 5, 6, 9, 10, 11 (on any other pin the LED will just blink)

uint32_t vorhin = 0;
uint32_t intervall = 100;

void setup() {
  Serial.begin(115200);
  delay(500);
  Serial.println("Start");
  schweisslicht.begin();       // you have to call the .begin() method for this LED
  schweisslicht.on();          // switch the blinking on
  glutA_gelb.begin();          // you have to call the .begin() method for the LED pair
  glutA_gelb.on();             // you can switch the LED on
  glutA_gelb.setInterval(10);  // you can modify the delay time for the pulsing. Default value is 50.
  glutA_rot.begin();           // you have to call the .begin() method for the LED pair
  glutA_rot.on();              // you can switch the LED on
  glutA_rot.setInterval(13);   // you can modify the delay time for the pulsing. Default value is 50.
  glutB_gelb.begin();          // you have to call the .begin() method for the LED pair
  glutB_gelb.on();             // you can switch the LED on
  glutB_gelb.setInterval(5);   // you can modify the delay time for the pulsing. Default value is 50.
  glutB_rot.begin();           // you have to call the .begin() method for the LED pair
  glutB_rot.on();              // you can switch the LED on
  glutB_rot.setInterval(7);    // you can modify the delay time for the pulsing. Default value is 50.
  randomSeed(analogRead(0));
}

void loop() {
  schweisslicht.update();      // call the update function in loop() to refresh the LED
  glutA_gelb.update();         // call the update function in loop() to refresh the LED
  glutA_rot.update();          // call the update function in loop() to refresh the LED
  glutB_gelb.update();         // call the update function in loop() to refresh the LED
  glutB_rot.update();          // call the update function in loop() to refresh the LED

  uint32_t jetzt = millis();
  if (jetzt - vorhin >= intervall) {
    vorhin = jetzt;
    glutA_gelb.setInterval(random(3, 22));
    glutA_rot.setInterval(random(3, 22));
    glutB_gelb.setInterval(random(3, 22));
    glutB_rot.setInterval(random(3, 22));
    randomSeed(analogRead(0));
  }
}

Es ist nicht optimal, aber ein Anfang :wink:

Dein Thema ist leider wenig spezifisch, sowas wie "Glimmen von Kohle/Glut in einer Ausschlacke-Anlage zusammen mit Schweißlicht" wäre prägnanter.

Meine Kurzfassung.


const byte ledGnOne = 5;
const byte ledRdOne = 6;
const byte ledGnTwo = 9;
const byte ledRdTwo = 10;
const byte ledWeld = 11;

const uint8_t fireLeds = 4;
const uint8_t fireLed[fireLeds] = {ledGnOne, ledRdOne, ledGnTwo, ledRdTwo};
uint8_t fireDelay[fireLeds] = {0};
uint32_t lastFire[fireLeds] = {0};

uint8_t weldDelay;
uint32_t lastWeld;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start...."));
  pinMode(ledGnOne, OUTPUT);
  pinMode(ledRdOne, OUTPUT);
  pinMode(ledGnTwo, OUTPUT);
  pinMode(ledRdTwo, OUTPUT);
  pinMode(ledWeld, OUTPUT);
  randomSeed(analogRead(A0));
}

void loop()
{
  fire();
  welding();
}

void welding()
{
  if (millis() - lastWeld > weldDelay)
  {
    digitalWrite(ledWeld, !digitalRead(ledWeld));
    weldDelay = random(10, 100);
    lastWeld = millis();
  }
}

void fire()
{
  for (byte b = 0; b < fireLeds; b++)
  {
    if (millis() - lastFire[b] >= fireDelay[b])
    {
      analogWrite(fireLed[b], random(80, 255));
      fireDelay[b] = random(30, 100);
      lastFire[b] = millis();
    }
  }
}

Und dann eine Empfehlung. Hier: ArduinoForum.de - Das deutschsprachige Forum rund um den Arduino - Arduino Code-Referenz (deutsch) das pdf runterladen und bis zur Hälfte lesen, damit Du wenigstens Grundlagen hast.

WOW! Vielen lieben Dank!

Das ist fast wie ich es mir vorstelle!

Gibt es noch die Möglichkeit das Flackern, der LED´s 5,6,9, 10 ein wenig ruhiger zu gestalten?

Nochmals vielen Dank für die Mühe, die ihr euch alle macht.

Helligkeit in 1. random, Geschwindigkeit im 2. Einfach mal austesten

Dann sag mal, was fehlt.

Dann ändere

NEU:
uint32_t fireDelay[fireLeds] = {0};

Dann kannst Du

die Werte ändern wie Du willst, ohne das es zu einem Überlauf kommt.

Der erste ist dann die untere Schwelle in millisekunden, der zweite der obere bis zu dem es zufällig gehen könnte.
Fang mit 100 unten an und setz den oberen auf 1000.