Neuling sucht eine Lösung

michael_x: ...auch nachvollziehen können. ( Vermutlich damit du es dir selber anpasst. )

Genau! ;)

Um nicht jedes mal neu kompilieren zu müssen, kann man sich die Werte der LDRs auch Seriell Ausgeben lassen. Ist im Code auskommentiert. lg dony

Danke, probiere ich morgen gleich mal aus, heute ist es sehr spät geworden.

Die Werte der LDR auslesen hat mich nicht wirklich weiter gebracht, zumal ich nun den ersten ersetzt habe um 2 baugleiche Komponenten zu verwenden.

So wie mein Code jetzt aussieht wird aber immer nur der erste LDR abgefragt. Ändere ich auf ldrPin2 wird der 2. LDR abgefragt aber der erste nicht mehr.
Deshalb denke ich Hardware mäßig sollte alles passen, aber im Code passt was noch nicht im loop.

Hat wer nen Tip?

// 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 = 800;      // Wert wurde "experimentell" für meinen LDR ermittelt
const int ldrSchwellwert2 = 200;      // 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("Schwellwert nicht überschritten.");
  }

  //  Serial.println(analogRead(ldrPin2));  // 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(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
      }
    }
  }
    }
  }
}
    int inbyte = Serial.read();  // ein Zeichen lesen
    if (inbyte == 'A') {         // falls das Zeichen ein A ist...

wenn du weisst was das soll, weisst du auch, warum das doppelt drin ist?

Hinweis: Auf der Seriellen Schnittstelle kommen Zeichen einzeln an. Wenn ein Zeichen da ist und du schnell genug bist, ist danach kein weiteres da...

      }
    }
  }
    }
  }
}

Da sag ich nichts zu, aber das wird beim Korrigieren auch besser ;)

Super war richtig hilfreich.............

und ohne die vielen geschweiften Klammern meckert ja das A IDE beim kompilieren.

Also was ist falsch und wie muss es richtig lauten?

heißt doch lernen durch machen und nicht durch raten ;-)

Dann mache mal dies:

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("Schwellwert nicht überschritten.");
      }

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

Danke nun funktioniert es, aber warum steht beim ldr1 in der Letzten Codezeile

Serial.println("Schwellwert nicht überschritten.");

bevor der Code für den ldr2 beginnt???

Das habe ich einfach von Deinem Programm übernommen. Wenn Du es nicht weißt, dann schmeiß es raus :)

Hi

Die IDE zeigt Dir an, wozu diese geschweifte Klammer gehört, wenn Du mit dem Cursor drauf gehst. Etwas augenfreundlicher formatieren kannst Du den Sketch per STRG+T Wenn dort mehrere Klammern senkrecht untereinander stehen - ist was faul. Das muß aber nicht zwingend sein, daß eine Klammer zu viel ist, da kann auch einfach ein ; in einer der Zeilen fehlen, daß der Compiler die Zeilen anders sieht, als die IDE.

Und mit so vielen Punkten am Stück wolltest Du was erreichen? Satzzeichen sind keine Rudeltiere - wobei ich ja schon froh bin, wenn überhaupt Welche benutzt werden - scheint heute in den Schulen nicht mehr zum Stoff zu gehören :(

MfG

lernen durch machen und nicht durch raten ;-)

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 ;)

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 ;-)

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?

|500x375

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! :)

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 ;) ).

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 ;)

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