Garage Distance Sensor

Pages
Contributors: -KJB-
Favorited Favorite 0

Read Measurements with a Serial Monitor

Now that we've installed the Arduino library, it's time to upload our first sketch to make sure everything is working properly and you are able to read basic measurements with your Serial Monitor in the Arduino IDE.

For this example you will need the following items SparkFun RedBoard Qwiic, a SparkFun Ultrasonic Distance Sensor, a SparkFun Qwiic OLED - (1.3in., 128x64), a SparkFun Qwiic Twist, two 100mm Qwiic Cables, a 500mm Qwiic Cable , and a USB Micro-B Cable.

Using the Qwiic system, assembling the hardware is simple and straightforward. Start by connecting the SparkFun RedBoard Qwiic to the SparkFun Qwiic OLED (1.3in., 128x64) using one of the 100mm Qwiic cables. Next, connect the SparkFun Qwiic Twist to the OLED using the second 100mm Qwiic cable. Finally, plug one end of the 500mm Qwiic cable into the remaining port on the Qwiic Twist, and connect the other end to the SparkFun Ultrasonic Distance Sensor. Remember to insert all Qwiic cables in the correct orientation. To power up the system, connect the RedBoard to your computer using the USB Micro-B cable. With these connections in place, you're all set to start your project!

SparkFun Distance Sensor Hooked up to RedBoard

SparkFun Distance Sensor Hooked up to RedBoard

 

You can copy and paste the code below into a shiny new Arduino sketch:

#include <Wire.h>
#include <SparkFun_Qwiic_OLED.h>
#include "SparkFun_Qwiic_Twist_Arduino_Library.h"
#include "SparkFun_Qwiic_Ultrasonic_Arduino_Library.h"

// Create instances
QwiicMicroOLED myOLED;
TWIST twist;
QwiicUltrasonic myUltrasonic;

// Variables for distance settings
float minDistance = 50;  // Initial min distance in mm
float maxDistance = 250; // Initial max distance in mm
bool settingMin = true; // True = setting min, False = setting max
bool inRange = false;   // Whether current distance is within range

// Device address for ultrasonic sensor
uint8_t deviceAddress = kQwiicUltrasonicDefaultAddress; // 0x2F

void setup() {
    Serial.begin(115200);
    Serial.println("Starting Distance Sensor with OLED and Twist");

    Wire.begin();

    // Initialize the OLED
    while (myOLED.begin() == false) {
        Serial.println("OLED not connected, check wiring!");
        delay(1000);
    }

    // Initialize the Twist encoder
    if (twist.begin() == false) {
        Serial.println("Twist not detected. Freezing...");
        while (true);
    }

    // Initialize the Ultrasonic sensor
    while(myUltrasonic.begin(deviceAddress) == false) {
        Serial.println("Ultrasonic sensor not connected, check wiring!");
        delay(1000);
    }

    // Reset twist count and LED
    twist.setCount(50); // Start at 50mm
    twist.setColor(0, 0, 0);  // LED off initially
}

float getDistance() {
    uint16_t distance = 0;
    myUltrasonic.triggerAndRead(distance);
    return distance; // Returns distance in mm
}

void loop() {
    // Get distance measurement
    float currentDistance = getDistance();

    // Check for twist button press to toggle between setting min and max
    if (twist.isPressed()) {
        settingMin = !settingMin;  // Toggle between min and max setting
        twist.setCount(settingMin ? int(minDistance) : int(maxDistance));
        delay(200);  // Debounce
    }

    // Update min or max distance based on twist
    int count = twist.getCount();
    if (settingMin) {
        minDistance = count;
        if (minDistance >= maxDistance) minDistance = maxDistance - 10;
    } else {
        maxDistance = count;
        if (maxDistance <= minDistance) maxDistance = minDistance + 10;
    }

    // Check if current distance is within range
    inRange = (currentDistance >= minDistance && currentDistance <= maxDistance);

    // Update LED based on whether distance is in range
    if (inRange) {
        twist.setColor(0, 255, 0);  // Green when in range
    } else {
        twist.setColor(0, 0, 0);  // Off when out of range
    }

    // Clear the display
    myOLED.erase();

    // Display current mode and settings
    String modeStr = settingMin ? "Set Min" : "Set Max";
   myOLED.text(0, 0, modeStr, 1);

    // Display distance
    String distStr = String(int(currentDistance)) + " mm";
    int x0 = (myOLED.getWidth() - myOLED.getStringWidth(distStr)) / 2;
    myOLED.text(x0, 16, distStr, 1);

    // Display min and max
    String rangeStr = String(int(minDistance)) + "-" + String(int(maxDistance)) + "mm";
    x0 = (myOLED.getWidth() - myOLED.getStringWidth(rangeStr)) / 2;
    myOLED.text(x0, 32, rangeStr, 1);

    // Update the display
    myOLED.display();

    delay(100);
}