Instrument mit Lichtsensor

Moin zusammen,

ich versuche mich gerade an etwas 'simplen'. Ich habe 9 Lichtsensoren, die einen Ton erzeugen lassen sollen, wenn es dunkel wird (also mit dem Finger bzw der Hand drauf tippt).

Ich habe mich an dieser Webseite orientiert und wiefolgt verlötet

. Auch 2x kontrolliert, dass alle Pins genauso angepinnt sind.

Auf dem Breadboard hat es wunderbar funktioniert, mit einer LED, aber jetzt habe ich bestimmt irgendwo einen Denk- bzw. Lötfehler.

#define LDR0 11
#define LDR1 9
#define LDR2 8
#define LDR3 7
#define LDR4 6
#define LDR5 5
#define LDR6 4
#define LDR7 3
#define LDR8 2
int LDR_value0;
int LDR_value1;
int LDR_value2;
int LDR_value3;
int LDR_value4;
int LDR_value5;
int LDR_value6;
int LDR_value7;
int LDR_value8;
#define buzzer 10

void setup() {
  Serial.begin(9600);
  pinMode(LDR0, INPUT);
  pinMode(LDR1, INPUT);
  pinMode(LDR2, INPUT);
  pinMode(LDR3, INPUT);
  pinMode(LDR4, INPUT);
  pinMode(LDR5, INPUT);
  pinMode(LDR6, INPUT);
  pinMode(LDR7, INPUT);
  pinMode(LDR8, INPUT);
  pinMode(buzzer, OUTPUT);
}

void loop() {

  LDR_value0 = analogRead(LDR0);
  LDR_value1 = analogRead(LDR1);
  LDR_value2 = analogRead(LDR2);
  LDR_value3 = analogRead(LDR3);
  LDR_value4 = analogRead(LDR4);
  LDR_value5 = analogRead(LDR5);
  LDR_value6 = analogRead(LDR6);
  LDR_value7 = analogRead(LDR7);
  LDR_value8 = analogRead(LDR8);

  Serial.println(LDR_value0);
  Serial.println(LDR_value1);
  Serial.println(LDR_value2);
  Serial.println(LDR_value3);  // put your main code here, to run repeatedly:
  Serial.println(LDR_value4);
  Serial.println(LDR_value5);
  Serial.println(LDR_value6);
  Serial.println(LDR_value7);
  Serial.println(LDR_value8);

  if (LDR_value0 < 100)  // Wenn der Schwellenwert 512 überschritten wird, soll die LED leuchten
  {
    tone(buzzer, 400,1000);
    Serial.println("LED an");
  }
  // ansonsten...
  else {
    noTone(buzzer);
    Serial.println("LED aus");
  }
  if (LDR_value1 < 100)  // Wenn der Schwellenwert 512 überschritten wird, soll die LED leuchten
  {
    tone(buzzer, 400,1000);
    Serial.println("LED an");
  }
  // ansonsten...
  else {
    noTone(buzzer);
    Serial.println("LED aus");
  }
  if (LDR_value2 < 100)  // Wenn der Schwellenwert 512 überschritten wird, soll die LED leuchten
  {
    tone(buzzer, 400,1000);
    Serial.println("LED an");
  }
  // ansonsten...
  else {
    noTone(buzzer);
    Serial.println("LED aus");
  }
  if (LDR_value4 < 100)  // Wenn der Schwellenwert 512 überschritten wird, soll die LED leuchten
  {
    tone(buzzer, 400,1000);
    Serial.println("LED an");
  }
  // ansonsten...
  else {
    noTone(buzzer);
    Serial.println("LED aus");
  }
  if (LDR_value5 < 100)  // Wenn der Schwellenwert 512 überschritten wird, soll die LED leuchten
  {
    tone(buzzer, 400,1000);
    Serial.println("LED an");
  }
  // ansonsten...
  else {
    noTone(buzzer);
    Serial.println("LED aus");
  }
  if (LDR_value6 < 100)  // Wenn der Schwellenwert 512 überschritten wird, soll die LED leuchten
  {
    tone(buzzer, 400,1000);
    Serial.println("LED an");
  }
  // ansonsten...
  else {
    noTone(buzzer);
    Serial.println("LED aus");
  }
  if (LDR_value7 < 100)  // Wenn der Schwellenwert 512 überschritten wird, soll die LED leuchten
  {
    tone(buzzer, 400);
    Serial.println("LED an");
  }
  // ansonsten...
  else {
    noTone(buzzer);
    Serial.println("LED aus");
  }
  if (LDR_value8 < 100)  // Wenn der Schwellenwert 512 überschritten wird, soll die LED leuchten
  {
    tone(buzzer, 400);
    Serial.println("LED an");
  }
  // ansonsten...
  else {
    noTone(buzzer);
    Serial.println("LED aus");
  }
}

Wenn die einfache Funktion gegeben ist, werde ich es noch in arrays und switch case umwandeln bzw eine ISM integrieren UND auf delays verzichten

Ich bekomme aber nur folgende Werte im SerMo ausgegeben:

15:28:06.843 -> LED aus
15:28:06.843 -> LED aus
15:28:06.885 -> LED aus
15:28:06.963 -> LED aus
15:28:07.010 -> LED aus
15:28:07.042 -> LED aus
15:28:07.086 -> LED aus
15:28:07.168 -> LED aus
15:28:07.200 -> 294
15:28:07.200 -> 282
15:28:07.200 -> 295
15:28:07.232 -> 298
15:28:07.232 -> 300
15:28:07.232 -> 309
15:28:07.232 -> 308
15:28:07.232 -> 300
15:28:07.232 -> 299
15:28:07.276 -> LED aus
15:28:07.276 -> LED aus
15:28:07.323 -> LED aus
15:28:07.369 -> LED aus
15:28:07.401 -> LED aus
15:28:07.442 -> LED aus
15:28:07.525 -> LED aus
15:28:07.571 -> LED aus
15:28:07.603 -> 302
15:28:07.603 -> 289
15:28:07.603 -> 302
15:28:07.635 -> 304
15:28:07.635 -> 304
15:28:07.635 -> 316
15:28:07.635 -> 315
15:28:07.635 -> 306
15:28:07.635 -> 303
15:28:07.673 -> LED aus
15:28:07.673 -> LED aus
15:28:07.718 -> LED aus
15:28:07.750 -> LED aus
15:28:07.795 -> LED aus
15:28:07.874 -> LED aus
15:28:07.922 -> LED aus
15:28:07.954 -> LED aus
15:28:07.997 -> 299
15:28:08.029 -> 283
15:28:08.029 -> 295
15:28:08.029 -> 300
15:28:08.029 -> 302
15:28:08.029 -> 302
15:28:08.029 -> 302
15:28:08.061 -> 297
15:28:08.061 -> 298
15:28:08.061 -> LED aus
15:28:08.061 -> LED aus
15:28:08.099 -> LED aus
15:28:08.185 -> LED aus
15:28:08.231 -> LED aus
15:28:08.262 -> LED aus
15:28:08.300 -> LED aus
15:28:08.385 -> LED aus
15:28:08.416 -> 291
15:28:08.416 -> 274
15:28:08.416 -> 285
15:28:08.448 -> 292
15:28:08.448 -> 296
15:28:08.448 -> 288
15:28:08.448 -> 288
15:28:08.448 -> 287
15:28:08.448 -> 290

Die Werte bleiben immer in diesem Bereich und verändern sich weder bei Helligkeit noch bei Dunkelheit.

Welchen Controller verwendest du dafür ?
Und das funktioniert nur an analogen Pins, nicht an digitalan.

Arduino Uno R3. OK vielleicht haben wir da den Fehler schon gefunden, aber ist schon klar, dass ich nicht alle 9 Sensoren dann unterbekommen werde und ich mir evtl ein größeres Board mit mehr Ports organisieren muss

https://wiki.keyestudio.com/KS0374_keyestudio_Power_Amplifier_Module

Den hab ich als Buzzer angeschlossen, aber aktuell ohne Ton

Wieso vielleicht ?
Ganz sicher. Das geht nur an analogen Pins.
Du kannst aber einen ADC verwenden. Z.B. den ADS1115, der liefert weitere analoge Eingänge.

Und dein Buzzer ist kein Buzzer, sondern ein kleiner Verstärker mit mini Lautsprecher.

Reine Sensoren ohne elektronik drum rum?
Dann könntest Du die auch als Schalter nutzen.

Der Mega2560 hat 16 analoge Eingänge:

Und den Mega gibt es als Mega 2560 pro mini auch kleiner.
Alternativ geht auch ein ESP32

ja die reinen Lichtsensoren. Wie meinst du das, als Schalter nutzen?

Wenn Du die mit einem Widerstand beschaltest wie in dem Bild, kannst Du den so auswählen, dass Du den TTL-Pegel sicher umschalten kannst. Nichts anderes machst Du jetzt mit dem auswerten der Spannung am analogPin.

Und dann digitalRead benutzen

Die digitalen Eingänge nutzen Schmitt-Trigger, um mit einer elektronischen Komparatorschaltung, die Hysterese nutzt, ein analoges Signal in ein sauberes digitales Signal umzuwandeln. Damit kannst Du das analoge Signal eines Spannungsteilers von LDR und Festwiderstand in ein logisches "High" oder "Low" wandeln. Mehr machst Du mit if (LDR_value1 < 100) auch nicht. Ersetzt Du den Festwiderstand durch ein Potentiometer, ist der Schwellwert zwischen "High" oder "Low" einstellbar.

Ugs heisst das also ich kann die auf digital nutzen, aber statt mit Werten zwischen 0 und 1023 soll ich HIGH und LOW nutzen, mittels digitalRead. Hab ich das jetzt genug versimpelt?

#define LDR0 11
#define LDR1 9
#define LDR2 8
#define LDR3 7
#define LDR4 6
#define LDR5 5
#define LDR6 4
#define LDR7 3
#define LDR8 2
bool LDR_value0;
bool LDR_value1;
bool LDR_value2;
bool LDR_value3;
bool LDR_value4;
bool LDR_value5;
bool LDR_value6;
bool LDR_value7;
bool LDR_value8;
#define buzzer 10

void setup() {
  Serial.begin(9600);
  pinMode(LDR0, INPUT);
  pinMode(LDR1, INPUT);
  pinMode(LDR2, INPUT);
  pinMode(LDR3, INPUT);
  pinMode(LDR4, INPUT);
  pinMode(LDR5, INPUT);
  pinMode(LDR6, INPUT);
  pinMode(LDR7, INPUT);
  pinMode(LDR8, INPUT);
  pinMode(buzzer, OUTPUT);
}

void loop() {

  LDR_value0 = digitalRead(LDR0);
  LDR_value1 = digitalRead(LDR1);
  LDR_value2 = digitalRead(LDR2);
  LDR_value3 = digitalRead(LDR3);
  LDR_value4 = digitalRead(LDR4);
  LDR_value5 = digitalRead(LDR5);
  LDR_value6 = digitalRead(LDR6);
  LDR_value7 = digitalRead(LDR7);
  LDR_value8 = digitalRead(LDR8);

  Serial.println(LDR_value0);
  Serial.println(LDR_value1);
  Serial.println(LDR_value2);
  Serial.println(LDR_value3);  // put your main code here, to run repeatedly:
  Serial.println(LDR_value4);
  Serial.println(LDR_value5);
  Serial.println(LDR_value6);
  Serial.println(LDR_value7);
  Serial.println(LDR_value8);

  if (LDR_value0 = LOW)  // Wenn der Schwellenwert 512 überschritten wird, soll die LED leuchten
  {
    tone(buzzer, 400,1000);
    Serial.println("LED an");
  }
  // ansonsten...
  else {
    noTone(buzzer);
    Serial.println("LED aus");
  }
  if (LDR_value1 = LOW)  // Wenn der Schwellenwert 512 überschritten wird, soll die LED leuchten
  {
    tone(buzzer, 400,1000);
    Serial.println("LED an");
  }
  // ansonsten...
  else {
    noTone(buzzer);
    Serial.println("LED aus");
  }
  if (LDR_value2 = LOW)  // Wenn der Schwellenwert 512 überschritten wird, soll die LED leuchten
  {
    tone(buzzer, 400,1000);
    Serial.println("LED an");
  }
  // ansonsten...
  else {
    noTone(buzzer);
    Serial.println("LED aus");
  }
  if (LDR_value4 = LOW)  // Wenn der Schwellenwert 512 überschritten wird, soll die LED leuchten
  {
    tone(buzzer, 400,1000);
    Serial.println("LED an");
  }
  // ansonsten...
  else {
    noTone(buzzer);
    Serial.println("LED aus");
  }
  if (LDR_value5 = LOW)  // Wenn der Schwellenwert 512 überschritten wird, soll die LED leuchten
  {
    tone(buzzer, 400,1000);
    Serial.println("LED an");
  }
  // ansonsten...
  else {
    noTone(buzzer);
    Serial.println("LED aus");
  }
  if (LDR_value6 = LOW)  // Wenn der Schwellenwert 512 überschritten wird, soll die LED leuchten
  {
    tone(buzzer, 400,1000);
    Serial.println("LED an");
  }
  // ansonsten...
  else {
    noTone(buzzer);
    Serial.println("LED aus");
  }
  if (LDR_value7 = LOW)  // Wenn der Schwellenwert 512 überschritten wird, soll die LED leuchten
  {
    tone(buzzer, 400);
    Serial.println("LED an");
  }
  // ansonsten...
  else {
    noTone(buzzer);
    Serial.println("LED aus");
  }
  if (LDR_value8 = LOW)  // Wenn der Schwellenwert 512 überschritten wird, soll die LED leuchten
  {
    tone(buzzer, 400);
    Serial.println("LED an");
  }
  // ansonsten...
  else {
    noTone(buzzer);
    Serial.println("LED aus");
  }
}

Er springt aber egal ob 0 oder 1 immer in else

C:\Users\Natalie\AppData\Local\Temp\.arduinoIDE-unsaved20251016-19944-1fap80c.wb3i\sketch_nov16a\sketch_nov16a.ino: In function 'void loop()':
C:\Users\Natalie\AppData\Local\Temp\.arduinoIDE-unsaved20251016-19944-1fap80c.wb3i\sketch_nov16a\sketch_nov16a.ino:57:18: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
   if (LDR_value0 = LOW)  // Wenn der Schwellenwert 512 überschritten wird, soll die LED leuchten
C:\Users\Natalie\AppData\Local\Temp\.arduinoIDE-unsaved20251016-19944-1fap80c.wb3i\sketch_nov16a\sketch_nov16a.ino:67:18: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
   if (LDR_value1 = LOW)  // Wenn der Schwellenwert 512 überschritten wird, soll die LED leuchten
C:\Users\Natalie\AppData\Local\Temp\.arduinoIDE-unsaved20251016-19944-1fap80c.wb3i\sketch_nov16a\sketch_nov16a.ino:77:18: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
   if (LDR_value2 = LOW)  // Wenn der Schwellenwert 512 überschritten wird, soll die LED leuchten
C:\Users\Natalie\AppData\Local\Temp\.arduinoIDE-unsaved20251016-19944-1fap80c.wb3i\sketch_nov16a\sketch_nov16a.ino:87:18: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
   if (LDR_value4 = LOW)  // Wenn der Schwellenwert 512 überschritten wird, soll die LED leuchten
C:\Users\Natalie\AppData\Local\Temp\.arduinoIDE-unsaved20251016-19944-1fap80c.wb3i\sketch_nov16a\sketch_nov16a.ino:97:18: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
   if (LDR_value5 = LOW)  // Wenn der Schwellenwert 512 überschritten wird, soll die LED leuchten
C:\Users\Natalie\AppData\Local\Temp\.arduinoIDE-unsaved20251016-19944-1fap80c.wb3i\sketch_nov16a\sketch_nov16a.ino:107:18: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
   if (LDR_value6 = LOW)  // Wenn der Schwellenwert 512 überschritten wird, soll die LED leuchten
C:\Users\Natalie\AppData\Local\Temp\.arduinoIDE-unsaved20251016-19944-1fap80c.wb3i\sketch_nov16a\sketch_nov16a.ino:117:18: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
   if (LDR_value7 = LOW)  // Wenn der Schwellenwert 512 überschritten wird, soll die LED leuchten
C:\Users\Natalie\AppData\Local\Temp\.arduinoIDE-unsaved20251016-19944-1fap80c.wb3i\sketch_nov16a\sketch_nov16a.ino:127:18: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
   if (LDR_value8 = LOW)  // Wenn der Schwellenwert 512 überschritten wird, soll die LED leuchten

Hast du immer noch nicht gelernt, dass es für Vergleiche zwei = braucht? Ein Gleichheitszeichen wird für Zuweisungen verwendet.

1 Like

Ist ja schon widerlegt :wink:

Ja, Du kannst den Spannungsteiler (Fotowiderstand und Festwiderstand) so dimensionieren, bzw wie vorgeschlagen den Festwiderstand durch ein Potentiometer ersetzen und so den Spannungsteiler kalibrieren, damit es funktioniert. Das wird aber nicht bei allen Lichtverhältnissen sicher gehen.

Andererseits gibt es Module mit Fotowiderständen, die einen Komparator drauf haben und wo man mittels Potentiometer den Schaltpunkt einstellen kann. Das Modul hat unter anderem einen digitalen Ausgang der einfach mit einem Digitalen Pin abgefragt werden kann. Kostet unter 1€ in Asien
Modul:


und Tutorial:

Ich habe für ein Projekt wo ein Gegenstand entfernt wird, der auf einem Fotowiderstand steht, ein Sketch gemacht, der dynamisch aus den gelesenen Werten einen Max und Min Wert berechnet und daraus die Schaltschwelle. Das Funktioniert dann zuverläßlich.
Die Schwierigkeit war dabei, daß ich weder die Lichtverhältnisse kenne, noch die Lichtverhältnisse konstant bleiben, noch die Beschaffenheit des Objekts kenne, außer daß es nicht durchsichtig ist.

Ist ein bißchen speziell :wink:

Grüße Uwe

Ich bin vom Code des TO ausgegangen.
Mit "analogRead" funktioniert es nur an analogen Pins, nicht an digitalen.

Edit:
meine Glaskugel ist im Urlaub. :wink:

Danke an alle. Es funktioniert jetzt. Das mit dem Ton kriege ich noch irgendwie raus.

Dann zeige bitte mal die Lösung.

Wie hast du es den angeschlossen?

Das stimmt nun auch wieder.
Hoffentlich bekommen wir bald unsere Kristallkugeln zurück.
Grüße Uwe

EDIT:
Hoffentlich nicht in Südtirol, das könnte dann länger dauern :wink:

So ich habe nun meinen Aufbau komplett fertig und bin jetzt wirklich am Ende mit meinen Nerven. 3 mal habe ich die Verkabelung kontrolliert und an der Verkabelung kann es meiner Meinung nach nicht liegen.

Ich habe von links nach rechts alle der Reihenfolge auch auf dem Arduino gepinnt.
Trotzdem passiert es, dass nur ein Teil funktioniert und der andere Teil was ganz anderes auslöst. Pin 7, 8 und 13 tun garnichts (Keine Reaktion auf den unterbrochenen Laser). Wenn ich jetzt aber den Laser an z.B. 9 unterbreche, zeigt er im SerMo z.B. Pin 12 an als aktiviert

int LDR0 = 13;
int LDR1 = 12;
int LDR2 = 11;
int LDR3 = 10;
int LDR4 = 9;
int LDR5 = 8;
int LDR6 = 7;

#define C 262
#define D 294
#define E 330
#define Fis 349
#define G 392
#define A 440
#define H 494

int LDR_value0;
int LDR_value1;
int LDR_value2;
int LDR_value3;
int LDR_value4;
int LDR_value5;
int LDR_value6;

#define buzzer 3

void setup() {
  Serial.begin(9600);
pinMode(LDR0, INPUT);
pinMode(LDR1, INPUT);
pinMode(LDR2, INPUT);
pinMode(LDR3, INPUT);
pinMode(LDR4, INPUT);
pinMode(LDR5, INPUT);
pinMode(LDR6, INPUT);
  pinMode(buzzer, OUTPUT);
}

void loop() {

  LDR_value0 = digitalRead(LDR0);
  LDR_value1 = digitalRead(LDR1);
  LDR_value2 = digitalRead(LDR2);
  LDR_value3 = digitalRead(LDR3);
  LDR_value4 = digitalRead(LDR4);
  LDR_value5 = digitalRead(LDR5);
  LDR_value6 = digitalRead(LDR6);
 

  Serial.println(LDR_value0);
  Serial.println(LDR_value1);
  Serial.println(LDR_value2);
  Serial.println(LDR_value3);  
  Serial.println(LDR_value4);
  Serial.println(LDR_value5);
  Serial.println(LDR_value6);


  if (LDR_value0 == 0)  
  {
    tone(buzzer, C ,1000);
    Serial.println("LED an");
  }
  // ansonsten...
  else {
    noTone(buzzer);
    Serial.println("LED aus");
  }
  if (LDR_value1 == 0)  
  {
    tone(buzzer, D ,1000);
    Serial.println("LED an");
  }
  // ansonsten...
  else {
    noTone(buzzer);
    Serial.println("LED aus");
  }
  if (LDR_value2 == 0)  
  {
    tone(buzzer, E,1000);
    Serial.println("LED an");
  }
  // ansonsten...
  else {
    noTone(buzzer);
    Serial.println("LED aus");
  }
  if (LDR_value4 == 0)  
  {
    tone(buzzer, Fis,1000);
    Serial.println("LED an");
  }
  // ansonsten...
  else {
    noTone(buzzer);
    Serial.println("LED aus");
  }
  if (LDR_value5 == 0)  
  {
    tone(buzzer, G,1000);
    Serial.println("LED an");
  }
  // ansonsten...
  else {
    noTone(buzzer);
    Serial.println("LED aus");
  }
  if (LDR_value6 == 0) 
  {
    tone(buzzer, A ,1000);
    Serial.println("LED an");
  }
  // ansonsten...
  else {
    noTone(buzzer);
    Serial.println("LED aus");
  }
}

Ich habe mir auch die entsprechenden Lichtsensoren gekauft mit integriertem Poti.