// Distance Meter OLED Display
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define trigPin 9
#define echoPin 10
#define MEASURE_BUTTON 2
#define CLEAR_BUTTON 3
#define MY_BUTTON 8
#define OLED_RESET 4
bool isButtonPressed(int buttonPin);
bool circuitOn = false;
Adafruit_SSD1306 display(OLED_RESET);
float currentDistance = 0;
float previousDistance1 = 0;
float previousDistance2 = 0;
int buttonPressCount = 0;
unsigned long lastButtonPressTime = 0;
unsigned long debounceDelay = 50;
void calculateArea();
void calculateVolume();
void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(MEASURE_BUTTON, INPUT_PULLUP);
pinMode(CLEAR_BUTTON, INPUT_PULLUP);
pinMode(MY_BUTTON, INPUT_PULLUP);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (128x64)
display.clearDisplay();
}
bool isButtonPressed(int buttonPin) {
return digitalRead(buttonPin) == LOW;
}
// Updated loop function
void loop() {
if (isButtonPressed(MEASURE_BUTTON) && !circuitOn) {
// Turn on the circuit
circuitOn = true;
digitalWrite(trigPin, LOW);
// Ensure trigPin is initially LOW to prevent accidental trigger
delay(100); // Wait for stability
if (circuitOn == true) {
float duration;
float distance_cm;
float distance_m;
digitalWrite(trigPin, LOW); // PULSE _|---|_
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW) ;
duration = pulseIn(echoPin, HIGH) ;
distance_cm = (duration / 2) / 29.1;
display.setCursor(25, 0); // oled display
display.setTextSize(1);
display.setTextColor(WHITE);
display.println("Distance");
if (distance_cm < 100) {
// Display distance on OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.print(F("Distance: "));
display.print(distance_cm);
display.print(F(" Cm"));
display.display();
delay(500);
}
//display.setCursor(10, 20); // oled display
//display.setTextSize(2);
//display.setTextColor(WHITE);
//display.println(distance_cm);
//display.setCursor(90, 20);
//display.setTextSize(1);
//display.println("cm");
// Display distance on OLED
//display.display();
//delay(500);
else
{
distance_m = distance_cm / 100.0; // Convert to meters
// Display distance on OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.print(F("Distance: "));
display.print(distance_m);
display.print(F(" m"));
display.display();
}
circuitOn = false;
display.clearDisplay();
Serial.println(distance_cm);
Serial.println(distance_m);
}
}
if (isButtonPressed(CLEAR_BUTTON)) {
// Clear the displayed values on the screen
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.print(F("Distance: "));
display.display();
delay(500);
}
// Check button press count for area and volume calculation
// unsigned long currentTime = millis();
//if (currentTime - lastButtonPressTime > debounceDelay) {
//if (isButtonPressed(MY_BUTTON)) {
//buttonPressCount++;
//if (buttonPressCount == 1) {
//calculateArea();
//} else if (buttonPressCount == 2) {
//calculateVolume();
//buttonPressCount = 0; // Reset count after volume calculation
//}
//lastButtonPressTime = currentTime;
//}
//}
//circuitOn = false;
//display.clearDisplay();
//Serial.println(currentDistance);
//}
if (isButtonPressed(MY_BUTTON)) {
void calculateArea() {
float area = currentDistance * previousDistance1;
displayResult(F("Area: "), area, F(" sq units"));
}
void calculateVolume() {
float volume = currentDistance * previousDistance1 * previousDistance2;
displayResult(F("Volume: "), volume, F(" cubic units"));
}
void displayResult(const __FlashStringHelper *label, float value, const __FlashStringHelper *unit) {
// Display results on OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print(label);
display.print(value);
display.print(unit);
display.display();
// Update previous distances
previousDistance2 = previousDistance1;
previousDistance1 = currentDistance;
delay(500); // Adjust delay as needed
}
}