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.
timsieberg: 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!
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.
timsieberg: Bekomme ich Getriebemotoren mit so kleiner Übersetzung?
Ja, dafür ist das Getriebe.
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?