Forum: Mikrocontroller und Digitale Elektronik Arduino LED über LDR leuchten lassen


von Steven (Gast)


Lesenswert?

Hallo, ich muss ein Programm (Arduino Uno) schreiben, dass Werte (0 oder 
1) von zwei LDR einliest. Wird von einem LDR eine Verdunkelung (Zustand 
0) gemessen, soll ein Counter +1 zählen. Der andere LDR soll über einen 
anderen Counter ebenfalls +1 zählen, wenn er den Zustand 0 annimmt.
Nun sollen nach einer bestimmten Zeit (z.B. 60sek.) die beiden Counter 
verglichen werden.
Zwei LEDs hängen am Microcontroller noch.
Abhängig davon, welcher Counter den höheren Wert hat, soll nun entweder 
der eine oder eben der andere LED-Streifen eingeschaltet werden.
Ich habe bisher die LDR zum laufen gebracht, das heißt, beide können 
getrennt voneinander hell von dunkel unterscheiden.
Beim Counter fehlt es mir scheinbar an Wissen, kenne nur counter++, dann 
wird aber nicht nur um 1 erhöht, wenn die Verdunkelung länger anhält.
Die Verbindung mit den LEDs haut im Moment noch garnicht wirklich hin.
Hat wer von euch zufällig ein bisschen mehr Ahnung und kann mir 
zumindest nur mit Ideen weiterhelfen, wie ich das im Programm umsetzen 
kann?

Danke und Lg, Steven!

momentaner Code:

#define LDRpin1 7  // pin where we connect LDR and resistor
#define LDRpin2 8  // pin where we connect LDR and resistor

int LDRValue1 = 0; // result of reading the digital pin
int LDRValue2 = 0; // result of reading the digital pin
int counter1 = 0;
int counter2 = 0;

void setup() {
  Serial.begin(9600); // sets serial port for communication
  pinMode(12, OUTPUT);
  pinMode(4, OUTPUT);
}

void loop() {

  LDRValue1 = digitalRead(LDRpin1);// read the value from the LDR
  Serial.print(LDRValue1);         // print the LDR1 value to the serial 
port
  Serial.print(" "); // print a space
 // counter1++;
 // Serial.print(counter1);
  LDRValue2 = digitalRead(LDRpin2);// read the value from the LDR
  Serial.println(LDRValue2);
  Serial.print(" "); // print the LDR2 value to the serial port
//  counter2++;
//  Serial.print(counter2);


if(LDRValue1 == 1)
{
counter1++;
Serial.print(counter1);
}
else if(LDRValue2 == 1)
{
counter2++;
Serial.print(counter2);
}
}

: Verschoben durch User
von Mick (Gast)


Lesenswert?

Du benötigst zusätzlich noch ein Flag. Somit wird nur einmal bei der 
Änderung von 0 auf 1 hochgezählt.

Bsp:
1
#define LDRpin1 7
2
3
int ldrValue1 = 0;
4
boolean ldr1Flag = false;
5
int counter1 = 0;
6
7
void loop() {
8
  ldrValue1 = digitalRead(LDRpin1);
9
10
  if(ldrValue1 == 0){
11
    ldr1Flag = true;
12
  }
13
  if(ldrValue1 == 1 && ldr1Flag == true){
14
    counter1++;
15
    ldr1Flag = false;
16
  }
17
}

von Mick (Gast)


Lesenswert?

Für dein zweites Problem kannst du z.B. die Funktionen der SimpleTimer 
Bibliothek verwenden. http://playground.arduino.cc/Code/SimpleTimer
1
#include <SimpleTimer.h>
2
3
SimpleTimer timer;
4
5
void handleLEDs(){
6
  if(counter1 > counter2){
7
    //LED1 aus
8
    //LED2 ein
9
  }
10
  else{
11
    //LED1 ein
12
    //LED2 aus
13
  }
14
}
15
16
void setup(){
17
  timer.setInterval(60000, handleLEDs);
18
}
19
20
void loop() {
21
  timer.run();
22
}

von Jörg R. (solar77)


Lesenswert?

Ein LDR ist ein analoges Bauteil. Der liefert keine 0 oder 1.

von Wolfgang (Gast)


Lesenswert?

Steven schrieb:
> Beim Counter fehlt es mir scheinbar an Wissen, kenne nur counter++, dann
> wird aber nicht nur um 1 erhöht, wenn die Verdunkelung länger anhält.

Der Counter macht genau das, was du ihm gesagt hast. Er wird jedes Mal 
erhöht, wenn das Programm an der Stelle mit der Abfrage vorbei kommt und 
der LDRpin vorher als 1 gelesen wurde, nicht nur, wenn sich der Zustand 
von 0 auf 1 geändert hat.

von Paul (Gast)


Lesenswert?

Jörg R. schrieb:
> Ein LDR ist ein analoges Bauteil. Der liefert keine 0 oder 1.

Doch! Bei entsprechendem Widerstand für den Spannungsteiler.

von Jörg R. (solar77)


Lesenswert?

Paul schrieb:
> Jörg R. schrieb:
>> Ein LDR ist ein analoges Bauteil. Der liefert keine 0 oder 1.
>
> Doch! Bei entsprechendem Widerstand für den Spannungsteiler.

Nein, er liefert dann immer noch ein analoges Signal das ausgewertet 
werden muss. Er liefert keine 0 oder 1.

Der Widerstand eines LDR ändert sich von hoch (dunkel) bis gering 
(hell).
Soll sich der Wert von 0 auf 1 oder umgekehrt ändern benötigt man z.B. 
einen Komparator.

Soll der uC das auswerten muss der Wert des Spannungsteilers über einen 
Analogpin eingelesen und ausgewertet werden. Hier können dann Schwellen 
gesetzt werden um 0 oder 1 zu generieren.

: Bearbeitet durch User
von Paul (Gast)


Lesenswert?

Jörg R. schrieb:
> Nein, er liefert dann immer noch ein analoges Signal das ausgewertet
> werden muss. Er liefert keine 0 oder 1.

Lese doch bitte mal das Datenblatt...

von void (Gast)


Lesenswert?

Paul schrieb:
> Lese doch bitte mal das Datenblatt...

Gerne. Kannst du das Datenblatt des LDR bitte kurz verlinken?

von Jörg R. (solar77)


Lesenswert?

void schrieb:
> Paul schrieb:
>> Lese doch bitte mal das Datenblatt...
>
> Gerne. Kannst du das Datenblatt des LDR bitte kurz verlinken?

Danke! Auf das DB bin ich auch gespannt, bitte mit Erläuterung.


Paul schrieb:
> Jörg R. schrieb:
>> Nein, er liefert dann immer noch ein analoges Signal das ausgewertet
>> werden muss. Er liefert keine 0 oder 1.
>
> Lese doch bitte mal das Datenblatt...

Wozu? Besser du machst dich mit der Funktionsweise eines LDR vertraut.

von Jim Beam (Gast)


Lesenswert?

Natürlich ist ein LDR erstmal ein analoges Bauteil, wie Jörg R. 
zutreffend schrieb.

Dennoch braucht man nicht unbedingt einen Analogeingang:
wenn es nur um "sehr-hell / sehr-dunkel" geht reicht da auch absolut ein 
digitaler Eingang, denn irgendwann schaltet der dann schon.

Mit enspr. Wahl des Spannungsteilers aus LDR/R kann man das sogar 
einigermassen einstellen, allerdingt nur recht grob.

von Jörg R. (solar77)


Lesenswert?

Jim Beam schrieb:
> Natürlich ist ein LDR erstmal ein analoges Bauteil, wie Jörg R.
> zutreffend schrieb.
>
> Dennoch braucht man nicht unbedingt einen Analogeingang:
> wenn es nur um "sehr-hell / sehr-dunkel" geht reicht da auch absolut ein
> digitaler Eingang, denn irgendwann schaltet der dann schon.

Das ist halbherzig, zumal der UNO genug Analogeingänge hat. Ich weiß 
jetzt auch nicht wie sich ein Digitaleingang am UNO verhält wenn der 
Wert vom LDR grenzwertig ist > Hysterese?


> Mit enspr. Wahl des Spannungsteilers aus LDR/R kann man das sogar
> einigermassen einstellen, allerdingt nur recht grob.

Beim Analogeingang geht das sehr fein, und ist jederzeit über die SW 
anpassbar.

von Stefan F. (Gast)


Lesenswert?

Da der TO nur zwischen hell und dunkel unterscheiden will und die 
Schaltschwelle nicht per Software anpassen will, ist diese Art, den LDR 
zu verwenden, völlig Ok.

Wenn die neunmal klugen hier darauf bestehen, dass der ADC benutzt 
werden soll, weil er mehr kann, sollten wir uns ja mal über RoHS 
unterhalten.

Oder hinterfragen, ob sie in ihrem Haushalt überall auf die die 
technisch "beste" Lösung bestehen. Ich habe zum Beispiel gestern meinen 
Fahrradkorb mit einer Schnur ans Fahrrad gebunden. Nicht weil es die 
beste Lösung ist, sondern weil sie den Anforderungen genügt und die 
Schnur gerade greifbar war.

von Jörg R. (solar77)


Lesenswert?

Stefan U. schrieb:
> Wenn die neunmal klugen hier darauf bestehen, dass der ADC benutzt
> werden soll, weil er mehr kann..

Was hat das mit neunmal Klug zu tun wenn einfach nur versucht wird eine 
Behauptung zu wiederlegen??

Beitrag "Re: Arduino LED über LDR leuchten lassen"

Ein LDR liefert ohne zusätzliche externe Beschaltung keine 0 oder 1, 
rein digital betrachtet.

Dass das Problem auch über einen Digitalpin gelöst werden kann war nicht 
der Ursprung meiner Kommentare


> Oder hinterfragen, ob sie in ihrem Haushalt überall auf die die
> technisch "beste" Lösung bestehen. Ich habe zum Beispiel gestern meinen
> Fahrradkorb mit einer Schnur ans Fahrrad gebunden. Nicht weil es die
> beste Lösung ist, sondern weil sie den Anforderungen genügt und die
> Schnur gerade greifbar war.

Der UNO hat aber ADC Eingänge. Der TO kann also auf die beste Lösung 
zurückgreifen, die dazu auch noch flexibel ist.
Es sei denn der TO hätte zufällig einen UNO ohne Analogeingänge 
erwischt?

: Bearbeitet durch User
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> Es sei denn der TO hätte zufällig einen UNO ohne Analogeingänge
> erwischt?

Es kann auch sein, dass die Untrrichtsstunde für den TO, wo der ADC 
durchgenommen wird, noch in der Zukunft liegt.

Aus dem Ursprungsbeitrag geht leider nicht eindeutig hervor, ob der ADC 
benutzt werden darf bzw. ob in der vorhandenen Schaltung überhaupt ein 
ADC-Pin frei ist.

Ich lese da eher was von 0 und 1. Von daher dachte ich auch von 
vornherein: "Da reicht ein Spannungsteiler".

Übrigens brauchst Du den Spannungsteiler auch bei einer ADC-Messung. Du 
kommst also gar nicht ohne externe Beschaltung aus.

Am besten zeigt der TO mal, wo und wie der LDR überhaupt am µC 
angeschlossen ist. Vielleicht hängt da schon ein Komparator dazwischen, 
der nur noch 0 oder 1 liefert? Ausgeschlossen ist das dank der wenigen 
vorliegenden Infos nicht.

: Bearbeitet durch Moderator
von Jörg R. (solar77)


Lesenswert?

Frank M. schrieb:
> Übrigens brauchst Du den Spannungsteiler auch bei einer ADC-Messung. Du
> kommst also gar nicht ohne externe Beschaltung aus.

Das stimmt, nur ist die Dimensionierung wesentlich einfacher. Selbst 
ohne DB des LDR nehme ich 100K und messe 2 Werte für hell und dunkel.

Aber, wie schon geschrieben ging es mir darum die pauschale Aussage von 
Paul zu wiederlegen.


> Am besten zeigt der TO mal, wo und wie der LDR überhaupt am µC
> angeschlossen ist. Vielleicht hängt da schon ein Komparator dazwischen,
> der nur noch 0 oder 1 liefert? Ausgeschlossen ist das dank der wenigen
> vorliegenden Infos nicht.

Das leidige Problem fehlender Informationen im Anfangsthread.


Frank M. schrieb:
> Es kann auch sein, dass die Untrrichtsstunde für den TO, wo der ADC
> durchgenommen wird, noch in der Zukunft liegt.

Das ist möglich. Nur würde ich die Funktion eines Digitalports nicht in 
Verbindung mit einem LDR erklären, es sei denn...

Frank M. schrieb:
> Vielleicht hängt da schon ein Komparator dazwischen, der nur noch
> 0 oder 1 liefert?

von Georg M. (g_m)


Lesenswert?

> Datenblatt

33.1.9. Pin Threshold and Hysteresis
(Atmel-42735B-ATmega328/P_Datasheet_Complete-11/2016)

von Stefan F. (Gast)


Lesenswert?

> Ein LDR liefert ohne zusätzliche externe Beschaltung keine 0
> oder 1, rein digital betrachtet.

Und am ADC liefert dein LDR keine Integer Zahlen! Aber der I/O Pin 
liefert eine 0 oder 1, weil er vom Programm im digitalen Modus 
ausgelesen wird. Muss man wirklich auf der Bedeutung einzelner Wörter 
herum reiten?

> Der TO kann also auf die beste Lösung
> zurückgreifen, die dazu auch noch flexibel ist.

Das mag für DICH die beste Lösung sein. Für den TO vielleicht nicht, 
z.B. weil er sich mit dem ADC noch nicht beschäftigen möchte oder weil 
er schon alle analogen Eingänge für etwas andere reserviert hat. Oder 
weil die analoge Messung länger dauert, als das digitale Auslesen. Oder 
weil er die Hysterese des digitalen Eingangs nutzen möchte.

Ein Dimmer ist auch nicht immer besser, als ein Lichtschalter.

von Jörg R. (solar77)


Lesenswert?

Stefan U. schrieb:
>> Ein LDR liefert ohne zusätzliche externe Beschaltung keine 0
>> oder 1, rein digital betrachtet.
>
> Und am ADC liefert dein LDR keine Integer Zahlen! Aber der I/O Pin
> liefert eine 0 oder 1, weil er vom Programm im digitalen Modus
> ausgelesen wird.

Doch, wenn Du verstanden hättest worum es mir ging.

Ich behaupte doch nicht das eure Methode nicht funktioniert, nur würde 
ich es so nicht umsetzen.

Ich habe lediglich versucht die Behauptung von Paul zu wiederlegen, und 
das wurde wohl komplett missverstanden bzw. ignoriert.

> Muss man wirklich auf der Bedeutung einzelner Wörter herum reiten?

Nein, aber nichts anderes macht ihr im Prinzip auch.


>> Der TO kann also auf die beste Lösung
>> zurückgreifen, die dazu auch noch flexibel ist.
>
> Das mag für DICH die beste Lösung sein. Für den TO vielleicht nicht,
> z.B. weil er sich mit dem ADC noch nicht beschäftigen möchte oder weil
> er schon alle analogen Eingänge für etwas andere reserviert hat. Oder
> weil die analoge Messung länger dauert, als das digitale Auslesen. Oder
> weil er die Hysterese des digitalen Eingangs nutzen möchte.

Hätte, hätte...was sollen die Aufzählungen wenn auch Du keine weiteren 
Informationen hast?


> Ein Dimmer ist auch nicht immer besser, als ein Lichtschalter.

Wenn ich dimmen will schon, oder willst Du mit dem Schalter PWM machen?

Jeder weitere Diskussion ist leider vertane Zeit.

Tschüss?

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

> Wenn ich dimmen will schon, oder willst Du mit dem Schalter PWM machen?

Siehst du. Der TO will schalten, für ihn ist das digitale lesen des Pins 
daher die erst beste Lösung. Klappt ja auch.

von Steven (Gast)


Lesenswert?

Ich wollte nun die SimpleTimer Bibliothek downloaden, Arduino sagt mir 
auch dass sie installiert ist. Allerdings kommt folgende Fehlermeldung:

Arduino: 1.8.5 (Windows 7), Board: "Arduino/Genuino Uno"

C:\Users\Steven\Desktop\sketch_mar07b\sketch_mar07b.ino:3:25: fatal 
error: SimpleTimer.h: No such file or directory

 #include <SimpleTimer.h>

                         ^

compilation terminated.

exit status 1
Error compiling for board Arduino/Genuino Uno.

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

Kann mir wer sagen was ich falsch mache?

von Manfred (Gast)


Lesenswert?

Steven schrieb:
> Kann mir wer sagen was ich falsch mache?
Dich mit einem Mikrocontroller zu beschäfigen!

> Ich wollte nun die SimpleTimer Bibliothek downloaden,

Und wozu? Es gibt im Internet Dutzende Schulscripte und Anleitungen zu 
finden, eine LED blinken zu lassen ist nun wirklich erste Stunde für 
Anfänger.

Suche nach "Arduino Blink" bzw. "Blink ohne delay" und arbeite Dich ein. 
Solltest Du dazu nicht gewillt sein, gib den Kram in die 
Elektroschrottsammlung.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.