#include <SevSegShift.h>
// Pin definitions for shift register
#define SHIFT_PIN_SHCP 7 // Clock pin - SHCP/SH_CP
#define SHIFT_PIN_STCP 4 // Latch pin - STCP/ST_CP
#define SHIFT_PIN_DS 8 // Data pin - DS
// Pin definitions for ultrasonic sensor
#define TRIG_PIN 12
#define ECHO_PIN 11
// Pin definitions for LEDs and buzzer
#define RED_LED 5
#define YELLOW_LED 6
#define GREEN_LED 3
#define BUZZER 2
// Digit pins connected to Arduino
const int digit1 = A0;
const int digit2 = A1;
const int digit3 = A2;
const int digit4 = A3;
// Define segment pins (mapped through shift register)
const byte numDigits = 4;
const byte digitPins[] = {digit1, digit2, digit3, digit4};
const byte numSegmentPins = 8; // 7 segments + decimal point
const byte segmentPins[] = {0, 1, 2, 3, 4, 5, 6, 7}; // Pins on shift register
// Initialize SevSegShift
SevSegShift sevseg(SHIFT_PIN_DS, SHIFT_PIN_SHCP, SHIFT_PIN_STCP, 1, true); // 1 shift register, common anode display
// Variables
int distance = 0;
unsigned long lastMeasurement = 0;
const unsigned long MEASUREMENT_INTERVAL = 100; // Measure every 100ms
// Beep timing variables
unsigned long lastBeepTime = 0;
const unsigned long BEEP_ON_TIME = 100; // Beep for 100ms
const unsigned long BEEP_OFF_TIME = 900; // Silent for 900ms
boolean isBeeping = false;
void setup() {
// Initialize display
sevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins, true, false, false, false);
sevseg.setBrightness(90);
// Initialize sensor pins
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// Initialize LED and buzzer pins
pinMode(RED_LED, OUTPUT);
pinMode(YELLOW_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(BUZZER, OUTPUT);
// Initially turn off all LEDs and buzzer
digitalWrite(RED_LED, LOW);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(GREEN_LED, LOW);
digitalWrite(BUZZER, LOW);
}
void loop() {
unsigned long currentTime = millis();
// Update distance measurement periodically
if (currentTime - lastMeasurement >= MEASUREMENT_INTERVAL) {
distance = measureDistance();
lastMeasurement = currentTime;
updateWarnings();
}
// Must be called frequently to maintain display
sevseg.refreshDisplay();
}
int measureDistance() {
// Clear trigger pin
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
// Send 10μs pulse
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Measure the response
long duration = pulseIn(ECHO_PIN, HIGH);
// Calculate distance in cm and ensure it's within valid range
int dist = duration * 0.034 / 2;
return constrain(dist, 0, 9999); // Ensure distance fits on display
}
void updateWarnings() {
// Reset all indicators
digitalWrite(RED_LED, LOW);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(GREEN_LED, LOW);
unsigned long currentTime = millis();
if (distance <= 10) {
// Danger zone - continuous beep and red light
digitalWrite(RED_LED, HIGH);
tone(BUZZER, 1000);
isBeeping = true;
}
else if (distance > 10 && distance <= 30) {
// Warning zone - yellow light and short beeps
digitalWrite(YELLOW_LED, HIGH);
// Manage beeping timing
if (!isBeeping && currentTime - lastBeepTime >= BEEP_OFF_TIME) {
// Start a new beep
tone(BUZZER, 500);
isBeeping = true;
lastBeepTime = currentTime;
}
else if (isBeeping && currentTime - lastBeepTime >= BEEP_ON_TIME) {
// End the beep
noTone(BUZZER);
isBeeping = false;
lastBeepTime = currentTime;
}
}
else {
// Safe zone - green light, no beep
digitalWrite(GREEN_LED, HIGH);
noTone(BUZZER);
isBeeping = false;
}
// Update display
sevseg.setNumber(distance +1);
}