Fotowiderstand mit Arduino auslesen und über serielle Schnittstelle darstellen
Meine Befürchtung war, dass der Arduino ja keine Print-Befehle auf Stdio auf der Shell zulässt, wie es das Linux auf dem Raspberry Pi zulässt und ich deshalb wohl als erste Schaltung ein LC-Display bräuchte. Aber nach ein bisschen Einlesen war klar. Man kann ganz einfach die serielle Schnittstelle, also den USB-Anschluss nutzen, um etwas auszugeben, solange der Arduino am PC hängt. Sehr praktisch. Dazu braucht es nur den BefehlSerial.begin(9600);
im setup() und entsprechender
Serial.println(text);
im loop(). Fertig ist die Laube. In der Arduino-Software auf dem PC gibt es die zwei Werkzeuge Serieller Monitor, der einfach alle Werte, die per println ankommen, in ein Fenster schreibt und Serieller Plotterm der die Werte in ein Diagramm zeichnet und so eine Verlaufskurve darstellt.Das wollen wir gleich mal ausprobieren und einen analogen Eingang auslesen und dessen Spannungswert ausgeben. Dazu wollen wir einen Fotowiderstand nutzen. Das ist das Bauteil mit der Schlangenlinie auf dem Kopf. Je mehr Licht darauf trifft, desto geringer wird der Widerstand.
Der Arduino erwartet aber kein Widerstand an seinem analogen Eingang, sondern eine Spannung in Volt. Um den Arduino zufriedenzustellen, nutzen wir folgenden, kleinen Trick bzw. physikalische Begebenheit: Fließt ein Strom zwischen mehr als einen in Reihe geschalteten Widerstand, dann verteilt sich die Spannung auf die Widerstände. Habe ich z. B. 5 V Spannung und 2 gleiche Glühlämpchen mit dem selben Widerstand, dann liegt an beiden eine Spannung von 2.5 Volt an. Wir brauchen also nur einen zweiten Widerstand mit festem Wert, der bei angelegten 5V immer die gleiche Spannung hat und den Fotowiderstand, an dem, je nach seinem veränderlichen Widerstand auch eine veränderte Spannung anliegt. Diese können wir dann am Analog-Eingang des Arduino messen. Um den Messbereich möglichst groß zu halten, sollte der feste Widerstand in etwa den Widerstandswert des Fotowiderstands bei normaler Lichteinstrahlung haben. Da mein Fotowiderstand bei Normallicht etwa 1.5 kΩ hat wähle ich einen festen Widerstand von 1 kΩ
Die Schaltung ist einfach: GND wird vom Arduino an den festen Widerstand und +5V an den Fotowiderstand angelegt. Die beiden anderen Beinchen von festem und Foto-Widerstand treffen sich in der Mitte, welche wir mit A0 des Arduino verbinden.
Wenn jetzt Strom fließt, dann teilt sich die Spannung zwischem festen und Foto-Widerstand auf. Den einen Teil der Spannung messen wir an A0. In dieser Konfiguration wird die Spannung höher, desto heller es wird. Vertauschen wir GND und +5V, dann geben kleine Spannungen hohe Lichtwerte wieder. Mir gefällt aber: mehr Licht = mehr Spannung. Man könnte auch nur 3.3V Versorgungsspannung anlegen, aber dann würde man ein bisschen Messgenauigkeit verlieren, denn mit 5V haben wir einen größeren Messbereich (0-5V statt 0-3.3V).
Das Programm dazu sieht so aus:
// the setup routine runs once when you press reset:
void setup() {
// Serielle Verbindung mit 9600 bps aufbauen
Serial.begin(9600);
}
// the loop routine runs over and over again forever:
void loop() {
int a0val = analogRead(A0); // wert vom Analogeingang A0 lesen (0-1023)
float a0percent = a0val*100.0/1023.0; // prozentwert errechnen (0-100)
Serial.println(a0percent); // über die ser. Leitung an PC übertragen
delay(100); // kurze Pause zwischendurch
}
Die seriellen Befehle habe ich ja schon zu Anfang erklärt. Darum gleich zum loop()-TeilDer Arduino hat einen 10Bit-Analog-Digitalwandler. Das heißt, er setzt eine Spannung nicht bloß in 256 Werte wie z. B. der 8-bit-AD-Wandler PCF8591 um, sondern in 1024, von 0 bis 1023. In der nächsten Programmzeile wird aus dem ausgelesenen Wert ein Prozent-Wert errechnet, wo 0% absolut dunkel und 100% absolut hell symbolisieren. Der Prozentwert wird dann über die serielle Schnittstelle an den PC übertragen.
Auf dem PC starten wir das Werkzeug "Serieller Monitor". Dadurch werden alle Werte, die unser Programm sendet, entgegen genommen und ausgedruckt.
Damit kann man live die Werte beobachten.
Unter normaler Raumbeleuchtung liegt der Helligkeitswert bei 42.52%. Schalte ich die Schreibtischlampe an, dann steigt er auf 60.8% und halte ich ihn zu, fällt der Wert auf 10.5%.
Besser darstellen lassen sie solche Zahlenwerte aber mit dem Werkzeug Serieller Plotter. Auf dem Bild rechts sieht man schön, wann ich die Schreibtischlampe angeknipst habe und wann ich den Sensor zugehalten habe:
- ca. 42%: normal
- ca. 60%: Lampe an
- ca. 15%: zugehalten
Bei diesem Bild habe ich einmal den Delay auf 10 ms gestellt und eine meiner Taschenlampen benutzt, die einen Modus für abgeschwächstes Licht haben.
Wie man am Plotterbild schön erkennt, wird dabei die Taschenlampen-LED schnell im Wechsel ein- und ausgeschaltet. Damit ist die Taschenlampe nicht immer hell und das Licht erscheint für das menschliche Auge abgeschwächt.
Wie man außerdem sieht, reagiert der Fotowiderstand genügend schnell auf die wechselnde Einstrahlung.
Für Anwendungen, bei denen der Arduino ohne PC laufen soll, muss man dann natürlich eine andere Anzeigemöglichkeit realisieren, sei es als LCD-Anzeige oder als 7-Segment-Anzeige.
Aber für die Entwicklung ist die serielle Ausgabe eine große Erleichterung.