Neuling sucht eine Lösung

lernen durch machen und nicht durch raten :wink:

Wenn du unter "machen" "copy&paste" verstehs: Gibt auch noch die Varianten "versuchen zu verstehen" und evtl. "ausprobieren".
Das ist zwar näher am "raten", finde ich aber trotzdem spannender :wink:

Selbst mit copy&paste kann ich vergleichen was ich zuviel, oder zuwenig habe.

Ist noch vieles zu lernen und einiges anzuschaffen. als nächstes mal so ein Steckboard z.B. bin ja noch
am Anfang und Rom wurde auch nicht in einer Woche erbaut :wink:

jetzt nochmal zum aktuellen Projekt:

Im Großen und Ganzen läuft es wie gewünscht nur der 2. LDR (Aussenbeleuchtung) schaltet schon wenn es noch zu hell ist, obwohl ich den Wert schon auf 1 gesetzt habe. Ich verwende unten gezeigte LDR für beide Kanäle und jeweils 10 kOhm als Spannungsteiler.
Von ganz hell zu ganz dunkel zeigt das Messgerät zwischen 5 kOhm und 10 kOhm an.
Für den 1. Kanal (Innenbeleuchtung) passt das gut nur eben für außen nicht. Kann ich durch ändern des Spannungsteilers für den LDR2 daran etwas ändern? (muss immer noch löten udn kann nicht so einfach umher stecken) oder muss ein anderer LDR her?

Auf jeden Fall schon einmal vielen Dank an alle, welche bisher geholfen haben.

@postmaster

Satzzeichen gab es auch 1977 als ich in die Schule gekommen bin schon und sind mir nicht fremd, wobei ich die alte Rechtsschreibung bevorzuge! :slight_smile:

MfG Iev

Die Theorie für die Spannung am analogen Eingang, Schaltung entsprechend #35:

UA0 = (5V * 10k) / (RLDR + 10k)

RLDR = 5 kOhm ergibt 3,3 V
RLDR = 10 kOhm ergibt 2,5 V

Kannst Du diese Werte in der Praxis bestätigen?

Wenn ja, liegen sie weitab der Grenzen 0V und 5V.

Hi

Ganz so früh war meine Schulzeit nun doch wieder nicht, aber zumindest war ich da schon existent ;).
(Mit der 'Nummer der Rechtschreibung' stimme ich Dir voll und ganz zu, zumindest war ich mit der Schule soweit durch, als dieser Quatsch anfing ... oder wohl neuerdings 'schreiben nach Gehör' ... was ein Tinnef)

Wenn Du den Spannungsteiler änderst, ändert sich auch die Mess-Spannung (3-fach S geschickt umgangen :wink: ).

Wenn Du den LDR an +5V angeschlossen hast, das andere Ende an A0 und dem Pull-DN Widerstand und Dessen Ende an GND, müsste laut den Info's hier im Thread bei voller Beleuchtung 5K zu 10K, bei Dunkelheit 28K zu 10K den Spannungsteiler bilden.

Du musst in Deinem Programm noch eine Umrechnung drin haben, daß Du mit diesen Werten (3,3V bzw 1,3V) auf '1' kommst.
Welche Referenz benutzt der Arduino derzeit?
Wenn Du jetzt Fragezeichen in den Augen hast: Versorgungsspannung (also 5V bei 5V-Systemen, 3.3V bei 3.3V)
Quelle: im Nachbarthread - von 2014

MfG

PS: irgendwo her hatte ich die 28K ...

postmaster-ino:
PS: irgendwo her hatte ich die 28K ...

Möglicherweise aus dem Datenblatt, siehe #11 und #13 :wink:

Produktblatt LDR

Mein Arduino UNO läuft mit 5 Volt

Der Nano der später zum Einsatz kommen soll ebenso.

Der Link zum Nachbarthread von 2014 funktioniert leider nicht.

@agmue

verstehe gerade nicht was du meinst?

5*10 / 15 + 10

500 / 25

Ich gehe hiervon aus:

blackscorpion371:
Ich verwende unten gezeigte LDR für beide Kanäle und jeweils 10 kOhm als Spannungsteiler.
Von ganz hell zu ganz dunkel zeigt das Messgerät zwischen 5 kOhm und 10 kOhm an.

blackscorpion371:
Mein Arduino UNO läuft mit 5 Volt

UA0 = (5V * 10k) / (RLDR + 10k) -> das "k" steht für kiloOhm

UA0 = (50Vk) / (5k + 10k) = 50Vk / 15k = 3,3V

UA0 = (50Vk) / (10k + 10k) = 50Vk / 20k = 2,5V

Oder?

blackscorpion371:
Im Großen und Ganzen läuft es wie gewünscht nur der 2. LDR (Aussenbeleuchtung) schaltet schon wenn es noch zu hell ist, obwohl ich den Wert schon auf 1 gesetzt habe. Ich verwende unten gezeigte LDR für beide Kanäle und jeweils 10 kOhm als Spannungsteiler.

Schau doch einfach mal welche Werte du mit deinen LDRs bei verschiedenen Helligkeiten bekommst.
Dafür kannst du zum Beispiel so einen einfachen Sketch verwenden:

const byte ldrPin1 = A0;
const byte ldrPin2 = A1;

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.print("LDR 1: ");
  Serial.print(analogRead(ldrPin1));
  Serial.print("\t");
  Serial.print("LDR 2: ");
  Serial.print(analogRead(ldrPin2));
  Serial.println();
  delay(500);
}

Anschluss der LDRs so (also genauso wie bei deinem Projekt):
Schaltplan_2LDRs.png
Mach den Seriellen Monitor auf (Tools/Serial Monitor) und schau dir an, welche Werte du bekommst.
Die sollten sich deutlich für "hell" und "dunkel" unterscheiden.
Falls das nicht der Fall ist, ist was faul. :slight_smile:

habe jetzt einen einzelnen LDR genommen (waren 5 Stück im Beutelchen)

beide Beinchen ans Multimeter und bei Beleuchtung mit der Taschenlampe werden etwa 220 Ohm angezeigt und bei abdecken mit Finger zwischen 15 kOhm und 28 kOhm können aber keine Schwankungen von mir sein, da ich es in Krokodilklemmen geklickt habe um Messtoleranzen vom Körper ausschließen zu können.

wo muss ich ansetzen damit LDR2 auch nur bei ganz dunkel schaltet?

Damit kann ich wieder was anfangen.

Ganz hell um die 1000 und ganz dunkel um die 120

Dann dürfte aber ldr 2 nicht schalten wenn ich einen Schwellwert von 50 oder kleiner eingebe?!

blackscorpion371:
Damit kann ich wieder was anfangen.

Ganz hell um die 1000 und ganz dunkel um die 120

Falls sich das auf den Sketch in #61 bezieht, dann wären das recht plausible Werte.

Jetzt müsstest du noch einen brauchbaren "Schwellwert" finden.

Wenn ich das richtig in Erinnerung habe, dann soll das Hoflicht nur eingeschalten werden, wenn es "dunkel genug" ist. Es soll also NICHT einschalten wenn:

  • Das Sonnenlicht für ausreichend Helligkeit sorgt.
  • Oder die Hofbeleuchtung bereits eingeschaltet ist und es deshalb hell genug ist.
    Ich denke du brauchst "Naturmesswerte". Du solltest also Messungen mit dem LDR an jener Stelle machen, wo er dann platziert werden soll.
    Die konkreten Messwerte werden wohl stark davon abhängig sein, wo/wie du den LDR platzierst. Da musst du vielleich auch ein wenig experimentieren.
    Auf jeden Fall musst du einen Schwellwert wählen der für beide Situationen (Sonne oder Hofbeleuchtung) passt.

Beispiel:
Naturmesswert "zu Mittag, klarer Himmel": 1000*
Naturmesswert "bedeckter Himmel": 800*
Naturmesswert "Nacht, Hoflicht eingeschalten": 350*
Naturmesswert "Nacht, Hoflicht aus": 150*
--> es braucht einen Schwellwert zwischen 150 und 350. Also z.B. Schwellwert: 250


*) die Werte habe ich mir nur ausgedacht - du musst deine eigenen messen

blackscorpion371:
Dann dürfte aber ldr 2 nicht schalten wenn ich einen Schwellwert von 50 oder kleiner eingebe?!

Ja, genau, das Relais 2 schaltet nie, wenn du 50 als Schwellwert für LDR2 eingibst.
Edit: Nein, Relais 2 schaltet IMMER, wenn du so einen niedrigen Wert als Schwellwert einträgst.
Edit 2: Nein, nein, nein: Du hast recht, Relais 2 schaltet nie, wenn du 50 als Schwellwert für LDR2 eingibst.
Aber mir ist eigentlich der aktuelle Stand des Codes nicht ganz klar.

Hier eine Variante die (zumindest bei mir) funktioniert.
Du musst für dein Projekt wahrrscheinlich noch Anpassungen vornehmen.

// Schalten von Relais bei "Alarm" 
// Version 1.5 
//
// Falls ein 'A' über die serielle Schnittstelle empfangen wird,
// werden LDRs ausgewertet. Bei "Dunkelheit" werden RelaisPins
// für eine bestimmte Dauer auf LOW geschalten.

const int ldrSchwellwertGarage = 200;   // Wert "experimentell" für deinen LDR in der Garage ermitten!
const int ldrSchwellwertHof    = 250;   // Wert "experimentell" für deinen LDR im Hof ermitten!

const int stromstossDauer  = 500;     // gewünschte Stromstoß-Dauer (Millisekunden)
const byte relaisPinGarage = 3;
const byte relaisPinHof    = 4;
const byte ldrPinGarage = A0;
const byte ldrPinHof    = A1;

void setup() {
  Serial.begin(9600);
  digitalWrite(relaisPinGarage, HIGH);  // Das Relais-Modul ist "active LOW". Dies ist ein "Trick", damit es bei Reset nicht einschaltet.
  digitalWrite(relaisPinHof, HIGH); 
  pinMode(relaisPinGarage, OUTPUT);
  pinMode(relaisPinHof, OUTPUT);
}

void loop() {
  if (Serial.available()) {      // wenn Zeichen über die serielle Schnittstelle empfangen wurden...
    int inbyte = Serial.read();  // ein Zeichen lesen
    if (inbyte == 'A') {         // falls das Zeichen ein A ist...
      if (analogRead(ldrPinGarage) < ldrSchwellwertGarage) {    // LDR(Garage) auswerten und falls es "dunkel" ist, das Relais schalten:
         digitalWrite(relaisPinGarage, LOW);   // Relais Garage EIN
         delay(stromstossDauer);
         digitalWrite(relaisPinGarage, HIGH);  // Relais Garage AUS
      }
      if (analogRead(ldrPinHof) < ldrSchwellwertHof) {    // LDR(Hof) auswerten und falls es "dunkel" ist, das Relais schalten:
         digitalWrite(relaisPinHof, LOW);   // Relais Hof EIN
         delay(stromstossDauer);
         digitalWrite(relaisPinHof, HIGH);  // Relais Hof AUS
      }
    }
  }
}
// Schalten eines Relais bei "Alarm"
//
// Falls ein 'A' über die serielle Schnittstelle empfangen wird,
// wird ein LDR ausgewertet. Bei "Dunkelheit" wird der "relaisPin"
// für eine bestimmte Dauer auf LOW geschalten.

const int ldrSchwellwert = 900;      // Wert wurde "experimentell" für meinen LDR ermittelt
const int ldrSchwellwert2 = 125;      // Gewünschter Schwellwert
const int stromstossDauer = 800;     // gewünschte Stromstoß-Dauer (Millisekunden)
const byte relaisPin1 = 3;
const byte relaisPin2 = 2;
const byte ldrPin1 = A0;
const byte ldrPin2 = A1;

void setup() {
  Serial.begin(9600);
  digitalWrite(relaisPin1, HIGH);  // Das Relais-Modul ist "active LOW". Dies ist ein "Trick", damit es bei Reset nicht einschaltet.
  digitalWrite(relaisPin2, HIGH);
  pinMode(relaisPin1, OUTPUT);
  pinMode(relaisPin2, OUTPUT);
}

void loop() {
  //  Serial.println(analogRead(ldrPin1));  // LDR Wert anzeigen
  if (Serial.available()) {      // wenn Zeichen auf der seriellen Schnittstelle empfangen wurden...
    int inbyte = Serial.read();  // ein Zeichen lesen
    if (inbyte == 'A') {         // falls das Zeichen ein A ist...
      if (analogRead(ldrPin1) < ldrSchwellwert) {    // LDR auswerten und falls es "dunkel" ist, das Relais schalten:
        digitalWrite(relaisPin1, LOW);  // Relais EINS EIN
        delay(stromstossDauer);
        digitalWrite(relaisPin1, HIGH);  // Relais EINS AUS
      }

      //  Serial.println(analogRead(ldrPin2));  // LDR Wert anzeigen
      if (inbyte == 'A') {         // falls das Zeichen ein A ist...
        if (analogRead(ldrPin2) < ldrSchwellwert) {    // LDR auswerten und falls es "dunkel" ist, das Relais schalten:
          digitalWrite(relaisPin2, LOW);  // Relais EINS EIN
          delay(stromstossDauer);
          digitalWrite(relaisPin2, HIGH);  // Relais EINS AUS
        }
      }
    }
  }
}

bis auf den Wert für den außen LDR bin ich mal so zu frieden

Du gibst zwar einen Schwellwert für LDR2 an (Zeile 8 )

const int ldrSchwellwert2 = 125;

verwendest den aber dann nirgends, sondern es wird immer nur mit dem "normalen" Schwellwert verglichen.
Ich denke es sollte in Zeile 36 nicht

if (analogRead(ldrPin2) < ldrSchwellwert) {

sondern so heißen:

if (analogRead(ldrPin2) < ldrSchwellwert2) {
Grins. Das alte Copy & Paste-Problem, was wir alle schon mal erlebt haben - siehe direkt darunter den Kommentar welches Relais da angeblich geschaltet wird. Es hilft also, kopierte Zeilen nochmals kritisch durchzusehen oder - m.E. besser - statt zu kopieren dann gleich eine Methode/Funktion zu erfinden. Dann können auch viel leichter LDFR3, 4 und 5 ergänzt werden.

Gruß Walter

Stimmt, kleine Ursache große Wirkung, da kann ich ewig umstellen und probieren.

Danke @uxomm

erinnert mich an die ersten Gehversuche vor Jahren mit HTML, auf dem Bildschirm passte alles wunderbar
nur bei anderen nicht, weil eben z.B. die Pfade der Images auf die Festplatte verwiesen und nicht auf den Serverordner :wink:

So habe meine Steuerung nun fertig.

an Ausgang der 2. LDR habe ich am Schaltkontakt der Buchse einen 10 kOhm Widerstand eingesetzt, damit das entsprechende Relais auch nur schaltet wenn der externe LDR angesteckt ist, da ansonsten, wenn der Ausgang "offen" ist das Relais immer mit schaltet.

Bekomme wieder nur keine Bilder hier hoch geladen.

Danke allen für die tolle Unterstützung!!

Hätte schon eine neue Idee

Habe in der Vitrine ein Automodell auf einem Drehteller stehen.

wenn ich jetzt einem Nano sagen will, wenn LDR wert xxx, dann Licht an für xxx und wenn Licht an dann Drehteller für 15 min. an, danach wieder 15 min. aus, danach wieder 15 an und so weiter so lange das Licht an ist.

Wie müsste der Code dann aussehen?

blackscorpion371:
Wie müsste der Code dann aussehen?

Hast du denn aus den ganzen Vorschlägen und Beispielen die dir gemacht wurden überhaupt nichts gelernt ?

Warum versuchst du nicht mal selbst etwas zu schreiben und stellst das hier vor.

Dann können wir dir deine Fehler zeigen und evtl. berichtigen.