Beleuchtungssteuerung für einen Leuchttum

Einschaltung funktioniert, Wenn der Wert überschritten wird funktioniert es ja auch, nur nicht richtig es geht nicht aus sondern stoppt nur.

Das zeigt dein Code-Schnipsel leider nicht.

Zusätzlich ist evtl. sinnvoll, eine Verzögerung einzubauen, damit nicht eine kurze Helligkeitsänderung gleich den Leuchtturm an- bzw. abschaltet.
(Zum Testen kann man diese Verzögerung ja kürzer einstellen als hinterher im echten Betrieb)

doch zeigt es.

er stoppt das currentMillis update - kein wunder dass es "stehen bleibt". Er muss halt auch abschalten.

Toll, was du aus

if (sensorWert < 30){
{currentMillis = millis();
doPWM();                  
doRunning();

herauslesen kannst :)

Ich hatte ja meine Gründe weswegen das im loop steht und nicht in den do Funktionen. Ich wäre aber nie auf die Idee gekommen, dass das jemand zum Anhalten missbrauchen würde. :o

noiasca: Ich hatte ja meine Gründe weswegen das im loop steht und nicht in den do Funktionen. Ich wäre aber nie auf die Idee gekommen, dass das jemand zum Anhalten missbrauchen würde. :o

So jetzt hat es Funktioniert, void doRunning() { static uint8_t actual = totalNoLeds - 1; static uint32_t previousMillis = 0; const uint8_t myIntervall = 2; // Schenlligkeit Fenster in Sekunden sensorWert= analogRead(eingang); Serial.print ("Helligkeit= "); Serial.println (sensorWert); if (sensorWert < 30){ 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

} } else { digitalWrite(ledPin[actual], LOW); } } So funktioniert es, jetzt werde ich noch schauen das ich die var global vergebe.

nö, keine global. mach dir eine Funktion die dir das Ergebnis aufbereitet.

ungeprüft:

bool isDark (void)
{
  bool result = true;
  if (analogRead(eingang) < 30) result = false  
  return result;
}

dann kannst mal bei Lust immer noch eine Hysterese (an einer zentralen Stelle) einbauen

vieleicht so:

bool isDark (void)
{
  static bool result = true;
  if (analogRead(eingang) < 30) result = false;
  else if (analogRead(eingang) > 60) result = true;
  return result;
}

noiasca: bool isDark (void) {  bool result = true;  if (analogRead(eingang) < 30) result = false    return result; }

Danke werde ich mal reinbasteln ist auf alle fälle kürzer.

noiasca: dann kannst mal bei Lust immer noch eine Hysterese (an einer zentralen Stelle) einbauen

vieleicht so:

bool isDark (void)
{
  static bool result = true;
  if (analogRead(eingang) < 30) result = false;
  else if (analogRead(eingang) > 60) result = true;
  return result;
}

Ob eine Hysterese hier so sinnig ist weiß ich nicht, ich denke es ist besser ein zeit einzusetzen WertX muss Y Sekunden unterschritten sein dann ist Dunkel. Andersrum genau so WertX muss Y Sekunden überschritten sein dann Tag. Nicht das mal ein Scheinwerfer eines Autos etc. draufscheint und dann geht alles aus. Wie seht ihr das?

kannst auch machen. Auch das bringst du in dieser Funktion unter. Einfach zweiteilig machen. Einmal bei "Flankenänderung" den Zeitstempel merken, und im zweiten Teil dann auf millis-previousMillis prüfen.

noiasca: kannst auch machen. Auch das bringst du in dieser Funktion unter. Einfach zweiteilig machen. Einmal bei "Flankenänderung" den Zeitstempel merken, und im zweiten Teil dann auf millis-previousMillis prüfen.

und welche variable frage ich dann ab in der if um das doRunning zu beenden?

timsieberg: Wie seht ihr das?

Wäre das so schlimm? Du baust kein Atomkraftwerk ::)

Man kann es immer beliebig kompliziert machen und Zeit und Hysterese kombinieren. Du kannst auch den gleitenden Mittelwert zusammen mit der Hysterese verwenden, wäre so mein Tipp.

du fragst keine Variable ab sondern die Funktion return't das Ergebnis.

statt deinem

if (sensorWert < 30){

machst ein

if (isDark()){

oder

if (isDark() == true){

wie es dir halt besser gefällt.

noiasca: du fragst keine Variable ab sondern die Funktion return't das Ergebnis.

statt deinem

if (sensorWert < 30){

machst ein

if (isDark){

oder

if (isDark == true){

wie es dir halt besser gefällt.

Was mach ich falsch? Hab True und False umgedreht , denke das ist so richtig ? Andersrum geht es aber auch nicht.

int sensorWert = 0;
int Nacht = 30;
int Tag = 100;

bool isDark (void)
{
  static bool result = false;
  if (analogRead(eingang) < Nacht) result = true;
  else if (analogRead(eingang) > Tag) result = false;
  return result;
}
void doRunning()                              
{
  
  static uint8_t actual = totalNoLeds - 1;    
  static uint32_t previousMillis = 0;
  const uint8_t myIntervall = 2;              // Schenlligkeit Fenster in Sekunden
  sensorWert= analogRead(eingang);
  Serial.print ("Helligkeit= ");
  Serial.println (sensorWert);
if (isDark){
  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
  }
}
else {
  digitalWrite(ledPin[actual], LOW);
}
}

ach der noiasca hat die Klammer beim Funktionsaufruf vergessen und der Tim schreibt das falsch ab und achtet nicht auf die Kompilermeldungen.

if (isDark())

So vieleicht:

// Lighthouse with 8 LEDs and one top PWM
// https://forum.arduino.cc/index.php?topic=711838
// by noiasca
// 2020-11-03  V2: LDR

#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};   // Pins simulating a "running light"
const size_t totalNoLeds = sizeof(ledPin);
const uint8_t sensorPin = A1;                         // LDR for day/night/
const uint8_t adcDark = 30;                           // threashold LDR for dark/night
const uint8_t adcBright = 100;                        // threashold LDR for bright/day
uint32_t currentMillis = 0;                           // stores actual timestamp


bool isDark (void)
{
  static bool result = false;
  int sensorValue = analogRead(sensorPin);
  if (sensorValue < adcDark) result = true;
  else if (sensorValue > adcBright) result = false;
  return result;
}


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;          // stores timestamp/millis of last change
  const uint8_t myInterval = 5;                // interval in seconds

  if (isDark())
  {
#if DEBUG_UART
    Serial.println("dark/night");
#endif
    if (currentMillis - previousMillis >= myInterval * 1000UL)
    {
      previousMillis = currentMillis;
      digitalWrite(ledPin[actual], LOW);         // switch off old (=current) LED
      actual++;                                  // goto next LED
      if (actual >= totalNoLeds) actual = 0;     // handle rollover to zero
      digitalWrite(ledPin[actual], HIGH);        // switch on new LED
#if DEBUG_UART
      Serial.print("actual Pin=");
      Serial.println(ledPin[actual]);
#endif
    }
  }
  else
  {
#if DEBUG_UART
    Serial.println("bright/day");                       // if day and pin is on switch pin off
#endif
    if (digitalRead(ledPin[actual]) == HIGH)
      digitalWrite(ledPin[actual], LOW);
  }
}

void doPWM()                                   // Pulse/fade the LED up and down
{
  static uint32_t previousMillis = 0;          // stores timestamp/millis of last change
  const uint16_t myInterval = 10;              // speed of PWM
  static int8_t dir = 1;                       // direction upwards(1) or downwards (-1)
  static uint8_t newPwm;

  if (millis() - previousMillis >= myInterval)
  {
    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;                             // this will increase (+1) or decrease (-1) the PWM
    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
}

noiasca: ach der noiasca hat die Klammer beim Funktionsaufruf vergessen und der Tim schreibt das falsch ab und achtet nicht auf die Kompilermeldungen.

if (isDark())

So vieleicht:

// Lighthouse with 8 LEDs and one top PWM
// https://forum.arduino.cc/index.php?topic=711838
// by noiasca
// 2020-11-03  V2: LDR

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};   // Pins simulating a "running light" const size_t totalNoLeds = sizeof(ledPin); const uint8_t sensorPin = A1;                         // LDR for day/night/ const uint8_t adcDark = 30;                           // threashold LDR for dark/night const uint8_t adcBright = 100;                        // threashold LDR for bright/day uint32_t currentMillis = 0;                           // stores actual timestamp

bool isDark (void) {  static bool result = false;  int sensorValue = analogRead(sensorPin);  if (sensorValue < adcDark) result = true;  else if (sensorValue > adcBright) result = false;  return result; }

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;          // stores timestamp/millis of last change  const uint8_t myInterval = 5;                // interval in seconds

 if (isDark())  {

if DEBUG_UART

   Serial.println("dark/night");

endif

   if (currentMillis - previousMillis >= myInterval * 1000UL)    {      previousMillis = currentMillis;      digitalWrite(ledPin[actual], LOW);         // switch off old (=current) LED      actual++;                                  // goto next LED      if (actual >= totalNoLeds) actual = 0;     // handle rollover to zero      digitalWrite(ledPin[actual], HIGH);        // switch on new LED

if DEBUG_UART

     Serial.print("actual Pin=");      Serial.println(ledPin[actual]);

endif

   }  }  else  {

if DEBUG_UART

   Serial.println("bright/day");                       // if day and pin is on switch pin off

endif

   if (digitalRead(ledPin[actual]) == HIGH)      digitalWrite(ledPin[actual], LOW);  } }

void doPWM()                                   // Pulse/fade the LED up and down {  static uint32_t previousMillis = 0;          // stores timestamp/millis of last change  const uint16_t myInterval = 10;              // speed of PWM  static int8_t dir = 1;                       // direction upwards(1) or downwards (-1)  static uint8_t newPwm;

 if (millis() - previousMillis >= myInterval)  {    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;                             // this will increase (+1) or decrease (-1) the PWM    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 }

Ich hab es so gemacht :) ging dann auch

bool isDark = false;


void doDS(){ 
  
  if (analogRead(eingang) < Nacht){
  isDark = true;
  }
  else if (analogRead(eingang) > Tag) isDark = false;
}
void doRunning()                              
{
  
  static uint8_t actual = totalNoLeds - 1;    
  static uint32_t previousMillis = 0;
  const uint8_t myIntervall = 2;              // Schenlligkeit Fenster in Sekunden
  sensorWert= analogRead(eingang);
  Serial.print ("Helligkeit= ");
  Serial.println (sensorWert);
if (isDark){
  if (currentMillis - previousMillis >= myIntervall * 1000UL)
  {
    previousMillis = currentMillis;
    digitalWrite(ledPin[actual], LOW);
    actual++;
    if (actual >= totalNoLeds) actual = 0;
    digitalWrite(ledPin[actual], HIGH);

gefällt mir aber trotzdem nicht.

du machst jetzt in der doRunning Funktion einen separten analogRead für dein Print.

Wenn dir daran was liegt, dann mach den Print in der Funktion - denn dort liest sowieso schon den Analog-Eingang. Also warum nicht dort ausgeben. Und in deiner doDS zwei analogRead - das geht auch besser.

Analog-Eingang lesen ist relativ langsam, kostet Programmspeicher und doppelte Zeilen willst du nicht. Ist nur eine potentielle Fehlerquelle bei Erweiterungen und Umbauten.

noiasca: gefällt mir aber trotzdem nicht.

du machst jetzt in der doRunning Funktion einen separten analogRead für dein Print.

Wenn dir daran was liegt, dann mach den Print in der Funktion - denn dort liest sowieso schon den Analog-Eingang. Also warum nicht dort ausgeben. Und in deiner doDS zwei analogRead - das geht auch besser.

Analog-Eingang lesen ist relativ langsam, kostet Programmspeicher und doppelte Zeilen willst du nicht. Ist nur eine potentielle Fehlerquelle bei Erweiterungen und Umbauten.

OK, verstanden. nun, da die turmleuchte ja nicht mehr blinken soll, sondern eine "rundumleuchte" sein soll, muss ich den Schrittmotor noch einbinden das dieser Gleichzeitig mit den Lampen läuft. Das mit dem Motor kein ding, auch das er die richtige Geschwindigkeit hat nur wie bekomme ich das mit unter? Bei mir läuft er in dem Programm integriert nicht los.

vertehe ich nicht. Du hast dann 8 die LEDS die einzeln aufleuchten UND eine Rundleuchte die dauerhaft leuchtet? Und das soll auch noch Syncron laufen? ernsthaft?

Das bekommst ohne einer aktiven Rückmeldung / Nullung imho nie dauerhaft syncron.

Kannst da mal vorsichtshalber eine Skizze zeichnen damit man sich das vorstellen kann?

noiasca: vertehe ich nicht. Du hast dann 8 die LEDS die einzeln aufleuchten UND eine Rundleuchte die dauerhaft leuchtet? Und das soll auch noch Syncron laufen? ernsthaft?

Das bekommst ohne einer aktiven Rückmeldung / Nullung imho nie dauerhaft syncron.

Kannst da mal vorsichtshalber eine Skizze zeichnen damit man sich das vorstellen kann?

Also ich habe die 8 LED´s die laufen nacheinander,das ist die Beleuchtung in den Fenstern. Nun soll gleichzeitig oben eine LED an sein (dauerhaft) um diese LED dreht sich ein Spiegel über einen Schrittmotor.

wenn du schon ein fullquote machst dann bitte beantworte auch alle Fragen. erwartest du dass die beiden syncron laufen? also wenn das Nordfenster leuchtet - die Rundumleuchte auch nach Zeigt?

noiasca: wenn du schon ein fullquote machst dann bitte beantworte auch alle Fragen. erwartest du dass die beiden syncron laufen? also wenn das Nordfenster leuchtet - die Rundumleuchte auch nach Zeigt?

Oh sorry, da hab ich die frage wohl auch nicht richtig verstanden. Nein wo die obere leuchte steht ist egal, unabhängig von den Fenster, sie soll einfach nur mit 1U/min drehen.