Go Down

Topic: Beleuchtungssteuerung für einen Leuchttum (Read 740 times) previous topic - next topic

timsieberg

Hallo zusammen,

ich habe da ein kleines Problem und hoffe das mir jemand helfen kann.

Mein Schwiegervater hat sich einen Leuchtturm für den Garten gebaut, den er gerne beleuchtet haben möchte.
Der Leuchtturm besitzt 8 Fenster, die nach einander eingeschaltet werden sollen (Fenster 1 an -> 1min- >aus ->Fenster2 an -> 1min -> aus....) gleichzeitig soll oben im Turm das "Rundumlicht" die ganze zeit Faden.

Hinbekommen das die Lampen nacheinander angehen, habe ich hinbekommen auch den Fade der einzelen LED.
Leider klappt dies nicht gleichzeitig.
LED´s gehen nacheinander an dann wir die LED nach jedem durchlauf heller. Logisch da ich ja leider mit Delays gearbeitet habe.

Gibt es eine Möglichkeit, dies gleichzeitig laufen zu lassen? Oder kann der Arduino Uno das nicht weil 2Funktionen? I

Mit freundlichen Grüßen
Tim


noiasca

#2
Nov 02, 2020, 08:13 am Last Edit: Nov 02, 2020, 08:29 am by noiasca
Quote
Gibt es eine Möglichkeit, dies gleichzeitig laufen zu lassen? Oder kann der Arduino Uno das nicht weil 2Funktionen? I
"Gleichzeitig" nicht, aber so schnell - sehr schnell - dass es so aussieht, als liefe das gleichzeitig.

Du musst auf jedes "delay" verzichten und nach dem Muster "BlinkWithoutDelay" arbeiten.
Auch tiefe-Forschleifen oder Whiles in Verbindung mit Delay müssen aufgelöst werden.

Schau dir das BlinkWithoutDelay an, bringe zwei LED's unabhängig voneinander zum Blinken, dann hast du das Konzept verstanden.

Wenn du wirklich mehr Hilfe benötigst, solltest du einen Schaltplan und den jetzigen Sketch hier posten. Auch ein Zeitdiagramm aus dem der Zusammenhang der überschneidenden PWM Werte ersichtlich ist, würde die Helfer unterstützen damit du schneller an das Ziel kommst.

Da ein Uno zu wenig PWM pins hat solltest du genau schreiben welches Board du verwendest und wenn es ein Exot ist - auch verlinken.

edit: wenn ich mir das so überlege, habe ich da sogar was ähnliches fertiges (Stichwort Larson Scanner), aber schau'ma mal, was von dir so kommt.
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

MicroBahner

Du könntest es auch mit den MobaTools versuchen. Beim MotoTimer ist ein Beispiel dabei, wie man Led's unabhängig voneinander steuert. Und auch faden geht damit. Wobei dei Frage ist, wie langsam das Faden sein soll. Da gibt es Grenzen.
Installierbar sind die MobaTools direkt über den Bibliotheksmanager.
Gruß, Franz-Peter

timsieberg

Hallo,
danke erstmal für die Antworten.
Anbei die Boardinfos:
BN: Arduino Uno
VID: 2341
PID: 0043
SN: 55732323630351014061

Welches Board es genau ist, kann ich leider nicht sagen hab ihn bei Ebaykleinanzeigen gekauft schätze der R3.

Ich hoffe die Bilder sind aussagekräftig,




noiasca

#5
Nov 02, 2020, 09:54 am Last Edit: Nov 02, 2020, 10:39 am by noiasca
asooo, nur oben faden. ok - dann versteh ich das mit dem UNO.

in welchem Intervall fadet die Topleuchte?
Sketch?
(und langfristig - verwende 0 und 1 nur für Serial Output, als mach lieber 3..12 und die 9 für PWM)
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

HotSystems

Wenn es ein Uno ist (Bild posten), dann ist die Verwendung der Pins D0 und D1 nicht zu empfehlen.
Da ist üblicherweise der onboard USB-Adapter angeschlossen.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)


MicroBahner

Wenn Du die Übergänge zwischen den 8 1Min. LED's auch 'weich' mit fadeOut/FadeIn haben willst, wären die MobaTools perfekt, da sie für das faden keine PWM-Pins benötigen. Das geht an allen digitalen Pins.
Gruß, Franz-Peter

noiasca

#9
Nov 02, 2020, 10:30 am Last Edit: Nov 02, 2020, 10:33 am by noiasca
so als Grundgerüst mit unsyncronisierter Top-Leuchte

Code: [Select]

// Lighthouse with 8 LEDs and one top PWM
// https://forum.arduino.cc/index.php?topic=711838
// by noiasca

#define DEBUG_UART 1

const uint8_t pwmPin = 3; // UNO PWM pins 3, 5, 6, 9, 10, 11
const uint8_t ledPin[] = {2, 4, 5, 6, 7, 8, 9, 10};
const size_t totalNoLeds = sizeof(ledPin);

uint32_t currentMillis = 0;

void doRunning()                              // switch on / off one LED after the other
{
  static uint8_t actual = totalNoLeds - 1;    // start with the last LED
  static uint32_t previousMillis = 0;
  const uint8_t myIntervall = 5;              // intervall in seconds
 
  if (currentMillis - previousMillis >= myIntervall * 1000UL)
  {
    previousMillis = currentMillis;
    digitalWrite(ledPin[actual], LOW);
    actual++;
    if (actual >= totalNoLeds) actual = 0;
    digitalWrite(ledPin[actual], HIGH);
#if DEBUG_UART
    Serial.print("actual Pin=");
    Serial.println(ledPin[actual]);
#endif
  }
}

void doPWM()
{
  static uint32_t previousMillis = 0;
  const uint16_t myIntervall = 10;             // speed of PWM
  static int8_t dir = 1;                       // direction upwards(1) or downwards (-1)
  static uint8_t newPwm;

  if (millis() - previousMillis >= myIntervall)
  {
    previousMillis = millis();
    if (dir == 1 && newPwm >= 254)        // end of scale
      dir = -1;                           // go downwards
    if (dir == -1 && newPwm <= 54)        // lower end of pwm scale
      dir = 1;                            // go upwards
    newPwm += dir;
    analogWrite(pwmPin, newPwm);
#if DEBUG_UART
    Serial.print("newPwm=");
    Serial.println(newPwm);
#endif
  }
}

void setup() {
#if DEBUG_UART
  Serial.begin(115200);
#endif
  for (uint8_t i = 0; i < totalNoLeds; i++) {
    pinMode(ledPin[i], OUTPUT);
  }
  pinMode(pwmPin, OUTPUT);
}

void loop() {
  currentMillis = millis();
  doPWM();                  // check, if PWM needs to be changed
  doRunning();              // check, if one of the running LEDs need to be changed
  // do what ever you want unblocked here
}
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

timsieberg

so als Grundgerüst mit unsyncronisierter Top-Leuchte

Code: [Select]

// Lighthouse with 8 LEDs and one top PWM
// https://forum.arduino.cc/index.php?topic=711838
// by noiasca

#define DEBUG_UART 1

const uint8_t pwmPin = 3; // UNO PWM pins 3, 5, 6, 9, 10, 11
const uint8_t ledPin[] = {2, 4, 5, 6, 7, 8, 9, 10};
const size_t totalNoLeds = sizeof(ledPin);

uint32_t currentMillis = 0;

void doRunning()                              // switch on / off one LED after the other
{
  static uint8_t actual = totalNoLeds - 1;    // start with the last LED
  static uint32_t previousMillis = 0;
  const uint8_t myIntervall = 5;              // intervall in seconds
  
  if (currentMillis - previousMillis >= myIntervall * 1000UL)
  {
    previousMillis = currentMillis;
    digitalWrite(ledPin[actual], LOW);
    actual++;
    if (actual >= totalNoLeds) actual = 0;
    digitalWrite(ledPin[actual], HIGH);
#if DEBUG_UART
    Serial.print("actual Pin=");
    Serial.println(ledPin[actual]);
#endif
  }
}

void doPWM()
{
  static uint32_t previousMillis = 0;
  const uint16_t myIntervall = 10;             // speed of PWM
  static int8_t dir = 1;                       // direction upwards(1) or downwards (-1)
  static uint8_t newPwm;

  if (millis() - previousMillis >= myIntervall)
  {
    previousMillis = millis();
    if (dir == 1 && newPwm >= 254)        // end of scale
      dir = -1;                           // go downwards
    if (dir == -1 && newPwm <= 54)        // lower end of pwm scale
      dir = 1;                            // go upwards
    newPwm += dir;
    analogWrite(pwmPin, newPwm);
#if DEBUG_UART
    Serial.print("newPwm=");
    Serial.println(newPwm);
#endif
  }
}

void setup() {
#if DEBUG_UART
  Serial.begin(115200);
#endif
  for (uint8_t i = 0; i < totalNoLeds; i++) {
    pinMode(ledPin[i], OUTPUT);
  }
  pinMode(pwmPin, OUTPUT);
}

void loop() {
  currentMillis = millis();
  doPWM();                  // check, if PWM needs to be changed
  doRunning();              // check, if one of the running LEDs need to be changed
  // do what ever you want unblocked here
}


Grundgerüst? Das ist genau die Funktion die ich brauche vielen dank, jetzt muss ich es nur noch verstehen. :D

noiasca

einfach mit dem Finger Zeiler für Zeile durchgehen.
aufkommende Fragen notieren.

Bei der aller letzten schließenden Klammer die Fragen googeln. Wenn google nichts bringt  - hier fragen.
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

MicroBahner

#12
Nov 02, 2020, 11:09 am Last Edit: Nov 02, 2020, 11:14 am by MicroBahner
Hallo Tim,
das wäre mein Vorschlag mit MobaTools und weichem Überblenden der Minuten-Leds:
Code: [Select]

#include <MobaTools.h>

const byte ledPins[] = { 2,3,4,5,6,7,8,9 }; // muss byte sein wg. sizeof
const byte ledZahl = sizeof(ledPins);
const byte fadePin = 10;
MoToTimebase minuteTime;        // Zeitbasis für die Minuten-Leds
MoToTimebase fadeTime;          // Zeitbasis für die einzelne Fade-Led

MoToSoftLed minuteLeds[ledZahl];
MoToSoftLed fadeLed;

byte minuteIx = 0;          // aktive Minuten-Led

void setup() {
    // Minuten-Leds initiieren:
    for ( byte i=0; i<ledZahl; i++ ) {
        minuteLeds[i].attach( ledPins[i] );     // Pins zuordnen
        minuteLeds[i].riseTime( 1000 );          // 1Sec  Überblendzeit
    }
    minuteLeds[minuteIx].on();                  // 1. Led einschalten
    minuteTime.setBasetime( 5000 );             // für Test nur 5Sek.
   
    // Fade-Led initiieren:
    fadeLed.attach( fadePin );
    fadeLed.riseTime( 10000 );      // wenn 10Sec nicht reichen, muss das mit PWM-Pin gemacht werden
    fadeLed.on();
    fadeTime.setBasetime( 10000 );       // Zeit aufziehen für das Umschalten der Fade-Led.
}

void loop() {
    if ( minuteTime.tick() ) {
        // Zeit für Minutenled abgelaufen, auf nächste schalten
        minuteLeds[minuteIx].off();     // aktuelle Led ausschalten
        if ( ++minuteIx >= ledZahl ) minuteIx = 0;
        minuteLeds[minuteIx].on();      // nächste Led einschalten
    }
    // Fade-Led umschalten
    if ( fadeTime.tick() ) fadeLed.toggle();

}
Gruß, Franz-Peter


agmue

Mein Schwiegervater hat sich einen Leuchtturm für den Garten gebaut, den er gerne beleuchtet haben möchte.
Hat der Leuchtturm ein Vorbild? Hat Dein Schwiegervater einen Bezug zu diesem Vorbild?

Wenn "ja" sollte der Leuchtturm, wie schon angedeutet, nicht einfach nur blinken, sondern die Blinkfolge des Vorbilds nachahmen. Wer sich einen Leuchtturm baut, legt da wahrscheinlich Wert drauf, vermute ich mal.

Hast Du ein Foto?

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

Go Up