Go Down

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

timsieberg


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.

Code: [Select]
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);
}
}



noiasca

#31
Nov 03, 2020, 05:15 pm Last Edit: Nov 03, 2020, 05:18 pm by 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:

Code: [Select]

// 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
}
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

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:

Code: [Select]

// 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
Code: [Select]
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);

noiasca

#33
Nov 03, 2020, 05:56 pm Last Edit: Nov 03, 2020, 06:00 pm by 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.
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

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.

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?
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

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.

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?
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

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.

my_xy_projekt

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.
?
wird die Funktion nicht aufgerufen oder passiert da drin nichts?
Wenn letzteres debuggen!

Code: [Select]

  if (millis() - previousMillis >= myInterval)
  {
    previousMillis = millis();
Serial.print("Punkt 1 - dir ist: ");
Serial.println(dir);
Serial.print("Punkt 1 - newPwm ist: ");
Serial.println(newPwm);

    if (dir == 1 && newPwm >= 254)             // end of scale
      dir = -1;                                // go downwards
Serial.print("Punkt 2 - dir ist: ");
Serial.println(dir);
    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
Serial.print("Punkt 3 - newPwm ist: ");
Serial.println(newPwm);

    analogWrite(pwmPin, newPwm);
#if DEBUG_UART
    Serial.print("newPwm=");
    Serial.println(newPwm);
#endif


Ausgabe beobachten und nachschauen, ob das rauskommt, was Du erwartest.

Oder Deinen Code liefern, wenn der sich von noiasca unterscheidet.

agmue

Bekomme ich Getriebemotoren mit so kleiner Übersetzung?
Ja, dafür ist das Getriebe.

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

noiasca

#41
Nov 04, 2020, 07:08 pm Last Edit: Nov 04, 2020, 07:16 pm by noiasca
wenn du nun einen Getriebemotor für oben einsetztet, dann brauchst doch nur den Motor (und die LED) über ein Relais oder ähnliches einschalten. Sehe da jetzt nicht wirklich ein Problem. nur prüfen auf isDark --> einschalten sonst ausschalten. Oder?
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

wenn du nun einen Getriebemotor für oben einsetztet, dann brauchst doch nur den Motor (und die LED) über ein Relais oder ähnliches einschalten. Sehe da jetzt nicht wirklich ein Problem. nur prüfen auf isDark --> einschalten sonst ausschalten. Oder?

Ich habe einen schrittmotor, schreibe ich den befehl in void loop() dreht sich natürlich der motor und dadurch das dies nie beendet wir fangen die LEd´s nicht an zu leuchten. Schreibe den befehl in z.B Void doMotor() und rufe ihn in void loop() dreht er sich nicht

Tommy56

Da es hier immer nur Fragmente zur Helligkeitssteuerung gab und keinen Sketch mit dem Stepper, kann ich nur raten. Ich vermute ich mal, dass Du die Stepper.h verwendest. Diese blockiert. Nimm lieber auch dafür die MoBaTools.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

noiasca

#44
Nov 04, 2020, 07:50 pm Last Edit: Nov 04, 2020, 07:53 pm by noiasca
aha also doch Stepper. Ist zu spät jetzt.

Code: [Select]

// Lighthouse with 8 LEDs and one top PWM
// https://forum.arduino.cc/index.php?topic=711838
// by noiasca
// 2020-11-04  V3: Motor switch on/off
// 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
const uint8_t motorPin = 11;

bool isDark()
{
  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 doMotor()                                 // switch on / off one Motor
{
  static bool previousState = false;
  if (isDark())
  {
    if (previousState == LOW)
    {
      previousState = HIGH;
      digitalWrite(motorPin, HIGH);
      // oder eben Stepper hier einschalten dann aber auch aufpassen,
#if DEBUG_UART
      Serial.println("motor on");
#endif
    }
  }
  else
  {
    if (previousState == HIGH) {
      previousState = LOW;
      digitalWrite(motorPin, LOW);
      // oder eben Stepper hier ausschalten
#if DEBUG_UART
    Serial.println("motor off");
#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);
  pinMode(motorPin, 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
  doMotor();                // check, if the motor/LED should be switched on/off
  // do what ever you want unblocked here
}


Tommy wird schon recht haben. Das wird blockieren wenn du nicht die Mobatools verwendest
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.

Go Up