#include <Servo.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#define TFT_CS 10
#define TFT_RST 8
#define TFT_DC 9
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
#define trigPin 6
#define echoPin 5
#define servoPin 3
Servo myServo;
int centerX = 64;
int baseY = 120;
int radius = 100;
long duration;
int distance;
void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
myServo.attach(servoPin);
tft.initR(INITR_BLACKTAB);
tft.setRotation(1);
tft.fillScreen(ST77XX_BLACK);
drawRadarFrame();
}
void drawRadarFrame() {
tft.drawCircle(centerX, baseY, 100, ST77XX_GREEN);
tft.drawCircle(centerX, baseY, 70, ST77XX_GREEN);
tft.drawCircle(centerX, baseY, 40, ST77XX_GREEN);
tft.drawLine(0, baseY, 128, baseY, ST77XX_GREEN);
}
int getDistance() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
return duration * 0.034 / 2;
}
void loop() {
for (int angle = 0; angle <= 180; angle += 3) {
myServo.write(angle);
distance = getDistance();
int x = centerX + radius * cos(radians(angle));
int y = baseY - radius * sin(radians(angle));
// erase previous line
tft.drawLine(centerX, baseY, x, y, ST77XX_BLACK);
// draw scan line
tft.drawLine(centerX, baseY, x, y, ST77XX_GREEN);
if (distance < 100) {
int dx = centerX + distance * cos(radians(angle));
int dy = baseY - distance * sin(radians(angle));
tft.fillCircle(dx, dy, 2, ST77XX_RED);
}
delay(15); // FAST animation
}
for (int angle = 180; angle >= 0; angle -= 3) {
myServo.write(angle);
distance = getDistance();
int x = centerX + radius * cos(radians(angle));
int y = baseY - radius * sin(radians(angle));
tft.drawLine(centerX, baseY, x, y, ST77XX_BLACK);
tft.drawLine(centerX, baseY, x, y, ST77XX_GREEN);
if (distance < 100) {
int dx = centerX + distance * cos(radians(angle));
int dy = baseY - distance * sin(radians(angle));
tft.fillCircle(dx, dy, 2, ST77XX_RED);
}
delay(15);
}
}