EchoDAR

by 发呆的dove in Circuits > Arduino

571 Views, 2 Favorites, 0 Comments

EchoDAR

IMG_20200525_212500.jpg
IMG_20200525_212634.jpg

As what it’s named, it’s an Echo Detection and Ranging. LCD will shows how far the object is away from you. And even you can estimate the distance by discerning the tone of the buzzer. Touch Sensor Switch make it easy to start or stop.

I get the idea from https://www.youtube.com/watch?v=kQRYIH2HwfYa, and it’s being equipped more sensors while I try to rebuild the work. Let’s start.

Supplies

Things you need to prepare:

For electronic part:

  • An Arduino uno board;
  • A bread board;
  • Lots of wires;
  • Touch Sensor;
  • Servo motor;
  • Ultrasonic Module;
  • LCD; Buzzer;

For the “Antenna” holder:

  • A pensil;
  • A binding clip;
  • A hard Cardboard;
  • Some Toothpick;

Perhaps some tools:

  • A knife;
  • An electric iron

The "Antenna"

IMG_20200525_213210.jpg
IMG_20200525_213201.jpg
IMG_20200525_212904.jpg

Because many tools and material are at school, and the Ultrasonic module will be serve for another use, i choose toothpicks and cardboard as connectors, and glue as less as possible.So you don't need to get the totally same materials as mine, anything at hand can be considered as the antenna holder.

Connect All the Sensors to Arduino Via the Breadboard

IMG_20200524_013718.jpg
IMG_20200525_213123.jpg
IMG_20200525_213105.jpg
IMG_20200525_213023.jpg
IMG_20200525_212928.jpg

I won't account the detail usage of the sensors as their programming skills are out of anywhere on the internet.

Programming, Reference Code As Follow

Screen Shot 2020-05-25 at 22.23.43.png
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <NewPing.h>
#include <Servo.h>
#define DEVTIME 5      //分时操作
#define TRIGGER_PIN  2  // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN     3  // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 400 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.
const int buzzerPin = 7; //the buzzer pin attach to
const int SensorPin=6; //touch switch attach to pin7
const int ledPin = 13; //pin13 built-in led

int ledState=0;
int SensorState=0; //store the value of touch switch
int lastSensorState=0;
int SensorCount=0;

int REST=1;//单片机睡眠
/************************************************/
Servo myservo;//create servo object to control a servo
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
LiquidCrystal_I2C lcd(0x27,16,2);//0x27   0x3F
/************************************************/
void setup()
{
  pinMode(buzzerPin,OUTPUT);//set buzzerPin as OUTPUT pinMode(SensorPin,INPUT);//set sensorPin as INPUT
  pinMode(ledPin,OUTPUT); // set ledPin as OUTPUT
  Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
  lcd.init(); 
  lcd.backlight();
  myservo.attach(9);//attachs the servo on pin 9 to servo object
  myservo.write(0);//back to 0 degrees 
  delay(1000);//wait for a second
}
/*************************************************/
void loop()
{ 
  lcd.setCursor(0, 0);
  lcd.print("Distance:");
  lcd.setCursor(0, 1);
  lcd.print("             ");
  lcd.setCursor(12, 1);
  lcd.print("cm"); 
  SensorSwitch();
  if (REST)
    noTone(buzzerPin);
  else{
  int count=0;
  for(int i=0;i<=360;i++)
  {
    SensorSwitch();
    if (count<DEVTIME){
      if (i<180)
      {
        myservo.write(i);
      }
      else
      {
        myservo.write(360-i);
      }
      count++;
    }
    else
    {  
      echoonce();
      noTone(buzzerPin);
      count=0;
    }
  }
}}
/**************************************************/
void echoonce()
{
  unsigned int uS = sonar.ping(); // Send ping, get ping time in microseconds (uS).
  int cm = uS / US_ROUNDTRIP_CM;
  if (cm<=0 or cm>MAX_DISTANCE) cm=MAX_DISTANCE;
  Serial.print("Ping: ");
  Serial.println(cm); // Convert ping time to distance in cm and print result (0 = outside set distance range)
  Serial.println("cm");
  beep(buzzerPin,cm); 
  lcd.setCursor(8, 1);
  lcd.rightToLeft();
  lcd.print(cm);
  lcd.leftToRight();
  delay(30);                      // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
 }
 void beep(int pin,int distance){
  if (distance<10) {tone(pin,2000);}
  else if (distance<30) {tone(pin,1000);}
  else if (distance<50) {tone(pin,200);}
  else {;}
  }
 void SensorSwitch(){
    SensorState=digitalRead(SensorPin);//read the value of pin7 
  if (SensorState!=lastSensorState & SensorState==LOW){
    SensorCount++;
  }
  if (SensorCount % 2 ==1){
    ledState=HIGH; //turn on the led
    SensorCount = 1;
    }
  else {
    ledState=LOW; //turn on the led
    SensorCount =0;}
  digitalWrite(ledPin, ledState);
  REST=!ledState;
  lastSensorState=SensorState;
  }