/* ----------------------------------------------------------------
Arduino Ultrasoninc Sensor HC-SR04
Ultrasonics based on code by Arbi Abdul Jabbaar
eSign output by Pete Osborn
Using Arduino IDE 1.8.13
Using HC-SR04 Module
Tested on 15/08/2022 https://wokwi.com/projects/340727728988750418
----------------------------------------------------------------
*/
long duration; // variable for the duration of sound wave travel
long potVoltage; //votage at potWiper input (fill level)
int distance; // variable for the distance measurement
int fillLevel; // no of segments illuminated on eSign
int maxDistance = 100; //max range in cm ("empty" value)
int minDistance = 3; //min range in cm ("full" value)
int maxSegments = 15; //15 or 9 depending on eSign type
int interval; //eSign segment spacing
int opMode; //selects ultrasonic (=1) or potentiometer (=0) input
//allocate Arduino pin numbers
const byte trigPin = 14; //allocate pin A0/D14 Arduino to pin Trig of HC-SR04
const byte echoPin = 15; // allocate pin A1/D15 Arduino to pin Echo of HC-SR04
const byte potWiper = 16; //allocate pin A2/D14 Arduino to potentiometer wiper
const byte modeSelect = 19; //allocate pin A5/D19 Arduino to input mode switch (1=u/s 0=pot)
const byte eSign1 = 2;//BCD output to high-side driver (lsb)
const byte eSign2 = 4;//BCD output to high-side driver
const byte eSign3 = 6;//BCD output to high-side driver
const byte eSign4 = 8;//BCD output to high-side driver (msb)
void setup() {
pinMode(trigPin, OUTPUT); // Sets the trigPin as an OUTPUT
pinMode(echoPin, INPUT); // Sets the echoPin as an INPUT
pinMode(potWiper, INPUT); // Sets the potWiper as an INPUT
//pinMode(modeSelect, INPUT); // Sets the modeSelect as an INPUT
pinMode(modeSelect,INPUT_PULLUP); // Sets the modeSelect as an INPUT with pullup resistor
pinMode(eSign1, OUTPUT);
pinMode(eSign2, OUTPUT);
pinMode(eSign3, OUTPUT);
pinMode(eSign4, OUTPUT);
digitalWrite(eSign1, LOW);
digitalWrite(eSign2, LOW);
digitalWrite(eSign3, LOW);
digitalWrite(eSign4, LOW);
Serial.begin(9600); // // Serial Communication is starting with 9600 of baudrate speed
Serial.println("Ultrasonic Sensor HC-SR04 Test");
Serial.println("with Arduino Nano");
}
void loop() {
opMode=digitalRead(modeSelect);
if (opMode == 1) { //Ultrasonic sensor mode
Serial.println(opMode);
interval = int(maxDistance/maxSegments);
// Clears the trigPin condition
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Set trigPin HIGH (ACTIVE) for 10 microseconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite (trigPin, LOW);
// Read echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
// Calculate distance
distance = duration * 0.034 / 2; // Speed of sound wave divided by 2 (out and back)
/* Display distance on the Serial Monitor
Serial.print("Distance reading: ");
Serial.print(distance);
Serial.println(" cm");
*/
if(distance>maxDistance){distance=maxDistance;} //truncate at max range
/* Serial.println(distance);
Serial.println(interval);
*/
fillLevel = int((maxDistance-distance)/interval); //calculate no of segments to be illuminated
if(fillLevel>maxSegments){fillLevel=maxSegments;} // truncate at min range
/*
Serial.print("Fill Level: ");
Serial.println(fillLevel);
//Print eSign inputs representing fill level
Serial.print(bitRead(fillLevel,3));
Serial.print(bitRead(fillLevel,2));
Serial.print(bitRead(fillLevel,1));
Serial.println(bitRead(fillLevel,0));
*/
// Set eSign1..4 outputs to BCD of fillLevel
if(bitRead(fillLevel,0) == 1) {digitalWrite(eSign1, HIGH);}
else {digitalWrite(eSign1, LOW);}
if(bitRead(fillLevel,1) == 1) {digitalWrite(eSign2, HIGH);}
else {digitalWrite(eSign2, LOW);}
if(bitRead(fillLevel,2) == 1) {digitalWrite(eSign3, HIGH);}
else {digitalWrite(eSign3, LOW);}
if(bitRead(fillLevel,3) == 1) {digitalWrite(eSign4, HIGH);}
else {digitalWrite(eSign4, LOW);}
delay(1000); // ensures echo reads are >60ms apart
}
else { // Pot input mode
//Serial.println("Pot Input");
interval = int(1024/(maxSegments));
potVoltage = analogRead(potWiper); //Read potWiper position
Serial.println(potVoltage);
Serial.print(bitRead(fillLevel,3));
Serial.print(bitRead(fillLevel,2));
Serial.print(bitRead(fillLevel,1));
Serial.println(bitRead(fillLevel,0));
fillLevel = int((1066-potVoltage)/interval); //calculate no of segments to be illuminated
// Set eSign1..4 outputs to BCD of fillLevel
if(bitRead(fillLevel,0) == 1) {digitalWrite(eSign1, HIGH);}
else {digitalWrite(eSign1, LOW);}
if(bitRead(fillLevel,1) == 1) {digitalWrite(eSign2, HIGH);}
else {digitalWrite(eSign2, LOW);}
if(bitRead(fillLevel,2) == 1) {digitalWrite(eSign3, HIGH);}
else {digitalWrite(eSign3, LOW);}
if(bitRead(fillLevel,3) == 1) {digitalWrite(eSign4, HIGH);}
else {digitalWrite(eSign4, LOW);}
delay(1000);
}
}