112 lines
3.1 KiB
Markdown
112 lines
3.1 KiB
Markdown
# Z-Lab Arduino-Grundkurs Übung 5: Lichtsensor (analoger Sensor)
|
|
|
|
In dieser Übung lesen wir einen Lichtsensor, einen sog. analogen Sensor aus.
|
|
|
|
Zuerst öffnen wir die Übung über den gewohnten Weg. Der Name ist "05_Lichtsensor"
|
|
|
|
![Übung öffnen](oeffnen.png)
|
|
|
|
## Verkabeln wir den Lichtsensor mit dem Arduino
|
|
|
|
So muss da aussehen, wenn wir fertig sind:
|
|
|
|
<img src="05_Lichtsensor.svg">
|
|
|
|
So und dann geht's wieder ans Programmieren.
|
|
|
|
In der Datei 05_Lichtsensor.ino finden wir (ohne die ganzen Kommentare) folgenden Quellcode:
|
|
|
|
```c
|
|
int sensorPin = A0;
|
|
int ledPin = LED_BUILTIN;
|
|
int sensorWert = 0;
|
|
|
|
void setup() {
|
|
pinMode(ledPin, OUTPUT);
|
|
}
|
|
|
|
void loop() {
|
|
sensorWert = analogRead(sensorPin);
|
|
digitalWrite(ledPin, HIGH);
|
|
delay(sensorWert);
|
|
digitalWrite(ledPin, LOW);
|
|
delay(sensorWert);
|
|
}
|
|
```
|
|
|
|
Eigentlich gibt es hier gar nicht viel Neues.
|
|
Das Eine das in dieser Übung neu ist ist, dass wir die Ausgabe von einer Funktion als Eingabe für eine andere Funktion verwenden.
|
|
Das ist super praktisch, weil wir dann mit Werten, die z.B. von einem Sensor kommen, etwas machen können.
|
|
|
|
Das Andere ist, dass wir einen analogen Sensor auswählen.
|
|
Der Sensor gibt uns eine Zahl zwischen 0 und 1000 zurück, die wir in unserem Programm verwenden können.
|
|
|
|
## Zuweisen von Werten
|
|
|
|
```c
|
|
sensorWert = analogRead(sensorPin);
|
|
```
|
|
|
|
In dieser Zeile nehmen wir den Wert, den der Lichtsensor zurückgibt und "packen" oder "speichern" ihn in der Variable "sensorWert".
|
|
|
|
```c
|
|
delay(sensorWert);
|
|
```
|
|
|
|
Die Funktion delay() kennen wir schon aus den anderen Übungen. Bisher haben wir immer eine Zahl wie 100 oder 1000 angegeben, um zu bestimmen, wie lange das Programm verzögert werden soll.
|
|
Jetzt nehmen wir den Wert, den uns der Lichtsensor gegeben hat und sagen der delay()-Funktion, dass sie zwischen 0 und 1000 Milisekunden warten soll... Je nachdem, ob heller oder dunkler ist.
|
|
|
|
## Und wie könnte es weiter gehen?
|
|
* hast du noch den Piepser zur Hand? Könntest du den Piepser heller oder dunkler piepsen lassen, je nachdem, wie hell oder dunkel es ist?
|
|
<details>
|
|
<summary>Hier klicken für Lösungsvorschläge - aber bitte erst selbst probieren! </summary>
|
|
|
|
```c
|
|
|
|
//TODO: Lösungsvorschlag anpassen
|
|
#define PIEPSER 12
|
|
int ledPin = LED_BUILTIN;
|
|
int sensorPin = A0;
|
|
int sensorWert = 0;
|
|
|
|
|
|
void setup() {
|
|
pinMode(PIEPSER, OUTPUT);
|
|
pinMode(ledPin, OUTPUT);
|
|
}
|
|
|
|
void loop() {
|
|
sensorWert = analogRead(sensorPin);
|
|
tone(PIEPSER, sensorWert);
|
|
}
|
|
```
|
|
</details>
|
|
|
|
* Und wie müsste das Programm aussehen, wenn wir ohne die Variable "sensorWert" auskommen wollten?
|
|
|
|
<details>
|
|
<summary>Hier klicken für Lösungsvorschläge - aber bitte erst selbst probieren! </summary>
|
|
|
|
```c
|
|
|
|
//TODO: Lösungsvorschlag anpassen
|
|
int sensorPin = A0;
|
|
int ledPin = LED_BUILTIN;
|
|
|
|
void setup() {
|
|
pinMode(ledPin, OUTPUT);
|
|
}
|
|
|
|
void loop() {
|
|
digitalWrite(ledPin, HIGH);
|
|
// Hier wir dei Ausgabe von analogRead() direkt an die Funktion delay() übergeben, ohne diese zuerst abzuspeichern. Das geht auch, ist aber unübersichtlicher
|
|
delay(analogRead(sensorPin));
|
|
digitalWrite(ledPin, LOW);
|
|
// hier noch mal
|
|
delay(analogRead(sensorPin));
|
|
}
|
|
```
|
|
</details>
|
|
|
|
Hier gehts [weiter zur nächsten Übung](../06_Schalter/)
|