Nr.08 Fotowiderstand

Inhaltsverzeichnis

Fotowiderstand am Mikrocontroller auslesen

Jetzt wird’s etwas komplizierter. Erst durchatmen und ein neues Getränk holen!

Aufgabe: Eine LED soll leuchten, wenn es dunkel wird bzw. wenn ein Fotowiderstand abgedeckt wird.

Spannung auslesen

Der Mikrocontroller soll über einen Fotowiderstand auslesen, wie hell es ist. Dazu nutzt man ein einfaches physikalisches Prinzip. Wenn in einem Stromkreis zwei Verbraucher hintereinander angeschlossen sind (Reihenschaltung), dann „teilt“ sie sich auch die gemeinsam anliegende Spannung. 

Ein Beispiel: Zwei gleiche Lampen sind in Reihe geschaltet und es wird eine Spannung von 6 Volt angelegt. Dann kann man mit einem Spannungsmessgerät feststellen, dass an den Lampen jeweils nur 3 Volt anliegen. Wenn zwei ungleiche Lampen angeschlossen werden (eine Lampe hat einen geringeren Widerstand), dann kann man zwei unterschiedliche Spannungen an den beiden Lampen messen, bspw. 1,5 Volt und 4,5 Volt.

Ein Fotowiderstand ändert seinen Widerstand in Abhängigkeit der Lichtstärke. Diesen Effekt nutzt man, um anhand der an ihr anliegenden Spannung einen Wert für Helligkeit bzw. Dunkelheit in Form von verschiedenen Spannungen abzulesen. Damit man hier überhaupt eine Spannungsteilung erzeugen kann, schließt man den Fotowiderstand und einen Widerstand (1 – 10 K Ohm, je nach verwendetem Fotowiderstand. Der Widerstand sollte einen ähnlichen Widerstandswert wie der Fotowiderstand haben) in Reihe an und verbindet sie mit 5 Volt und der „Erdung“ (Ground / GND) – siehe Aufbau.

Das Mikrocontroller-Board ist in der Lage, analoge Signale (Spannung) zu messen und diese zu verarbeiten. Dies geschieht mit den analogen Eingängen auf dem Board. Dieser wandelt den gemessenen Spannungswert in eine Zahl um, die dann weiter verarbeitet werden kann. 0 Volt entspricht dabei der Zahl 0 und der höchste Messwert 5 Volt entspricht der Zahl 1023 (0 bis 1023 entspricht 1024 Zahlen = 10 Bit).

Beispiel: Es wird eine Spannung von 2,5 Volt gemessen, dann liefert der Mikrocontroller den Wert 512 (1024 : 2).

Der Serielle Monitor

Der „Serielle Monitor“ ist ein wichtiger Bestandteil der Arduino-Software. Mit diesem Werkzeug kann man sich am PC Daten anzeigen lassen, die das Mikrocontroller-Board an den PC sendet (Zahlen oder Texte). Das ist sehr sinnvoll, da nicht immer ein LCD-Display am Mikrocontroller angeschlossen ist auf dem man bestimmte Werte ablesen könnte.

In diesem Sketch wird der Serielle Monitor verwendet, um die Werte anzeigen zu lassen, die vom Fotowiderstand gelesen werden.

Wozu ist das sinnvoll? Mal angenommen, die LED soll erst bei beginnender Dunkelheit anfangen zu leuchten. Dann muss es im Sketch einen Bereich geben, der die Funktion hat: „Wenn der Wert des Fotowiderstandes den Wert x unterschreitet, dann soll die LED leuchten“. Dazu müsste man wissen, wie groß der Wert x bei beginnender Dämmerung ist.

Lösung: Ich sende den ausgelesenen Wert „x“ der Spannung an dem Fotowiderstand bei entsprechender Helligkeit (bspw. Dämmerung) an den Seriellen Monitor“ und lasse ihn mir dort anzeigen. Mit diesem Wissen kann ich später das Programm in der folgenden Form abändern. „Wenn der Spannungsausgabewert des Fotowiderstandes einen Wert von „x“ unterschreitet, dann schalte die LED an.“

Die weitere Erklärung befindet sich den Sketchen.

Schaltpläne

Der Programmcode

Arduino UNO

// Pins für den Fotowiderstand und die LED
int Fotowiderstand = A0; 
int LED = 12; 

// der Wert für SchwelleDunkelheit 
// kann an die gewünschte "Dunkelheit" 
// (den Zeitpunkt, an dem die LED leuchten soll)
// angepasst werden
int SchwelleDunkelheit = 400;

void setup()  
{ 
  pinMode(LED, OUTPUT); 

  // Seriellen Monitor starten
  Serial.begin(9600); 
}

void loop()   
{ 
  // digitaler Wert der gelesenen Spannung am Pin A0
  int SensorWert = analogRead(Fotowiderstand); 
  
  // Kommentarzeichen in den Zeilen 27 und 28 entfernen 
  // um den digitalen Wert der ausgelesenen Spannung am Pin A0 anzuzeigen
  // und evtl den Wert für SchwelleDunkelheit anzupassen
  // Serial.print("Ausgelesener Wert: ");       
  // Serial.println(SensorWert); 
  if (SensorWert < SchwelleDunkelheit)  
  {
    // wenn der digitale Wert am Pin A0  unterschritten wird
    // -> LED einschalten
    digitalWrite(LED, HIGH);  
  } 

  // andernfalls LED ausschalten
  else   
  {   
    digitalWrite(LED, LOW);
  }
}

Wemos D1 Mini

// Pins für den Fotowiderstand und die LED
int Fotowiderstand = A0; 
int LED = D1; 

// der Wert für SchwelleDunkelheit 
// kann an die gewünschte "Dunkelheit" 
// (den Zeitpunkt, an dem die LED leuchten soll)
// angepasst werden
int SchwelleDunkelheit = 400;

void setup()  
{ 
  pinMode(LED, OUTPUT); 

  // Seriellen Monitor starten
  Serial.begin(9600); 
}

void loop()   
{ 
  // digitaler Wert der gelesenen Spannung am Pin A0
  int SensorWert = analogRead(Fotowiderstand); 
  
  // Kommentarzeichen in den Zeilen 27 und 28 entfernen 
  // um den Wert für SchwelleDunkeheit anzuzeigen
  // und evtl. anzupassen
  // Serial.print("Ausgelesener Wert: ");       
  // Serial.println(SensorWert); 
  if (SensorWert < SchwelleDunkelheit)  
  {
    // wenn der digitale Wert am Pin A0  unterschritten wird
    // -> LED einschalten
    digitalWrite(LED, HIGH);  
  } 

  // andernfalls LED ausschalten
  else   
  {   
    digitalWrite(LED, LOW);
  }
}

ESP32-Wroom

Beim ESP32-Wroom gibt es eine Besonderheit:
Der Analog-Digital-Wandler arbeitet mit 12 Bit. Die Werte nach der Umwandlung bewegen sich zwischen 0 und 4095, daher muss der Wert für SchwelleDunkelheit angepasst werden

// Pins für den Fotowiderstand und die LED
int Fotowiderstand = 35; 
int LED = 33; 

// der Wert für SchwelleDunkelheit 
// kann an die gewünschte "Dunkelheit" 
// (den Zeitpunkt, an dem die LED leuchten soll)
// angepasst werden
int SchwelleDunkelheit = 1200;

void setup()  
{ 
  pinMode(LED, OUTPUT); 

  // Seriellen Monitor starten
  Serial.begin(9600); 
}

void loop()   
{ 
  // digitaler Wert der gelesenen Spannung am Pin A0
  int SensorWert = analogRead(Fotowiderstand); 
  
  // Kommentarzeichen in den Zeilen 27 und 28 entfernen 
  // um den digitalen Wert der ausgelesenen Spannung am Pin A0 anzuzeigen
  // und evtl den Wert für SchwelleDunkelheit anzupassen
  // Serial.print("Ausgelesener Wert: ");       
  // Serial.println(SensorWert); 
  if (SensorWert < SchwelleDunkelheit)  
  {
    // wenn der digitale Wert am Pin A0  unterschritten wird
    // -> LED einschalten
    digitalWrite(LED, HIGH);  
  } 

  // andernfalls LED ausschalten
  else   
  {   
    digitalWrite(LED, LOW);
  }
}

NodeMCU

// Pins für den Fotowiderstand und die LED
int Fotowiderstand = A0; 
int LED = D1; 

// der Wert für SchwelleDunkelheit 
// kann an die gewünschte "Dunkelheit" 
// (den Zeitpunkt, an dem die LED leuchten soll)
// angepasst werden
int SchwelleDunkelheit = 400;

void setup()  
{ 
  pinMode(LED, OUTPUT); 

  // Seriellen Monitor starten
  Serial.begin(9600); 
}

void loop()   
{ 
  // digitaler Wert der gelesenen Spannung am Pin A0
  int SensorWert = analogRead(Fotowiderstand); 
  
  // Kommentarzeichen in den Zeilen 27 und 28 entfernen 
  // um den digitalen Wert der ausgelesenen Spannung am Pin A0 anzuzeigen
  // und evtl den Wert für SchwelleDunkelheit anzupassen
  // Serial.print("Ausgelesener Wert: ");       
  // Serial.println(SensorWert); 
  if (SensorWert < SchwelleDunkelheit)  
  {
    // wenn der digitale Wert am Pin A0  unterschritten wird
    // -> LED einschalten
    digitalWrite(LED, HIGH);  
  } 

  // andernfalls LED ausschalten
  else   
  {   
    digitalWrite(LED, LOW);
  }
}

Funduino - Dein Onlineshop für Mikroelektronik

  • Dauerhaft 10% Rabatt für Schüler, Studenten und Lehrkräfte
  • Mehr als 3.500 Artikel sofort verfügbar!
  • Über 8 Jahre Erfahrung mit Arduino, 3D-Druck und co.
SALE