Neuling sucht eine Lösung

Scherz oder?

nein eigentlich nicht.

sind meine ersten Gehversuche. das loop heist ja wohl immer wiederholen, das will ich aber nicht wenn ich da aber setup hinschreibe bekomme ich eine Fehlermeldung

Sieh dir mal die zahlreichen Beispiele an. In ALLEN findest du ein Setup.

Und du musst dir in einer Variablen merken, ob du schon geschaltet hast und entsprechend reagieren.

Und bei einem derartigen Projekt solltest du dich zwingend um die Grundlagen kümmern, das alles können wir dir nicht beibringen. Da hilft ein Fachbuch sehr effektiv.

Falls der Arduino nichts weiter zu tun hat, als auf den Alarm zu warten und dann das Relais für eine kurze Dauer einzuschalten, dann kann folgendes einfaches Programm funktionieren (eventuell musst du es noch ein wenig anpassen):

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

void setup() { 
  Serial.begin(9600);
  digitalWrite(relaisPin, HIGH);  // Das Relais-Modul ist "active LOW". Dies ist ein "Trick", damit es bei Reset nicht einschaltet.
  pinMode(relaisPin, 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(relaisPin, LOW);  // Relais EIN
        delay(stromstossDauer);
        digitalWrite(relaisPin, HIGH);  // Relais AUS
      }
    }
  }
}

Zur beachten ist: Dieser Sketch verwendet “delay”. Das bedeutet, dass während dieser Zeit (im Beispiel: 400 Millisekunden) das Board “blockiert” ist. Es wird dabei einfach die Zeit “totgeschlagen” und es kann auf nichts reagiert werden. In manchen Fällen ist das überhaupt kein Problem, in anderen aber schon. Falls also der Arduino sonst nichts zu tun hat, ist das OK.

Den LDR anschließen:

Arduino 5V Pin ------------------------+
                                       |
                                    ___|___
                                   | L D R |
                                    -------
                                       |
                                       |
Arduino Pin A0 ------------------------+
                                       |
                                       _
                                      | |
                                      | |  R (z.B. 10...20kOhm)
                                      |_|
                                       |
Arduino GND Pin -----------------------+

ldrSchwellwert musst du auf deine Gegebenheiten (deinen LDR) anpassen.

Werte meines LDR (Typ unbekannt) mit 10k als Spannungsteiler:

    335 ... 380  Deckenlampe eingeschaltet
     80          Beschattung des LDR mit Handfläche
     kleiner 50   Deckenlampe aus ("es ist ziemlich dunkel")
    800          Beleuchtung des LDR mit Taschenlampe

Ich habe 200 gewählt, weil dieser Wert deutlich unter dem Wert für “Deckenlampe ein” liegt und deutlich über “Abschattung” bzw. “Dunkelheit”. Mit deinem LDR ist möglicherweise ein anderer Wert nötig.

Konsolen-Kommando (bzw. bat-Datei) für Windows zum Aktivieren des Relais über die serielle Schnittstelle ausgehend von folgender Konfiguration:

  • Arduino hängt auf COM3
  • COM3 läuft mit 9600 Baud
echo Alarm > COM3

Hinweis: das funktioniert zuverlässig mit niedrigen Port-Nummern (unter 10). Bei höheren Nummern ist folgendes erfolgversprechend (Stichwort: kompletter “Dateiname”) - Beispiel: COM23

echo Alarm > \\.\COM23

Natürlich geht auch folgendes, weil ja nur auf das ‘A’ reagiert wird:

echo A > COM3

Folgendes funktioniert aber NICHT, weil ja ein großes A nötig ist:

echo a > COM3

Anzeige der aktuellen COM-Port-Einstellungen:

mode COM3

Die wesentlichste Einstellung ist die Baudrate. Diese muss 9600 betragen.
Falls COM3 konfiguriert werden muss, so geht das auf der Kommandozeile (bzw. bat-Datei) z.B. so:
Umstellen auf 9600 Baud:

mode COM3: baud=9600

Einstellen mehrer Parameter:

mode com3: baud=9600 parity=n data=8 stop=1

Um ein Reset beim Öffnen/Schließen der seriellen Schnittstelle zu verhindern wird (zum Beispiel) ein Elko gebraucht (wurde schon erwähnt - Minus auf “GND”, Plus auf “Reset”).
Zum Programmieren (Aufspielen des Sketch auf den Arduino) muss dieser Elko aber entfernt werden.

Das ist eine tolle Erklärung,

sobald ich morgen mein Conradpaket von der Post geholt habe lege ich los und werde berichten.

@uxomm Vielen Dank schon mal

wie schließe ich den Widerstand für den LDR an?

blackscorpion371: wie schließe ich den Widerstand für den LDR an?

Widerstände haben keine Polarisierung wie manche Kondensatoren, ist also egal.

das ein Widerstand keine Polarisierung hat weis ich

So Aufbau steht, prinzipiell arbeitet es auch, glaube nur das mein LDR nicht brauchbar ist.

bis ldrSchwellwert = 32767 schaltet die Geschichte, aber eben auch wenn ich mit der Taschenlampe genau drauf leuchte. ab ldrSchwellwert = 32768 schaltet nix mehr.

blackscorpion371: das ein Widerstand keine Polarisierung hat weis ich

Warum fragst dann danach ? uxomm hat doch schon gezeigt, wie du alles anschließen musst.

So Aufbau steht, prinzipiell arbeitet es auch, glaube nur das mein LDR nicht brauchbar ist.

bis ldrSchwellwert = 32767 schaltet die Geschichte, aber eben auch wenn ich mit der Taschenlampe genau drauf leuchte. ab ldrSchwellwert = 32768 schaltet nix mehr.

Hast du den LDR und Widerstand so wie uxomm gezeigt hat angeschlossen?

blackscorpion371:
bis ldrSchwellwert = 32767 schaltet die Geschichte …

Der analoge Eingang des Nano kann nur Werte von 0 bis 1023 liefern. Da stimmt was nicht!

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.

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

FOTO :o geht nicht???

Steht hier.

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

Gruß Tommy

LDR und Widerstand sollten so angeschlossen werden (Schaltplan):
LDR_Anschluss_Schaltplan.png

Hier noch ein “Fritzingbildchen” - allerdings schaut der Nano anders aus als jener vom Anfangspost, also bitte die Beschriftung der Pins beachten.
LDR_Anschluss_Bild.png

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

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

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.

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

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

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

Wie stellst du den Schwellwert des ersten ldr ein?

Bist du damit zufrieden?