Hallo zusammen.
Ich bin recht neu auf dem Gebiet Arduino und Co. und hab da nen Problem.
Ich möchte eine Lichtsteuerung bauen, die ab einer bestimmten Dunkelheit an geht und dann für ca. 2 Stunden leuchtet.
Die einzelnen Komponenten (Vorwiderstand, LED und Photozelle) sind schon fertig verkabelt. Auch der Sketch funktioniert schon soweit, dass das Licht angeht bei einer gewissen Dunkelheit. Aber die LED schaltet leider erst ab wenn ein bestimmter Helligkeitswert überschritten wird.
Ich habe hier im Forum schon ähnliche Probleme gesehen, die mit der millis() Funktion gelöst wurden. Aber irgendwie stehe ich auf dem Schlauch. Wie und wo muss ich denn die millis() Funktion einbinden.
Für Tipps oder den kompletten Sketch wäre ich dankbar.
Greetz Darius
Hier mein Sketch:
int licht;
void setup() {
Serial.begin(9600);
pinMode(4, OUTPUT);
}
void loop() {
licht = analogRead(0);
Serial.println(licht);
if (licht > 300 ) {
digitalWrite(4, LOW);
}
else {
digitalWrite(4, HIGH);
}
}
Spratzen:
Auch der Sketch funktioniert schon soweit, dass das Licht angeht bei einer gewissen Dunkelheit. Aber die LED schaltet leider erst ab wenn ein bestimmter Helligkeitswert überschritten wird.
Du solltest nochmal richtig erklären was das Programm machen soll. Denn dass eine Lichtsteuerung einschaltet ab einer gewissen Dunkelheit, und ausschaltet ab einer gewissen Helligkeit finde ich richtig. Aber ich weiß auch nicht, welche Funktion du haben willst.
Franz
Hallo und danke schonmal für die Antworten.
Also die Lichtsteuerung soll dazu dienen, vor einem Haus die Aussenbeleuchtung anzuschalten. Ab 20 Uhr wird dort dann aber kein Licht mehr benötigt. Damit das Licht nicht bis zum Sonnenaufgang durchleuchtet, hätte ich gerne einen Timer, der nach dem Anschalten Zeit X wartet und dann wieder ausschaltet.
noiasca:
klar oder? Ist dir bewusst was das else macht?
Vom Anfänger hätte ich einfach erwartet. dass er nach dem Einschalten ein Delay ins IF packt.
Wenn du es sauber machen willst rate ich dir - schau dir mal das Beispiel "Blink without delay" an
Delay hatte ich am Anfang auch.
Ging nur nicht. Daher hab ich weitergesucht und bin auf millis() gestoßen. Aber bisher mit wenig Erfolg. Das BlinkWithoutDelay hab ich auch schon mit Erfolg gemacht. Allerdings scheitert es bei mir daran, das die Bedingung für das millis() erst in der else-Bedingung starten soll.
So sieht mein Sketch jetzt aus :
const int led = 4;
int ledState = LOW;
unsigned long Millis_beim_einschalten = 0;
const long interval = 5000;
int licht;
void setup() {
Serial.begin(9600);
pinMode(4, OUTPUT);
}
void loop() {
licht = analogRead(0);
Serial.println(licht);
unsigned long currentMillis = millis();
if (licht > 300 ) {
digitalWrite(4, LOW);
}
else {
digitalWrite(4, HIGH);
Millis_beim_einschalten = millis();
if (Millis_beim_einschalten + interval) == millis() {
digitalWrite(4, LOW);
}
}
}
Geht aber auch nicht.
Vielen Dank schon mal für Deine Hilfe. Aber wenn ich Deinen Code übernehme, dann verhält sich die Schaltung folgendermaßen:
Licht geht an wenn es dunkel wird, bleibt aber auch an! Erst wenn es wieder hell ist wartet die LED die Intervaldauer und schaltet dann ab. Vielleicht hast Du mich missverstanden, aber so war das nicht gewollt.
Ich wollte, dass nachdem die LED angegangen ist, das er bis "Intervalwert" zählt und dann ausschaltet. Deswegen hatte ich in meinem Sketch in der Ersten IF mit LOW gearbeitet.
Ich verzweifel hier bald. Man sollte meinen, das das eigentlich ganz einfach geht.
Greetz Spratzen
Hi
Es ist auch ganz einfach.
Du willst, daß, wenn es NICHT MEHR HELL IST, eine Zeit abläuft.
Lösung: Merke Dir die aktuelle Zeit, wenn's hell ist.
Nun ist' plötzlich dunkel - wir kommen also in den ELSE-Zweig.
Hier fragst Du ab, ob die Wartezeit bereits vorbei ist.
Wenn JA -> Lampe AUS
Wenn NEIN -> Lampe AN
Eine weitere Abfrage, ob die Lampe bereits an (oder aus) ist, bringt Dir keinen Vorteil, also stur ein bzw aus schalten.
if (millis()-millis_zuletzte_hell>=wartezeit){
-> licht aus
}else{
-> licht an
}
MfG
PS: Und ersetze die 'magic numbers' - also feste Zahlen - dafür nimmt man Konstanten und schreibt in Deren Kommentar, wofür Die sind - sprechende Namen haben sich allgemein bewährt.
Ja. So kann man es sagen. Deswegen hatte ich meine erste IF Bedingung ja auf "IF licht > 300 dann LOW gesetzt. Damit er Morgens wenn der Wert wieder auf über 300 geht wieder in LOW Schaltet.
Ohne 3 States geht´s nicht? Hab ich noch nicht wirklich was drüber gelesen.
Spratzen:
...
}
}
}
...
Boh, drei Klammern, alle in der selben „Ebene“. Da hab' ich neulich ja zum richtigen Thema in die Tasten gegriffen 
Gruß
Gregor
So. Ich hab mir jetzt was anderes überlegt, damit ich mich Sinnvolleren Projekten widmen kann. Aber liebe Kinder, bitte nicht Zuhause nachmachen. 
Hier mein Sketch:
const int led = 4;
int licht;
void setup() {
Serial.begin(9600);
pinMode(4, OUTPUT);
}
void loop() {
licht = analogRead(0);
Serial.println(licht);
if (licht >= 300 ) {
digitalWrite(led, LOW);
}
if (licht < 300 ) {
digitalWrite(led, HIGH); // Licht an
delay(9000000); // 150 Minuten Licht an
digitalWrite(led, LOW); // Licht aus
delay(46800000); // dann 13 Stunden aus.Dann sollte es eigentlich
wieder hell sein. :)
}
}
Auch wenn ich keine schöne Lösung hinbekommen habe, allen beteiligten vielen Dank für Ihre Hilfe.
Greetz Spratzen
const byte led = 4; //Anschluss der Beleuchtung
const byte ldr = A0; //Anschluss des LDR (licht abhängiger Widerstand)
const uint16_t Helligkeitsgrenze = 300; //ab wann ist's dunkel?
uint32_t zuletzt_hell_um;
uint32_t Wartezeit = 2*60*60*1000; //2 Stunden a 60 Minuten a 60 Sekunden a 1000 Milisekunden)
void setup() {
pinMode(led, OUTPUT);
}
void loop() {
if (analogRead(ldr) >= Helligkeitsgrenze ) { //setzt A0 selber auf INPUT
zuletzt_hell_um = millis();
} else if (millis() - zuletzt_hell_um >= Wartezeit) {
digitalWrite(led, LOW); // Licht aus
} else {
digitalWrite(led, HIGH); // Licht an
}
}
für_Mega_kompiliert:
Der Sketch verwendet 1424 Bytes (0%) des Programmspeicherplatzes. Das Maximum sind 253952 Bytes.
Globale Variablen verwenden 13 Bytes (0%) des dynamischen Speichers, 8179 Bytes für lokale Variablen verbleiben. Das Maximum sind 8192 Bytes.
Warum hier alle Variablen, auch die Konstanten, als globale Variablen gezählt werden - kA.
Hätte Da jetzt 8 Byte erwartet ...
Drück Mal STRG+T in der IDE und probiere hier die CODE-Tags aus, dann sieht der Code so aus, wie hier.
MfG
Vielen lieben Dank. Das funzt Super und ist sehr variabel. Danke.
Grüße Spratzen