Go Down

Topic: Neuling sucht eine Lösung (Read 2576 times) previous topic - next topic

agmue

Ich gehe hiervon aus:

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

uxomm

#61
Feb 11, 2018, 03:02 pm Last Edit: Feb 11, 2018, 03:05 pm by uxomm
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:
Code: [Select]
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):

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. :)
Always decouple electronic circuitry.

blackscorpion371

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?

blackscorpion371

#63
Feb 11, 2018, 03:34 pm Last Edit: Feb 11, 2018, 03:40 pm by blackscorpion371
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?!

uxomm

#64
Feb 11, 2018, 04:06 pm Last Edit: Feb 11, 2018, 04:15 pm by uxomm
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
Always decouple electronic circuitry.

uxomm

#65
Feb 11, 2018, 05:23 pm Last Edit: Feb 12, 2018, 09:14 pm by uxomm
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.
Code: [Select]
// 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
      }
    }
  }
}
Always decouple electronic circuitry.

blackscorpion371

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

uxomm

#67
Feb 12, 2018, 09:11 pm Last Edit: Feb 12, 2018, 09:12 pm by uxomm
Du gibst zwar einen Schwellwert für LDR2 an (Zeile 8 )
Code: [Select]
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
Code: [Select]
if (analogRead(ldrPin2) < ldrSchwellwert) { 
sondern so heißen:
Code: [Select]
if (analogRead(ldrPin2) < ldrSchwellwert2) { 
Always decouple electronic circuitry.

wno158

<OT>
Grins.
Das alte Copy & Paste-Problem, was wir alle schon mal erlebt haben - siehe direkt darunter den Kommentar welches Relais da angeblich geschaltet wird.
</OT>
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

blackscorpion371

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

blackscorpion371

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

blackscorpion371

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?

HotSystems

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.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Go Up