CODE
#include <Wire.h>
#include <VL53L0X.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <MedianFilter.h>
// -------- OLED CONFIG --------
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// -------- SENSOR & FILTER --------
VL53L0X sensor;
MedianFilter filter(10, 0);
// -------- RANGE LIMIT (mm) --------
#define MAX_RANGE 2000
void setup()
{
Serial.begin(9600);
Wire.begin();
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
while (1);
}
display.clearDisplay();
display.setRotation(2);
display.setTextColor(SSD1306_WHITE);
display.display();
sensor.init();
sensor.setTimeout(500);
}
// -------- DISPLAY DISTANCE --------
void displayDistance(int val)
{
display.clearDisplay();
display.setTextWrap(true);
display.setTextSize(4);
display.setCursor(0, 0);
display.print(val);
display.setTextSize(2);
display.setCursor(0, 40);
display.print("mm");
display.display();
}
// -------- DISPLAY OUT OF RANGE (FULL WORD) --------
void displayOutOfRange()
{
display.clearDisplay();
display.setTextWrap(false); // no line break
display.setTextSize(2); // 🔴 IMPORTANT: size 1
display.setCursor(2, 25); // center look
display.print("OUT OF RNG");
display.display();
}
void loop()
{
int r = sensor.readRangeSingleMillimeters();
if (sensor.timeoutOccurred() || r == 0 || r > MAX_RANGE) {
Serial.println("**OUT OF RANGE**");
displayOutOfRange();
delay(200);
return;
}
filter.in(r);
int o = filter.out();
Serial.print("Distance: ");
Serial.print(o);
Serial.println(" mm");
displayDistance(o);
delay(10);
}
