#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <ESP32Servo.h>
#include <HCSR04.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define NUM_ARCS 4
#define TRIGGER_PIN 4
#define ECHO_PIN 5
#define SERVO_PIN 5
#define LED_PIN 2
#define DISTANCIA_ZANCUDO 10
#define BUZZER_PIN 13
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Servo radarServo;
UltraSonicDistanceSensor sensor(TRIGGER_PIN, ECHO_PIN);
int angle = 0;
void setup() {
Serial.begin(115200);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.display();
delay(2000);
radarServo.attach(SERVO_PIN);
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
}
void loop() {
int distancia = sensor.measureDistanceCm();
display.clearDisplay();
drawRadarArcs();
moveRadar();
drawRadar(angle);
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(10, 0);
display.println("Distancia: " + String(distancia) + " cm");
display.display();
if (distancia <= DISTANCIA_ZANCUDO) {
// Mostrar mensaje en la pantalla OLED
display.setCursor(0, 16);
display.setTextColor(SSD1306_WHITE);
display.println("¡Zancudo detectado!");
digitalWrite(LED_PIN, HIGH);
if (BUZZER_PIN > 0) {
tone(BUZZER_PIN, 1000, 500);
}
} else {
digitalWrite(LED_PIN, LOW);
}
}
void moveRadar() {
angle++;
angle %= 360;
radarServo.write(angle);
delay(10);
}
void drawRadar(int angle) {
angle = constrain(angle, 0, 180);
int startX = SCREEN_WIDTH / 2;
int startY = SCREEN_HEIGHT;
int endX = startX + cos(angle * PI / 180.0) * 64;
int endY = startY - sin(angle * PI / 180.0) * 64;
int startXX = SCREEN_WIDTH / 2;
int startYY = SCREEN_HEIGHT - 1;
int endXX = startXX + cos(angle * PI / 180.0) * 64;
int endYY = startYY - sin(angle * PI / 180.0) * 64;
int startXXX = SCREEN_WIDTH / 2;
int startYYY = SCREEN_HEIGHT - 2;
int endXXX = startXXX + cos(angle * PI / 180.0) * 64;
int endYYY = startYYY - sin(angle * PI / 180.0) * 64;
display.drawLine(startXX, startYY, endXX, endYY, SSD1306_WHITE);
display.drawLine(startX, startY, endX, endY, SSD1306_WHITE);
display.drawLine(startXXX, startYYY, endXXX, endYYY, SSD1306_WHITE);
}
void drawRadarArcs() {
int centerX = SCREEN_WIDTH / 2;
int centerY = SCREEN_HEIGHT;
int radius = 64;
display.drawCircle(64,64,64, SSD1306_WHITE);
display.drawCircle(64,64,32, SSD1306_WHITE);
display.drawCircle(64,64,16, SSD1306_WHITE);
display.drawCircle(64,64,8, SSD1306_WHITE);
}