int trigger = 7; // Trigger-Pin des Ultraschallsensors
int echo = 6; // Echo-Pin des Ultraschallsensors
int pinR = A0; // Red-Pin an RGB-LED
int pinG = A1; // Green-Pin an RGB-LED
int pinB = A2; // Blue-Pin an RGB-LED
int lastLED = 19; // letzter PIN bei LED Bar Graph
long dauer = 0; // Variable, unter der die Zeit gespeichert wird, die eine Schallwelle bis zur Reflektion und zurück benötigt.
long entfernung = 0; // Variable, unter der die berechnete Entfernung gespeichert wird.
void setup()
{
Serial.begin (9600); // Serielle kommunikation starten, damit man sich später die Werte am serial monitor ansehen kann.
pinMode(trigger, OUTPUT); // Trigger-Pin ist ein Ausgang
pinMode(echo, INPUT); // Echo-Pin ist ein Eingang
pinMode(pinR, OUTPUT); // Red-RGB-PIN ist ein Ausgang
pinMode(pinG, OUTPUT); // Green-RGB-PIN ist ein Ausgang
pinMode(pinB, OUTPUT); // Blue-RGB-PIN ist ein Ausgang
for (int thisLED = 10; thisLED <= lastLED; thisLED++) //for-Schleife für Initialisierung der Pins für LED Bar Graph
{
pinMode(thisLED, OUTPUT);
}
}
void ultraschall() // Funktion für Abstandsmessung
{
digitalWrite(trigger, LOW); // Hier nimmt man die Spannung für kurze Zeit vom Trigger-Pin, damit man später beim senden des Trigger-Signals ein rauschfreies Signal hat.
delay(5); // Dauer: 5 Millisekunden
digitalWrite(trigger, HIGH); // Jetzt sendet man eine Ultraschallwelle los.
delay(10); // Dieser „Ton“ erklingt für 10 Millisekunden.
digitalWrite(trigger, LOW); // Dann wird der „Ton“ abgeschaltet.
dauer = pulseIn(echo, HIGH); // Mit dem Befehl „pulseIn“ zählt der Mikrokontroller die Zeit in Mikrosekunden, bis der Schall zum Ultraschallsensor zurückkehrt.
entfernung = (dauer/2) * 0.03432; // Nun berechnet man die Entfernung in Zentimetern. Man teilt zunächst die Zeit durch zwei (Weil man ja nur eine Strecke berechnen möchte und nicht die Strecke hin- und zurück). Den Wert multipliziert man mit der Schallgeschwindigkeit in der Einheit Zentimeter/Mikrosekunde und erhält dann den Wert in Zentimetern.
Serial.print(entfernung); // …soll der Wert der Entfernung an den serial monitor hier ausgegeben werden.
Serial.println(" cm"); // Hinter dem Wert der Entfernung soll auch am Serial Monitor die Einheit "cm" angegeben werden.
}
void ledR() // Funktion für rote RGB-LED
{
analogWrite(pinR, 255);
analogWrite(pinG, 0);
analogWrite(pinB, 0);
}
void ledB() // Funktion für blaue RGB-LED
{
analogWrite(pinR, 0);
analogWrite(pinG, 0);
analogWrite(pinB, 255);
}
void ledG() // Funktion für grüne RGB-LED
{
analogWrite(pinR, 0);
analogWrite(pinG, 255);
analogWrite(pinB, 0);
}
void loop()
{
ultraschall(); // Funktionsaufruf für Abstandsmessung
switch (entfernung) // switch-case-Verzweigung mit dem zu untersuchenden Ausdruck "entfernung"
{
case 0 ... 10: // springt in die Verzweigung, wenn die Entfernung 0 bis 10 cm beträgt
for (int thisLED = 10; thisLED <= lastLED; thisLED++) // for-Schleife um HIGH-Wert auf Pins 10 - 19 zu schreiben
{
digitalWrite(thisLED, HIGH);
}
ledR(); // Funktionsaufruf für rote RGB-LED
while (true); // Endlosschleife
break; // Switch-Anweisung wird verlassen
case 11 ... 20: // springt in die Verzweigung, wenn die Entfernung 11 bis 20 cm beträgt
for (int thisLED = 10; thisLED < 19; thisLED++) // for-Schleife um HIGH-Wert auf Pins 10 - 18 zu schreiben
{
digitalWrite(thisLED, HIGH);
}
for (int thisLED = 19; thisLED > 18; thisLED--) // for-Schleife um LOW-Wert auf Pin 19 zu schreiben
{
digitalWrite(thisLED, LOW);
}
ledR();
break;
case 21 ... 30: // springt in die Verzweigung, wenn die Entfernung 21 bis 30 cm beträgt
for (int thisLED = 10; thisLED < 18; thisLED++) // for-Schleife um HIGH-Wert auf Pins 10 - 17 zu schreiben
{
digitalWrite(thisLED, HIGH);
}
for (int thisLED = 19; thisLED > 17; thisLED--) // for-Schleife um HIGH-Wert auf Pins 18 - 19 zu schreiben
{
digitalWrite(thisLED, LOW);
}
ledB();
break;
case 31 ... 40:
for (int thisLED = 10; thisLED < 17; thisLED++)
{
digitalWrite(thisLED, HIGH);
}
for (int thisLED = 19; thisLED > 16; thisLED--)
{
digitalWrite(thisLED, LOW);
}
ledB();
break;
case 41 ... 50:
for (int thisLED = 10; thisLED < 16; thisLED++)
{
digitalWrite(thisLED, HIGH);
}
for (int thisLED = 19; thisLED > 15; thisLED--)
{
digitalWrite(thisLED, LOW);
}
ledB();
break;
case 51 ... 60:
for (int thisLED = 10; thisLED < 15; thisLED++)
{
digitalWrite(thisLED, HIGH);
}
for (int thisLED = 19; thisLED > 14; thisLED--)
{
digitalWrite(thisLED, LOW);
}
ledB();
break;
case 61 ... 70:
for (int thisLED = 10; thisLED < 14; thisLED++)
{
digitalWrite(thisLED, HIGH);
}
for (int thisLED = 19; thisLED > 13; thisLED--)
{
digitalWrite(thisLED, LOW);
}
ledB();
break;
case 71 ... 80:
for (int thisLED = 10; thisLED < 13; thisLED++)
{
digitalWrite(thisLED, HIGH);
}
for (int thisLED = 18; thisLED > 12; thisLED--)
{
digitalWrite(thisLED, LOW);
}
ledB();
break;
case 81 ... 90:
for (int thisLED = 10; thisLED < 12; thisLED++)
{
digitalWrite(thisLED, HIGH);
}
for (int thisLED = 19; thisLED > 11; thisLED--)
{
digitalWrite(thisLED, LOW);
}
ledB();
break;
case 91 ... 100:
for (int thisLED = 10; thisLED < 11; thisLED++)
{
digitalWrite(thisLED, HIGH);
}
for (int thisLED = 19; thisLED > 10; thisLED--)
{
digitalWrite(thisLED, LOW);
}
ledB();
break;
default: // Standardanweisung, falls keine Übereinstimmung mit anderen Fällen (cases); hier entfernung >= 101 cm
for (int thisLED = 10; thisLED <= lastLED; thisLED++)
{
digitalWrite(thisLED, LOW);
}
ledG();
break;
}
}