Gruppenschaltung LED

Guten Tag,
ich bin neu (schon wieder einer). Habe seit Weihnachten (Conrad-Kalender mit Nano), wieder die Lust am Programmieren entdeckt. Ich frage nicht gleich, ich suche erst nach Lösungen. Jetzt hakelts aber, festgefahren.
Problem: Auf meiner Anlage will ich Häuser mit LEDs beleuchten, wobei dort Gruppen von LEDs an- und nach gewisser Zeit ausgehen sollen. Ich wollte das über array lösen. Problem: Im Beispiel gehen zwar die ersten 4 an, aber nicht aus. Wo liegt mein Denkfehler?

/*
  Gruppen von LED sollen gleichzeitig angehen und nach gewisser Zeit wieder aus
*/


int pins[19] = {2,3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16,17,18,19};

void setup()
{
  for (int i = 0; i < 4; i++) pinMode(pins[i], OUTPUT);
}
void loop()
{
  for (int i = 0; i < 4; i++)
  { 
    digitalWrite(pins[i], HIGH);
  }
  delay(1000);
  for (int i = 0; i < 4; i++)
  { 
    digitalWrite(pins[i], LOW);
  }
}

Schon mal danke

Nach dem Ausschalten wird ja sofort die loop() wieder aufgerufen. Damit werden die LED unmittelbar wieder eingeschaltet.

Hallo
spendier ein zusätzlichen delay(1000); nachdem alle LED ausgeschaltet worden sind, das hilft :slight_smile:

schorsch55:
Wo liegt mein Denkfehler?

Da war wer schneller - dann kürze ich meine Antwort mal:
Im Zweifel hilft der Serielle Monitor.

/*
  Gruppen von LED sollen gleichzeitig angehen und nach gewisser Zeit wieder aus
*/


int pins[19] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19};

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start...."));
  for (int i = 0; i < 4; i++) pinMode(pins[i], OUTPUT);
}
void loop()
{
  Serial.print(F("Mache an....: "));
  for (int i = 0; i < 4; i++)
  {
    digitalWrite(pins[i], HIGH);
    Serial.print(i);
    Serial.print(" ");
  }
  Serial.println();
  delay(1000);
  Serial.print(F("Mache aus....: "));
  for (int i = 0; i < 4; i++)
  {
    digitalWrite(pins[i], LOW);
    Serial.print(i);
    Serial.print(" ");
  }
  Serial.println();
}{/code]

my_xy_projekt:
Da war wer schneller - dann kürze ich meine Antwort mal:
Im Zweifel hilft der Serielle Monitor.

/*

Gruppen von LED sollen gleichzeitig angehen und nach gewisser Zeit wieder aus
*/

int pins[19] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19};

void setup()
{
 Serial.begin(115200);
 Serial.println(F("Start...."));
 for (int i = 0; i < 4; i++) pinMode(pins[i], OUTPUT);
}
void loop()
{
 Serial.print(F("Mache an....: "));
 for (int i = 0; i < 4; i++)
 {
   digitalWrite(pins[i], HIGH);
   Serial.print(i);
   Serial.print(" ");
 }
 Serial.println();
 delay(1000);
 Serial.print(F("Mache aus....: "));
 for (int i = 0; i < 4; i++)
 {
   digitalWrite(pins[i], LOW);
   Serial.print(i);
   Serial.print(" ");
 }
 Serial.println();
}{/code]

und das ohne Schrittkette ? :slight_smile:

Nachtrag:
Der zusätzliche delay() hilft jetzt.

Wenn später die Gruppen mal unterschiedliche Zeiten bekommen sollen, würde ich mich jetzt schon von delay() verabschieden und nicht blockierend arbeiten.
Das Beispiel Blink without delay gibt die Richtung vor.

Hallo Freunde,
das delay am Ende vom ersten For hats gebracht, das war das Einzigste, was ich bei meinen Versuchen nicht probiert hatte, nu gäds (sächs.) Danke euch allen. Hier für 3 Gruppen. Wobei ich für die ertse Gruppe noch ein Einzel-ON/OFF eingebaut habe. Klasse und Dank für eure Hilfe:

/*
  Gruppen von LED sollen gleichzeitig angehen und 
  nach gewisser Zeit wieder aus. In der ersten Gruppe werden die LEDs 
  einzeln an und ausgeschaltet
*/


int pins[19] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19};

void setup()
{
  for (int i = 0; i < 19; i++) pinMode(pins[i], OUTPUT);
 }
void loop()
{
  for (int i = 0; i < 4; i++)
  {
    digitalWrite(pins[i], HIGH); delay(500);
  }

  delay(2000);
  for (int i = 0; i < 4; i++)
  {
    digitalWrite(pins[i], LOW);delay(500);
 //   delay(1000);
  }
  delay(2000);
  for (int i = 4; i < 12; i++)
  {
    digitalWrite(pins[i], HIGH);
  }

  delay(2000);
  for (int i = 4; i < 12; i++)
  {
    digitalWrite(pins[i], LOW);
  }
  delay(1000);
  for (int i = 12; i < 20; i++)
  {
    digitalWrite(pins[i], HIGH);
  }

  delay(2000);
  for (int i = 12; i < 20; i++)
  {
    digitalWrite(pins[i], LOW);
  }
  delay(1000);
}

Mensch, super und Danke für deine Info.
Was ist das nächste Projekt ? :slight_smile:

Hallo Paul,
PWM-Steuerung der Loks, mit Drehpoti, dabei ist Mittelstellung Halt, nach recht-vorwärts, nach links rückwärts. Soll später über Bluetooth und App gesteuert werden (Für die Ausstellung der Anlagen.)

schorsch55:
Hallo Paul,
PWM-Steuerung der Loks, mit Drehpoti, dabei ist Mittelstellung Halt, nach recht-vorwärts, nach links rückwärts. Soll später über Bluetooth und App gesteuert werden (Für die Ausstellung der Anlagen.)

Hallo
das hört sich nach einem Plan an :slight_smile:

Hast du schon die entsprechende Hardware ausgesucht ?

schorsch55:
... (schon wieder einer) ...

Habe seit Weihnachten ... wieder die Lust am Programmieren entdeckt.

Hallo Schorsch, ist doch Klasse, willkommen!

Illuminierende LEDs, bewegende Schrittmotoren und Servos, der µC als Access Point, ein Füllhorn an Möglichkeiten öffnet sich!

schorsch55:
Auf meiner Anlage will ich Häuser mit LEDs beleuchten,

Das belebte Haus ist für µCs im Modellbau ein Klassiker. Ein ATtiny85 und ich haben so angefangen.

Die Arduinos werden mit C++ bespaßt, weshalb auch OOP möglich ist, was ich Dir gerne mit einem Beispiel nahebringen möchte:

class HausLed {
  private:
    uint32_t vorhin = 0;
    uint32_t intervall = 0;
    const byte pin;
    const uint32_t minzeit;
    const uint32_t maxzeit;

  public:
    HausLed(byte pin, const uint32_t minzeit, const uint32_t maxzeit): pin(pin), minzeit(minzeit), maxzeit(maxzeit) {}

    void init() {
      pinMode(pin, OUTPUT);
      randomSeed(analogRead(A5));
      if (random(0, 2)) digitalWrite(pin, !digitalRead(pin));
      intervall = random(minzeit, maxzeit);
    }

    void run() {
      uint32_t jetzt = millis();
      if (jetzt - vorhin >= intervall)
      {
        vorhin = jetzt;
        digitalWrite(pin, !digitalRead(pin));
        intervall = random(minzeit, maxzeit);
      }
    }
};

HausLed hausLed[] {
// pin, minzeit, maxzeit
  {2, 500, 3000},
  {3, 500, 3000},
  {4, 200, 500}
};

void setup() {
  for (auto &h : hausLed) h.init();
}

void loop() {
  for (auto &h : hausLed) h.run();
}

Die Instanzen von hausLed[] lassen sich erweitern, ich war nur zu faul zum Tippen ::slight_smile:

Die Methoden init() und run() kann man beliebig abändern und weitere Methoden ergänzen. Damit kratz man zwar nur an den Möglichkeiten von OOP, aber es ist ein sinnvoller Anfang, zumindest meine Meinung.

Einen Blick solltest Du auch auf LEDs beispielsweise vom Typ SK6805 MICRO 2427, WS2812b, WS2815 und APA102, die drei LEDs und eine IC eingebaut haben. Das IC fungiert als eine Art Schieberegister und macht gleich PWM für die LEDs. Es gibt viele unterschiedliche Typen. Ein µC kann da gleichmal hunderte dieser Lichtpunkte ansteuern, sicherlich aber alle Räume eines Hauses.

Hallo Paul,
ja, da gibt es einen Plan. Es soll im Endergebnis eine flexible und leicht anpassbare Modellbahnsteuerung werden, sowohl über Infrarot, als auch über Bluetooth. Zugverkehr, Weichenschaltung, Beleuchtung und mal sehen. Mit Hardware aller Art habe ich mich schon versorgt. Ich würde ja ein Bild einfügen, weiß aber nicht wie.
Hallo agmue??,
ich bin blutiger Anfänger und erarbeite mir alles selbst mit Hilfe von Beispielsketchen, Tuts und Methode MUP (Methode des unbekümmerten Probierens). Bis zu Methoden und Instanzen bin ich noch nicht vorgedrungen :confused:. Ich schreibe in unserem Modellbahnforum für die Spur Z z.Z. eine Anleitung für Einsteiger, sehr mühsam. Aber ich bin kein Fan von Strg C und V für Sketche, die ich so nicht verstehe, deshalb auch ab jetzt hier unterwegs. Ich lebe nach dem Prinzip "selber Essen macht satt und selber tun macht schlau". Ich werde mir deinen Sketch mal anschauen.
Da hab ich gleich ein Problem. Es wird immer auf den BlinkWithOutDelay verwiesen, um delay zu vermeiden. So richtig habe ich den nicht kapiert. Vielleicht kann den mal jemand in einfachen Worten auseinanderpflücken, für den Arduino-Dau.
Bis denne, ich stürze mich jetzt auf IR und Bluetooth und Relais. Servos in allen Varianten habe ich schon durch, auch Stepper und DC-Motoren

Hallo
der kern aller Arduino-Zeitgeber beschreibt die folgende Codezeile

if (millis() - stempel >= dauer) machWas();

  • die Funktion millis() liefert einen Zählerstand in Millissekunden seit dem der Arduino befeuert worden ist
  • die Variable stempel enthält die Zeit in Millissekunden zudem der Timer gestartet worden ist.
  • die Variable dauer enthält die Zeit in Millissekunden zudem der Timer ausgelöst werden soll.
    Alle Variaben müssen in Datenformat unsigned long deklariert werden.

Damit der Zeitgeber periodisch arbeitet muss die Variable stempel mit der akutellen Zeit aus der millis()-Funktion gefüllt werden.

Ansonsten ein paar Pflückungen

Nachtwächtererklärung
Franz54
Microbahner + Sketche
Rentner "Vom delay() zur Methode"
ardu_arne

Gruß Tommy

Für dich als Modellbahner könnte die Moba-Variante des 'Blink without delay' passend sein. Entweder über den Link von Tommy als PDF, oder im Original auf Stummiforum.

schorsch55:
... Methode MUP (Methode des unbekümmerten Probierens).

Das nannte ich bislang "Spielen", aber MUP ist auch lustig :smiley:

schorsch55:
... eine Anleitung für Einsteiger ...

Die habe ich schon durchgelesen, nur weiter so!

In diesem Forum nach "agmue anleitung" gesucht, findest Du mehr oder minder erhellende Texte und Links.

schorsch55:
Ich werde mir deinen Sketch mal anschauen.

Als OOP erfunden und publiziert wurde, habe ich es für Unsinn gehalten. Die Anderen müssen sich also geirrt haben :stuck_out_tongue:

Inzwischen habe ich für mich Aufgabenstellungen herausgepflückt, die mir auch auf einem kleinen µC sinnvoll in OOP erscheinen. Darauf wollte ich Dich hinweisen. Die Bibliotheken sind ja sowieso in OOP verfaßt, lesen können sollte man es daher schon.

Das erste Aha-Erlebnis war für mich die Schrittkette (=finite state machine, =endlicher Automat), eine unglaubliche Erleichterung.

Über den Bibliotheksmanager kannst Du Dir die MobaTools installieren, da gibt es dann mit Zeitgebern auch Möglichkeiten zur Umgehung der millis(). Langsam bewegende Servos sind auch schön. Spitzenreiter ist für mich aber die interruptgesteuerte Ansteuerung von Schrittmotoren. Der Autor ist hier im deutschen Forumteil aktiv.

schorsch55:
... Bluetooth ...

Nicht die Einstiegsklasse, aber dann kannst Du einen Blick auf den preislich attraktiven ESP32 werfen, der bei Fips einen guten Auftritt hat. Weil ich den Start etwas schwierig fand, hier eine Anleitung: Einführung zu fipsok.de

Bei mir werkelt der ESP32 als Access Point, Browser auf dem Händi dann als Fernsteuerung. Ich bespaße damit LEDs (die WS2815 beispielsweise), aber Zug und Weichen ginge auch. Mir schien das leichter als Blauzahn ;D

Das Füllhorn ist geöffnet, bediene Dich nach Lust und Laune!

Hallo agmue,
habe nur kurz überflogen, was an du Tipps und Links geboten hast. Bin erschlagen, muss jetzt erst mal sortieren und ausprobieren. das antidelay habe ich jetzt auch geschnallt, ich muss es mir verständlich machen in Bildern, das habe ich so für mich als Technik herausgefunden :stuck_out_tongue:. jetzt heißt es MUPPEN bis der Arzt kommt.
Danke

Hallo
und noch einen Lesetipp von mir.
Die Anwendung des EVA-Prinzips hat sich bei mir sehr bewährt. Durch diese strukturierte Vorgegensweise bekommt man sehr schnell einen Werkzeugkasten mit grundlegenden Funktionen, die man selber sehr schnell anpassen kann.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.