#include <Servo.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
// TFT Pins
#define TFT_CS 6
#define TFT_RST 8
#define TFT_DC 7
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
// Ultrasonic
#define TRIG 9
#define ECHO 10
// Output
#define BUZZER 4
#define LED 5
Servo myServo;
long duration;
int distance;
int angle;
void setup() {
Serial.begin(9600);
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(BUZZER, OUTPUT);
pinMode(LED, OUTPUT);
myServo.attach(3);
tft.initR(INITR_BLACKTAB);
tft.fillScreen(ST77XX_BLACK);
}
int getDistance() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
duration = pulseIn(ECHO, HIGH);
distance = duration * 0.034 / 2;
return distance;
}
void drawRadarLine(int angle, int distance) {
int x = 64 + distance * cos(angle * 3.14 / 180);
int y = 128 - distance * sin(angle * 3.14 / 180);
tft.drawLine(64, 128, x, y, ST77XX_GREEN);
}
void loop() {
// LEFT to RIGHT
for(angle = 0; angle <= 180; angle++) {
myServo.write(angle);
delay(20);
distance = getDistance();
tft.fillScreen(ST77XX_BLACK);
drawRadarLine(angle, distance);
// Object detection
if(distance < 30) {
digitalWrite(BUZZER, HIGH);
digitalWrite(LED, HIGH);
tft.setTextColor(ST77XX_RED);
tft.setCursor(10, 10);
tft.print("Object Detected");
}
else {
digitalWrite(BUZZER, LOW);
digitalWrite(LED, LOW);
tft.setTextColor(ST77XX_GREEN);
tft.setCursor(10, 10);
tft.print("Scanning...");
}
// Info display
tft.setCursor(10, 120);
tft.print("Angle: ");
tft.print(angle);
tft.setCursor(10, 135);
tft.print("Dist: ");
tft.print(distance);
tft.print("cm");
}
// RIGHT to LEFT
for(angle = 180; angle >= 0; angle--) {
myServo.write(angle);
delay(20);
distance = getDistance();
tft.fillScreen(ST77XX_BLACK);
drawRadarLine(angle, distance);
if(distance < 30) {
digitalWrite(BUZZER, HIGH);
digitalWrite(LED, HIGH);
} else {
digitalWrite(BUZZER, LOW);
digitalWrite(LED, LOW);
}
}
}