Code tags added by moderator
/*
Ultrasonic Backup Sensor
By David Halloran
Summary:
This program was intended for an automobile backup sensor and takes reeadings from a
PING))) ultrasonic sensor and alerts you to an objects distance in four ways:
-Numeric readout
-Color coded zones
-Bar graph
-Audible tone
*/
//--------------------- include the library code: ---------------------------
#include <LiquidCrystal.h>
#include <Ping.h>
//--------------------------- Initialize --------------------------------------
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
Ping ping = Ping(13,0,0);
float In = 0;
int green = 2;
int yellow = 3;
int red = 4;
float low = 72; //Set distance for warnings to start
int med = 0;
int high = 0;
int Inb = 0;
float space =0;
int flash = 0;
char* unit[]={"Feet", "INCHES"};
int u = 1;
//Special Characters for Bar Graph
byte line[8] = {
B11111,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B11111
};
byte block[8] = {
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111
};
byte car[8] = {
B11111,
B01100,
B11110,
B00111,
B00111,
B11110,
B01100,
B11111
};
byte car1[8] = {
B11111,
B00110,
B11111,
B11000,
B11000,
B11111,
B00110,
B11111
};
//----------------------------- Setup -------------------------------------
void setup() {
lcd.begin(16, 2);
pinMode(6, OUTPUT);
pinMode(green, OUTPUT);
pinMode(yellow, OUTPUT);
pinMode(red, OUTPUT);
lcd.createChar(0, line);
lcd.createChar(1, block);
lcd.createChar(2, car1);
lcd.createChar(3, car);
med = (low/3)*2; // This breaks your warning distance into three even zones
high = low/3; // meaning the program will automatically scale if you
// change the start of the first warning zone
}
//------------------------------ Loop -----------------------------------
void loop() {
ping.fire();
In = ping.inches();
Inb = In;
if(In > 12){ //If measurement is greater than 12 inches use feet
space = In/12;
u = 0;
}else{ //else use inches
space = In;
u = 1;
}
lcd.clear();
if(In < high){ // Is the object in the Red Zone?
redLight();
distance();
bar();
}
else if ((In >= high) && (In < med)){ // Is the object in the Yellow Zone?
yellowLight();
distance();
bar();
}
else if ((In >= med) && (In < low)){ // Is the object in the Green Zone?
greenLight();
distance();
bar();
}
else if (In > low){ // If no object are in the set range print Drive Safely
lcd.setCursor(5, 0);
lcd.print("Drive");
lcd.setCursor(5, 1);
lcd.print("Safely");
noTone(6); //Tone and lights off
digitalWrite(red, LOW);
digitalWrite(yellow, LOW);
digitalWrite(green, LOW);
}
delay(200);
}
//---------------------- Red Zone ----------------------------
void redLight(){
tone(6,1440);
digitalWrite(green, HIGH);
digitalWrite(yellow, HIGH);
digitalWrite(red, HIGH);
}
//--------------------- Yellow Zone ----------------------------
void yellowLight(){
tone(6,880);
digitalWrite(green, HIGH);
digitalWrite(yellow, HIGH);
digitalWrite(red, LOW);
}
//-------------------- Green Zone ----------------------------
void greenLight(){
tone(6,440);
digitalWrite(green, HIGH);
digitalWrite(red, LOW);
digitalWrite(yellow, LOW);
}
//------------------- Print Distance -----------------------
void distance(){
lcd.setCursor(0, 0);
lcd.print("Distance: ");
lcd.setCursor(10, 0);
lcd.print(space);
lcd.setCursor(10, 1);
lcd.print(unit[u]);
}
//--------------------- Bar Graph ---------------------------
void bar(){
if (Inb >= ((double)5/(double)6*low)){ //Farthest Away
lcd.setCursor(0,1);
lcd.write(2);
lcd.write(3);
lcd.write(0);
lcd.write(0);
lcd.write(0);
lcd.write(0);
lcd.write(0);
lcd.write(1);
}
else if ((Inb < ((double)5/(double)6*low)) && (Inb >= ((double)4/(double)6*low))){
lcd.setCursor(0,1);
lcd.write(0);
lcd.write(2);
lcd.write(3);
lcd.write(0);
lcd.write(0);
lcd.write(0);
lcd.write(0);
lcd.write(1);
}
else if ((Inb < ((double)4/(double)6*low)) && (Inb >= ((double)3/(double)6*low))){
lcd.setCursor(0,1);
lcd.write(0);
lcd.write(0);
lcd.write(2);
lcd.write(3);
lcd.write(0);
lcd.write(0);
lcd.write(0);
lcd.write(1);
}
else if ((Inb < ((double)3/(double)6*low)) && (Inb >= ((double)2/(double)6*low))){
lcd.setCursor(0,1);
lcd.write(0);
lcd.write(0);
lcd.write(0);
lcd.write(2);
lcd.write(3);
lcd.write(0);
lcd.write(0);
lcd.write(1);
}
else if ((Inb < ((double)2/(double)6*low)) && (Inb >= ((double)1/(double)6*low))){
lcd.setCursor(0,1);
lcd.write(0);
lcd.write(0);
lcd.write(0);
lcd.write(0);
lcd.write(2);
lcd.write(3);
lcd.write(0);
lcd.write(1);
}
else if (Inb < ((double)1 / (double)6 * low)){ //Closest also makes the graph flash
if (flash < 1){
flash = flash++;
lcd.setCursor(0,1);
lcd.write(0);
lcd.write(0);
lcd.write(0);
lcd.write(0);
lcd.write(0);
lcd.write(2);
lcd.write(3);
lcd.write(1);
tone(6, 2000);
}
else{
flash = 0;
lcd.setCursor(0,1);
lcd.write(0);
lcd.write(0);
lcd.write(0);
lcd.write(0);
lcd.write(0);
lcd.write(0);
lcd.write(0);
lcd.write(1);
tone(6, 2000);
}
}
}