Arduino Forum

International => Deutsch => Topic started by: blackscorpion371 on Jan 28, 2018, 09:24 pm

Title: Neuling sucht eine Lösung
Post by: blackscorpion371 on Jan 28, 2018, 09:24 pm
Hallo,


will vom PC über USB mit einer *.bat ein Relais schalten lassen, welches den Eltako (Stromstossschalter) für das Garagenlicht einen Impuls gibt.

gekauft habe ich folgende Komponenten:

(https://i.ebayimg.com/images/g/gxsAAOSwZ4dZGrna/s-l1600.jpg)

und

(https://i.ebayimg.com/images/g/yI0AAOSweW5VQIAj/s-l500.jpg)


ein Arduino UNO ist auch vorhanden, aber noch keine Erfahrungen damit gemacht.

Habe bisher tageleang das WEB durchforstet und gelesen.

Ist mein Vorhaben eigentlich mit den beiden erstgenannten Komponenten umsetzbar?

Lässt sich der Microprozessor überhaupt per USB und bat- Datei ansteuern um einen Sketch zu starten?

Title: Re: Neuling sucht eine Lösung
Post by: postmaster-ino on Jan 28, 2018, 09:34 pm
Hi

Was hast Du wirklich vor?
Das Garagenlicht an und auszuschalten, wenn Du am PC ein Batchfile anklickst, sehe ich als nicht sonderlich sinnvoll an - nur so.

Du kannst mit dem Nano per USB-Serial-Wandler schwätzen.
Dieses kann dann, abhängig davon, was Du Ihm sagst, auch das Relais ansteuern.
Dort könnte man dann auch was mit schalten.

Die ganzen Arduino-Relais sind aber meist nicht sonderlich 230V geeignet, da Abstände zwischen 230V und dem Arduino-Strom nicht ausreichend sind (laut Vorschrift).
Da die Relais nicht der Reihe nach abfackeln, klappt's trotzdem - man sollte sich aber 2x überlegen, ob man die Schaltung dann noch anfassen will - es könnte nämlich dieses eine Relais durchschlagen und dann hast Du 230V auf Deinem Arduino.
Wenn Du jetzt noch halbwegs gut geerdet bist, löst der FI / RCD aus - ohne, bekommst Du 'Einen'.

Sofern Du also 230V schalten müsstest - NEIN!
Wenn Du Das für Dich abnicken kannst - die Tochter des Nachbarn kann Das nicht und da Du hier fragst, wirst Du nicht in diese Richtung ausgebildet worden sein.

(selbst, wenn das Relais die geforderten Kriechstrecken aufweist, müsstest Du an 230V herum schrauben - Das darf ebenfalls nicht Jeder und spätestens, wenn was passiert ist, wird's unangenehm)


230V -> ich rate dringend davon ab

Schutzkleinspannung o.Ä. -> erzähl mehr

MfG

*Edit*
Der Titel des Thread ist auch eher unglücklich gewählt - eigentlich wird in jedem Thread Hilfe ersucht, nur halt nicht immer von Neulingen.
Title: Re: Neuling sucht eine Lösung
Post by: Tommy56 on Jan 28, 2018, 09:38 pm
Früher (tm) konnte man in einer bat-Datei Daten an eine Serielle Schnittstelle schicken.
Es soll wohl heute auch noch gehen (https://www.computerhope.com/modehlp.htm).

Warum muss es aber eine batch-Datei sein? Soll das Garagenlicht nur vom PC us schaltbr sein?
Irgendwie kommt mir das komisch vor.

Gruß Tommy
Title: Re: Neuling sucht eine Lösung
Post by: Tommy56 on Jan 28, 2018, 09:43 pm
Ich kenne Stromstoßrelais mit 12/24V Steuerspannung. Ich kann mich aber auch täuschen und es gibt welche mit 230V Steuerspannung. Da stimme ich Deinen Einwänden voll zu.

Dann sollten bei den Relais die Trennungen zwischen 230V-Teil und Niederspannungsteil durch ausgefräste Zonen getrennt sein und der Bearbeiter über die nötige fachliche Eignung verfügen.
Das wird im Schadensfall die Versicherung peinlich genau prüfen, um nicht zahlen zu müsen.

Gruß Tommy
Title: Re: Neuling sucht eine Lösung
Post by: HotSystems on Jan 28, 2018, 10:16 pm
will vom PC über USB mit einer *.bat ein Relais schalten lassen, welches den Eltako (Stromstossschalter) für das Garagenlicht einen Impuls gibt.
Warum überhaupt mit einem Arduino ?
Das geht sicher auch ohne.

Quote
ein Arduino UNO ist auch vorhanden, aber noch keine Erfahrungen damit gemacht.
Dann solltest du die Grundlagen lernen, die du in der IDE findest.


Quote
Lässt sich der Microprozessor überhaupt per USB und bat- Datei ansteuern um einen Sketch zu starten?
Ja, der Controller lässt sich bei richtiger Programmierung drüber steuer, allerdings nicht den Sketch starten, der läuft ununterbrochen.
Title: Re: Neuling sucht eine Lösung
Post by: blackscorpion371 on Jan 29, 2018, 07:26 pm
Das Projekt ist folgendes:

im Gerätehaus steht ein PC der wertet das Alarmfax aus, stellt es auf einem 40 Zoll TV dar und druckt es 2x aus.
Das Programm kann bei Alarmeingang externe Programme anschieben, damit schalte ich zur Zeit per *.bat eine Funksteckdose, an welcher der TV hängt, damit dieser nicht ständig an ist.

Nun will ich bei Alarmeingang das Licht in der Fahrzeughalle anschalten lassen, die derzeit bestehende Wechselschaltung in eine Tasterschaltung mit Stromstossschalter umbauen ist nicht das Problem.
Deshalb suche ich nach einer Lösung, vom PC aus mit so einer kleinen Wunderplatine ein Steuersignal zum Stromstossschalter zu bringen. Per Fotodiode o.ä. sollte dem Controller aber mitgeteilt werden, nur einschalten wenn es dunkel ist, nicht das zufällig schon jemand da ist und bei Alarmeingang das Licht aus geht, da der Stromstossschalter ja den Unterschied nicht kennt.

Das wäre das geplante Projekt
Title: Re: Neuling sucht eine Lösung
Post by: uxomm on Jan 29, 2018, 08:19 pm
Ja, man kann eine serielle Schnittstelle über Kommandozeile bzw. bat-Datei ansprechen (Windows).
Nehmen wir an der Arduino hängt an COM4. Dann geht das am einfachsten so:
Code: [Select]
echo Alarm > COM4
Du musst allerdings wissen, wie die Parameter der Schnittstelle sind. Das kannst du aber herausfinden bzw. ändern mit
Code: [Select]
mode COM4
Ein (lösbares) Problem ist, dass bei der oben beschriebenen Methode, die serielle Schnittstelle geöffnet und nach dem Senden von "Alarm" sofort wieder geschlossen wird, was bei den meisten Arduinos einen Reset auslöst. Das ist in diesem Fall aber nicht gewünscht. Das lässt sich aber lösen durch z.B. einen Elko (z.B. 10µF) zwischen Reset und GND.

Näheres zu COM und Kommandozeile siehe: https://batchloaf.wordpress.com/2013/02/12/simple-trick-for-sending-characters-to-a-serial-port-in-windows/ (https://batchloaf.wordpress.com/2013/02/12/simple-trick-for-sending-characters-to-a-serial-port-in-windows/)

P.S.: Sicherheitsbedenken u.s.w. wurden ja schon oben erwähnt. :)
Title: Re: Neuling sucht eine Lösung
Post by: blackscorpion371 on Jan 31, 2018, 09:24 am
wie müsste ich den oben gezeigten Microcontroller bestücken?

Ausgang fürs Relais und wo die Fotodiode ran? Welche Fotodiode wäre geeignet, vielleicht Link?

Den Elko mit Minus an GND und Plus an Reset?

Eltako wird einer sein der auf Niederspannung reagiert und Potenzialfrei ist.
Title: Re: Neuling sucht eine Lösung
Post by: HotSystems on Jan 31, 2018, 09:41 am
wie müsste ich den oben gezeigten Microcontroller bestücken?
Mit bestücken meinst du sicher "anschließen" ?
Denn fertig bestückt sollte der schon sein.

Quote
Ausgang fürs Relais und wo die Fotodiode ran? Welche Fotodiode wäre geeignet, vielleicht Link?
Das hängt auch sehr von deinem Sketch ab, welche Pins du belegen möchtest.
D2 - D13 oder auch A0 - A5, wenn alles andere belegt ist.

Fotodiode ist schlecht, nimm lieber einen LDR-Widerstand.
Der kommt dann an einen beliebigen analogen Pin.

Quote
Den Elko mit Minus an GND und Plus an Reset?
Wozu den Elko ?

Title: Re: Neuling sucht eine Lösung
Post by: blackscorpion371 on Jan 31, 2018, 02:46 pm
Na die Sache mit dem Elko wurde doch hier im Thread erwähnt?

Sketch gibts noch nicht, muss ich erst alles lernen (oder es tippert jemand fix einen)

gibts für den passenden LDR-Widerstand einen Bestelllink?

heute ist die Relaisplatine gekommen!
Title: Re: Neuling sucht eine Lösung
Post by: uxomm on Jan 31, 2018, 03:18 pm
LDR ist nicht so kritisch.
Zum Beispiel so einen: https://www.conrad.de/de/lichtwiderstand-a-9013-tht-1-st-o-x-h-5-mm-x-25-mm-145475.html (https://www.conrad.de/de/lichtwiderstand-a-9013-tht-1-st-o-x-h-5-mm-x-25-mm-145475.html)
Zum Anschluss des LDR an einen analogen Eingang des Arduino wird noch ein Widerstand gebraucht. So etwa zwischen 1 kOhm und 10 kOhm dürfte passen.
Title: Re: Neuling sucht eine Lösung
Post by: michael_x on Jan 31, 2018, 03:35 pm
Quote
So etwa zwischen 1 kOhm und 10 kOhm dürfte passen.
Bei diesem LDR ( R10 ca 20 .. 90 k ) eher etwas größer. Grob in der gleichen Größenordnung wie der LDR.
Einen Analog-Eingang sollte man schon spendieren. Zu versuchen, den zweiten Widerstand des Spannungsteilers so zu wählen, dass  (Hell / Dunkel) digital als (HIGH  / LOW) erfasst, wird ist zu mühsam.
Title: Re: Neuling sucht eine Lösung
Post by: agmue on Jan 31, 2018, 03:38 pm
Wozu den Elko ?
Ein (lösbares) Problem ist, dass bei der oben beschriebenen Methode, die serielle Schnittstelle geöffnet und nach dem Senden von "Alarm" sofort wieder geschlossen wird, was bei den meisten Arduinos einen Reset auslöst. Das ist in diesem Fall aber nicht gewünscht. Das lässt sich aber lösen durch z.B. einen Elko (z.B. 10µF) zwischen Reset und GND.
Den Elko mit Minus an GND und Plus an Reset?
Ja.

gibts für den passenden LDR-Widerstand einen Bestelllink?
Lichtwiderstand (https://www.conrad.de/de/lichtwiderstand-perkin-elmer-vt-93-n1-tht-1-st-l-x-b-x-h-437-x-366-x-178-mm-140374.html) als ein Beispiel von vielen. 24 k bei 10 LUX sollte OK sein.

@uxomm: Das Datenblatt von "meinem" gefällt mir besser  ;)
Title: Re: Neuling sucht eine Lösung
Post by: uxomm on Jan 31, 2018, 03:47 pm
@uxomm: Das Datenblatt von "meinem" gefällt mir besser  ;)
Ja, auch OK :)

@michael_x: Hab doch von analogem Eingang gesprochen... :)
Title: Re: Neuling sucht eine Lösung
Post by: HotSystems on Jan 31, 2018, 04:00 pm
@michael_x: Hab doch von analogem Eingang gesprochen... :)
Ich doch auch. ;) ;)
Title: Re: Neuling sucht eine Lösung
Post by: michael_x on Jan 31, 2018, 04:04 pm
Ich auch :)  8)

Es überhaupt digital zu versuchen, war nur meine eigene schlechte Idee.
Title: Re: Neuling sucht eine Lösung
Post by: blackscorpion371 on Jan 31, 2018, 05:08 pm
So, mal in den Warenkorb gelegt:


- Lichtwiderstand Perkin Elmer VT 93 N1 THT 1 St. (L x B x H) 4.37 x 3.66 x 1.78 mm
- Trimmer linear 0.25 W 50 kΩ 250 ° 270 ° Piher PT 15 LV 50K 1 St.
- Elektrolyt-Kondensator radial bedrahtet 1.5 mm 22 µF 10 V 20 % (Ø) 4 mm Panasonic EEA-GA1A220 1 St.

Brauche ich Bauteile mäßig noch etwas?

Die Relaisplatine wird wie ich bemerkt habe Minus gesteuert, kann man das dem Controller sagen, z.B. D1 und D2 minus und D3 Plus?

Wie müsste der Sketch aussehen, damit bei Signal auf USB Eingang und entsprechend gemessener Dunkelheit, auf D1 und D2 kurz minus gesteuert wird, damit die beiden Relais kurz anziehen?





 
Title: Re: Neuling sucht eine Lösung
Post by: agmue on Jan 31, 2018, 05:36 pm
Die Relaisplatine wird wie ich bemerkt habe Minus gesteuert, kann man das dem Controller sagen, z.B. D1 und D2 minus und D3 Plus?
Ja beispielsweise:
Code: [Select]
digitalWrite(D1, LOW);
oder:

Code: [Select]
#define RELAIS_EIN LOW
#define RELAIS_AUS HIGH
...
digitalWrite(D1, RELAIS_EIN);

Was man macht, ist Geschmackssache :)
Title: Re: Neuling sucht eine Lösung
Post by: HotSystems on Jan 31, 2018, 05:46 pm
Die Relaisplatine wird wie ich bemerkt habe Minus gesteuert, kann man das dem Controller sagen, z.B. D1 und D2 minus und D3 Plus?

Hier ist die Aussage "Minus gesteuert" fachlich falsch.
Bitte nicht falsch verstehen.

Der richtige Ausdruck ist GND.

Wenn du "Minus" in einen Eingang reingibst, kann es den Controller oder andere Hardware zerstören.

Title: Re: Neuling sucht eine Lösung
Post by: blackscorpion371 on Feb 01, 2018, 07:48 am
So mal einen Sketch aufgespielt:

const int relaisPin = 3;

 
void setup() {
  pinMode(relaisPin, OUTPUT); // Den PWM PIN "relaisPin" als Ausgangssignal setzen.
}
 
void loop() {
  digitalWrite(relaisPin, HIGH); //Relais an
  delay(500);  //500ms warten
  digitalWrite(relaisPin, LOW);  //Relais aus
  delay(1000);// 1000ms warten
}


Was muss ich ändern das es nur 1x kurz schaltet bei Signal von USB?
Title: Re: Neuling sucht eine Lösung
Post by: noiasca on Feb 01, 2018, 08:04 am
Scherz oder?
Title: Re: Neuling sucht eine Lösung
Post by: blackscorpion371 on Feb 01, 2018, 08:10 am
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
Title: Re: Neuling sucht eine Lösung
Post by: HotSystems on Feb 01, 2018, 08:16 am
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.
Title: Re: Neuling sucht eine Lösung
Post by: uxomm on Feb 01, 2018, 07:06 pm
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):

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 = 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:
Code: [Select]
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:
Code: [Select]
    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
Code: [Select]
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
Code: [Select]
echo Alarm > \\.\COM23

Natürlich geht auch folgendes, weil ja nur auf das 'A' reagiert wird:
Code: [Select]
echo A > COM3
Folgendes funktioniert aber NICHT, weil ja ein großes A nötig ist:
Code: [Select]
echo a > COM3

Anzeige der aktuellen COM-Port-Einstellungen:
Code: [Select]
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:
Code: [Select]
mode COM3: baud=9600
Einstellen mehrer Parameter: 
Code: [Select]
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.
Title: Re: Neuling sucht eine Lösung
Post by: blackscorpion371 on Feb 02, 2018, 06:09 pm
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
Title: Re: Neuling sucht eine Lösung
Post by: blackscorpion371 on Feb 03, 2018, 09:36 am
wie schließe ich den Widerstand für den LDR an?
Title: Re: Neuling sucht eine Lösung
Post by: agmue on Feb 03, 2018, 10:09 am
wie schließe ich den Widerstand für den LDR an?
Widerstände haben keine Polarisierung wie manche Kondensatoren, ist also egal.
Title: Re: Neuling sucht eine Lösung
Post by: blackscorpion371 on Feb 06, 2018, 07:51 am
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.
Title: Re: Neuling sucht eine Lösung
Post by: HotSystems on Feb 06, 2018, 08:12 am
das ein Widerstand keine Polarisierung hat weis ich
Warum fragst dann danach ?
uxomm hat doch schon gezeigt, wie du alles anschließen musst.

Quote
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?
Title: Re: Neuling sucht eine Lösung
Post by: agmue on Feb 06, 2018, 09:43 am
bis ldrSchwellwert = 32767 schaltet die Geschichte ...
Der analoge Eingang des Nano kann nur Werte von 0 bis 1023 liefern. Da stimmt was nicht!
Title: Re: Neuling sucht eine Lösung
Post by: michael_x on Feb 06, 2018, 10:25 am
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.
Title: Re: Neuling sucht eine Lösung
Post by: blackscorpion371 on Feb 06, 2018, 02:28 pm
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
Title: Re: Neuling sucht eine Lösung
Post by: blackscorpion371 on Feb 06, 2018, 02:43 pm
FOTO :o geht nicht???
Title: Re: Neuling sucht eine Lösung
Post by: Tommy56 on Feb 06, 2018, 02:58 pm
Steht hier (https://forum.arduino.cc/index.php?topic=149078.0).

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

Gruß Tommy
Title: Re: Neuling sucht eine Lösung
Post by: uxomm on Feb 06, 2018, 03:14 pm
LDR und Widerstand sollten so angeschlossen werden (Schaltplan):
(http://forum.arduino.cc/index.php?action=dlattach;topic=525429.0;attach=244312)

Hier noch ein "Fritzingbildchen" - allerdings schaut der Nano anders aus als jener vom Anfangspost, also bitte die Beschriftung der Pins beachten.
(http://forum.arduino.cc/index.php?action=dlattach;topic=525429.0;attach=244310)
Title: Re: Neuling sucht eine Lösung
Post by: uxomm on Feb 06, 2018, 03:27 pm
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. :)
Title: Re: Neuling sucht eine Lösung
Post by: blackscorpion371 on Feb 06, 2018, 03:46 pm
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.
Title: Re: Neuling sucht eine Lösung
Post by: michael_x on Feb 06, 2018, 04:08 pm
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 ;)
Title: Re: Neuling sucht eine Lösung
Post by: blackscorpion371 on Feb 06, 2018, 04:27 pm
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
Title: Re: Neuling sucht eine Lösung
Post by: michael_x on Feb 06, 2018, 04:59 pm
Wie stellst du den Schwellwert des ersten ldr ein?

Bist du damit zufrieden?
Title: Re: Neuling sucht eine Lösung
Post by: blackscorpion371 on Feb 07, 2018, 09:03 am
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
Title: Re: Neuling sucht eine Lösung
Post by: dony on Feb 07, 2018, 09:19 am
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
Title: Re: Neuling sucht eine Lösung
Post by: dony on Feb 07, 2018, 10:01 am
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
Title: Re: Neuling sucht eine Lösung
Post by: michael_x on Feb 07, 2018, 03:11 pm
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. )
Title: Re: Neuling sucht eine Lösung
Post by: dony on Feb 07, 2018, 04:21 pm
...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
Title: Re: Neuling sucht eine Lösung
Post by: blackscorpion371 on Feb 07, 2018, 10:04 pm
Danke, probiere ich morgen gleich mal aus, heute ist es sehr spät geworden.
Title: Re: Neuling sucht eine Lösung
Post by: blackscorpion371 on Feb 10, 2018, 04:16 pm
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?


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 = 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
      }
    }
  }
    }
  }
}                                                                                                                 
Title: Re: Neuling sucht eine Lösung
Post by: michael_x on Feb 10, 2018, 04:26 pm
Code: [Select]
    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...

Quote
Code: [Select]
      }
    }
  }
    }
  }
}           
Da sag ich nichts zu, aber das wird beim Korrigieren auch besser ;)
Title: Re: Neuling sucht eine Lösung
Post by: blackscorpion371 on Feb 10, 2018, 05:50 pm
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 ;-)
Title: Re: Neuling sucht eine Lösung
Post by: agmue on Feb 10, 2018, 06:34 pm
Dann mache mal dies:

Code: [Select]
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
        }
      }
    }
  }
}
Title: Re: Neuling sucht eine Lösung
Post by: blackscorpion371 on Feb 10, 2018, 07:13 pm
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???
Title: Re: Neuling sucht eine Lösung
Post by: agmue on Feb 10, 2018, 07:23 pm
Das habe ich einfach von Deinem Programm übernommen. Wenn Du es nicht weißt, dann schmeiß es raus :)
Title: Re: Neuling sucht eine Lösung
Post by: postmaster-ino on Feb 10, 2018, 08:07 pm
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
Title: Re: Neuling sucht eine Lösung
Post by: michael_x on Feb 10, 2018, 08:50 pm
Quote
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 ;)
Title: Re: Neuling sucht eine Lösung
Post by: blackscorpion371 on Feb 11, 2018, 12:21 pm
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?

(https://www.pollin.de/images/1600x1200x90/I120781.1-Fotowiderstand-PFW551M-5-mm-5-Stueck.jpg)


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

Title: Re: Neuling sucht eine Lösung
Post by: agmue on Feb 11, 2018, 12:45 pm
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.
Title: Re: Neuling sucht eine Lösung
Post by: postmaster-ino on Feb 11, 2018, 12:47 pm
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 (http://forum.arduino.cc/index.php?topic=525429.msg3589490#msg3589490)

MfG

PS: irgendwo her hatte ich die 28K ...
Title: Re: Neuling sucht eine Lösung
Post by: agmue on Feb 11, 2018, 12:54 pm
PS: irgendwo her hatte ich die 28K ...
Möglicherweise aus dem Datenblatt, siehe #11 und #13 ;)
Title: Re: Neuling sucht eine Lösung
Post by: blackscorpion371 on Feb 11, 2018, 01:46 pm
Produktblatt LDR (https://www.pollin.de/productdownloads/D120781D.PDF)

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
Title: Re: Neuling sucht eine Lösung
Post by: agmue on Feb 11, 2018, 02:37 pm
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?
Title: Re: Neuling sucht eine Lösung
Post by: uxomm on Feb 11, 2018, 03:02 pm
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):
(http://forum.arduino.cc/index.php?action=dlattach;topic=525429.0;attach=245045)
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. :)
Title: Re: Neuling sucht eine Lösung
Post by: blackscorpion371 on Feb 11, 2018, 03:24 pm
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?
Title: Re: Neuling sucht eine Lösung
Post by: blackscorpion371 on Feb 11, 2018, 03:34 pm
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?!
Title: Re: Neuling sucht eine Lösung
Post by: uxomm on Feb 11, 2018, 04:06 pm
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:

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
Title: Re: Neuling sucht eine Lösung
Post by: uxomm on Feb 11, 2018, 05:23 pm
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
      }
    }
  }
}
Title: Re: Neuling sucht eine Lösung
Post by: blackscorpion371 on Feb 12, 2018, 10:53 am
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
Title: Re: Neuling sucht eine Lösung
Post by: uxomm on Feb 12, 2018, 09:11 pm
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) { 
Title: Re: Neuling sucht eine Lösung
Post by: wno158 on Feb 13, 2018, 06:53 am
<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
Title: Re: Neuling sucht eine Lösung
Post by: blackscorpion371 on Feb 13, 2018, 02:43 pm
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 ;-)
Title: Re: Neuling sucht eine Lösung
Post by: blackscorpion371 on Feb 22, 2018, 10:01 am
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!!
Title: Re: Neuling sucht eine Lösung
Post by: blackscorpion371 on Feb 22, 2018, 10:08 am
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?
Title: Re: Neuling sucht eine Lösung
Post by: HotSystems on Feb 22, 2018, 11:01 am
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.