Es ist zum Teil unglaublich, über welche Fähigkeiten heute so mancher Sensor verfügt. Der Sensor VL53L0X ist ein sog. tof (engl. time of flight) sensor, welcher die Laufzeit von Laserlicht zum Objekt und wieder zurück zum Sensor ermittelt und daraus die Entfernung des Objekts berechnet.
In diesem Fall verwende ich aber nicht seine Funktion der Abstandsbestimmung, sondern lasse mir mittels Arduino die Laufzeit t zum Objekt anzeigen. Aus der bekannten/gemessenen Entfernung d und der Laufzeit t ergibt sich die Lichtgeschwindigkeit c = d/t.
Pro 30 cm Laufstrecke benötigt das Licht lediglich 1 ns bzw. pro Meter nur 3.33 ns. Demnach liegen die angezeigten Werte im Pikosendenbereich (1 ps = 10^-12 s). Befindet sich zwischen Sensor und Objekt nicht Luft, sondern ein anderes Medium (z.B. Wasser), so misst man eine deutlich reduzierte Lichtgeschwindigkeit. Diese hängt vom Brechungsindex n des jeweiligen Mediums ab. Wasser besitzt einen Brechungsindex von rund n = 4/3. Demnach beträgt die Lichtgeschwindigkeit im Wasser „nur“ cWasser = cVakuum / n = 300000 km/s / (4/3) = 225000 km/s.
Für dieses Projekt benötigt man lediglich einen Arduino, wieder ein I2C 16 x 2 display und den Sensor VL53L0X.
Arduino-Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
#include <Wire.h> // https://www.arduino.cc/en/Reference/Wire #include <LiquidCrystal_I2C.h> #include <VL53L0X.h> // https://github.com/pololu/vl53l0x-arduino VL53L0X sensor; // VL53L0X as sensor double distance; // variable for the measured distance in mm double duration; // variable duration to keep time in picoseconds LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display. ACHTUNG: Adresse kann auch 0x3F sein !!! // Anschlüsse: // GND - GND // VCC - 5V // SDA - ANALOG Pin 4 // SCL - ANALOG pin 5 // =========================== // ======= SETUP ========= // =========================== void setup() { Serial.begin(9600); Wire.begin(); //initialize wire.h library sensor.init(); //initialize sensor (VL53L0X) sensor.setTimeout(500); sensor.setMeasurementTimingBudget(200000); lcd.init(); // initialize the lcd lcd.backlight(); lcd.setCursor(0,0); lcd.print("Bestimmung von"); lcd.setCursor(0,1); lcd.print("v_Licht"); delay(3000); lcd.setCursor(0,0); lcd.print("Laufzeit t = "); lcd.setCursor(0,1); lcd.print("Sensor-Sensor"); delay(3000); lcd.setCursor(0,0); lcd.print(" "); lcd.setCursor(0,1); lcd.print(" "); } // =========================== // ======= LOOP ========= // =========================== void loop() { distance = 0; // clear distance variable for (int i = 1; i <= 10; i++) // repeat measurmens to increase precision { distance = distance + sensor.readRangeSingleMillimeters(); // accumulate results } distance = distance / 10; // gemittelte Distanz in mm Serial.print(" d = "); Serial.print(distance); Serial.print(" mm"); // c_Luft = 299.705.518 m/s // c_Vakuum = 299.792.458 m/s //duration = 2 * 3.335640952 * distance; // calculate value for c_vacuum in picoseconds duration = 2 * 3.336608571 * distance; // calculate value for c_air in picoseconds Serial.print(" t = "); Serial.print(duration,0); Serial.println(" ps "); lcd.setCursor(0,0); lcd.print("t = "); lcd.print(duration,0); lcd.print(" ps "); delay(500); } |