Go Down

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

michael_x

Du meinst sicher die Zeile
const int ldrSchwellwert=200;
in uxomms Sketch.

Richtig erkannt, int gehen bis max 32767. (und das ist schon viel, willkommen in der Welt der 8-bit Controller )

Aber da es hier verwendet wird:

      if (analogRead(ldrPin) < ldrSchwellwert) {   
              // LDR auswerten und falls es "dunkel" ist, das Relais schalten:

ist ein Wert > 1023 nicht erforderlich.

blackscorpion371

#31
Feb 06, 2018, 02:28 pm Last Edit: Feb 06, 2018, 02:40 pm by blackscorpion371
Ich hab mal ein Foto angehängt.

ich denke es sollte so sein wie es uxomm dargestellt hat.

ldr mit einem Beinchen auf 5V mit dem anderen auf A0 und den Widerstand auf 10kOhm eingestellt und von A0 zu GND

blackscorpion371

#32
Feb 06, 2018, 02:43 pm Last Edit: Feb 06, 2018, 02:49 pm by blackscorpion371
FOTO :o geht nicht???

Tommy56

Steht hier.

1. Als Attachment hochladen
2. Mit dem Ling dann als Bild anhängen

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

uxomm

#34
Feb 06, 2018, 03:14 pm Last Edit: Feb 06, 2018, 03:15 pm by uxomm
LDR und Widerstand sollten so angeschlossen werden (Schaltplan):


Hier noch ein "Fritzingbildchen" - allerdings schaut der Nano anders aus als jener vom Anfangspost, also bitte die Beschriftung der Pins beachten.
Always decouple electronic circuitry.

uxomm

Um zu prüfen ob der LDR funktioniert bzw. ob er richtig angeschlossen ist, empfehle ich folgenden einfachen Sketch (so einen ähnlichen gibt es auch in den Beispielen der IDE).
Code: [Select]
void setup() {
  Serial.begin(9600);
  Serial.println("Los gehts...");
}

void loop() {
  Serial.println(analogRead(A0));
  delay(250);
}

Anschluss von LDR und Widerstand wie im Beitrag oben.
Wenn du den seriellen Monitor der IDE aufmachst (Einstellung: 9600 Baud) müsstest du Zahlen sehen, es sind die Werte, die vom Analogpin A0 kommen. Die Zahlen verändern sich, je nachdem, wieviel Licht auf den LDR fällt (viel Licht: größere Zahlen, wenig Licht: kleinere Zahlen).

Falls das nicht der Fall ist, dann ist was faul. :)
Always decouple electronic circuitry.

blackscorpion371

Hab den Fehler gefunden, LDR steckte nicht auf 5V sondern auf dem leeren Pin davor, nun gehts.

Hab mal 800 als Schwellenwert angegeben und muss es mal in der Fahrzeughalle testen am Tag.

Habe den sketch mal um das zweite Relais erweitert und es funktioniert.

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 = 800;      // Wert wurde "experimentell" für meinen LDR ermittelt
const int stromstossDauer = 800;     // gewünschte Stromstoß-Dauer (Millisekunden)
const byte relaisPin1 = 3;
const byte relaisPin2 = 2;
const byte ldrPin = A0;

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() {
  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(ldrPin) < ldrSchwellwert) {    // LDR auswerten und falls es "dunkel" ist, das Relais schalten:
        digitalWrite(relaisPin1, LOW);  // Relais EINS EIN
        digitalWrite(relaisPin2, LOW);  // Relais ZWEI EIN
        delay(stromstossDauer);
        digitalWrite(relaisPin1, HIGH);  // Relais EINS AUS
        digitalWrite(relaisPin2, HIGH);  // Relais ZWEI AUS
      }


Könnte ich auch einen zweiten LDR einbauen, der das zweite Relais steuert?
da könnte das Aussenlicht z.B. in der Nacht separat gesteuert werden.

michael_x

Quote
Könnte ich auch einen zweiten LDR einbauen, der das zweite Relais steuert?
Nur wenn du auch einen zweiten Widerstand und einen anderen Analog-Pin nimmst ;)

blackscorpion371

Klaro, dann also erweitern um: const byte ldrPin2 = A1;

wie müsste der code aussehen um den Schwellwert des zweiten ldr separat einstellen zu können

michael_x

Wie stellst du den Schwellwert des ersten ldr ein?

Bist du damit zufrieden?

blackscorpion371

Zufrieden?

Es funktioniert doch! muss nur die perfekten Werte herausfinden und das mache ich am Besten vor Ort.

Die Frage war ob ich den zweiten LDR extra steuern kann, also ldrSchwellwert 1 und ldrSchwellwert 2 oder so ähnlich

dony

#41
Feb 07, 2018, 09:19 am Last Edit: Feb 07, 2018, 09:24 am by dony
Hallo,

Ja, das kannst Du, wie michael_x schon schrieb, einfach einen weiteren LDR mit einen weiteren PullUp Widerstand an A1 und GND anschließen.

Nachtrag: Den Wert des zweiten LDRs kannst Du dann getrennt voneinander Abfragen. Du verwendest dann 2 Analoge Eingänge

lg dony
Grüße, Donny

dony

#42
Feb 07, 2018, 10:01 am Last Edit: Feb 07, 2018, 10:03 am by dony
wie müsste der code aussehen um den Schwellwert des zweiten ldr separat einstellen zu können
Ich hab den zuletzt geposteten Code um 'A1' erweitert. Allerdings macht der Code nichts anderes als einen zweiten Schwellwert zu überprüfen.

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 = 800;      // Wert wurde "experimentell" für meinen LDR ermittelt
const int ldrSchwellwert2 = 1000;      // Gewünschter Schwellwert
const int stromstossDauer = 800;     // gewünschte Stromstoß-Dauer (Millisekunden)
const byte relaisPin1 = 3;
const byte relaisPin2 = 2;
const byte ldrPin = 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(ldrPin2));  // LDR Wert anzeigen
  if(analogRead(ldrPin2) < ldrSchwellwert2) { // Zweiten Schwellwert mit zweiten LDR vergleichen
    Serial.println("Schwellwert überschritten.");
  }
  else {
    Serial.println("Schwellwert nicht überschritten.");
  }

  //  Das läuft wie gewohnt weiter
  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(ldrPin) < ldrSchwellwert) {    // LDR auswerten und falls es "dunkel" ist, das Relais schalten:
        digitalWrite(relaisPin1, LOW);  // Relais EINS EIN
        digitalWrite(relaisPin2, LOW);  // Relais ZWEI EIN
        delay(stromstossDauer);
        digitalWrite(relaisPin1, HIGH);  // Relais EINS AUS
        digitalWrite(relaisPin2, HIGH);  // Relais ZWEI AUS
      }
    }
  }
}


lg dony
Grüße, Donny

michael_x

Quote
muss nur die perfekten Werte herausfinden und das mache ich am Besten vor Ort
Musst halt für jeden Versuch neu kompilieren...


Wann das ok ist, und da du sogar von dony die gewünschte Ergänzung gepampert kriegst, schön für dich. ;)

Dass in donys Beispiel die zwei Relais sinnloserweise wie vorher immer parallel schalten (abhängig vom ersten LDR) und der zweite LDR nur ein Serial.print macht, ist von dony so gewollt und solltest du im Sketch auch nachvollziehen können. ( Vermutlich damit du es dir selber anpasst. )

dony

...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
Grüße, Donny

Go Up