#include <LiquidCrystal.h>
#include <Servo.h>
#include <Wire.h>
#include <RTClib.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// ================= OLED =================
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(
SCREEN_WIDTH,
SCREEN_HEIGHT,
&Wire,
-1
);
// ================= LCD =================
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
// ================= RTC =================
RTC_DS1307 rtc;
// ================= PIR =================
#define PIR_PIN 11
// ================= HC-SR04 =================
#define TRIG_PIN 17
#define ECHO_PIN 18
// ================= LEDs =================
#define LED_VERDE 14
#define LED_AMARILLO 10
#define LED_ROJO 13
#define LED_AZUL 9
// ================= BUZZER =================
#define BUZZER 12
// ================= SERVO =================
#define SERVO_PIN 16
Servo servo;
void setup() {
Serial.begin(115200);
// ================= LCD =================
lcd.begin(16, 2);
// ================= I2C =================
// RTC + OLED compartirán GP0 y GP1
Wire.setSDA(0);
Wire.setSCL(1);
Wire.begin();
// ================= RTC =================
rtc.begin();
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// ================= OLED =================
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("OLED ERROR");
delay(2000);
}
display.clearDisplay();
display.display();
// ================= PIR =================
pinMode(PIR_PIN, INPUT);
// ================= HC-SR04 =================
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// ================= LEDs =================
pinMode(LED_VERDE, OUTPUT);
pinMode(LED_AMARILLO, OUTPUT);
pinMode(LED_ROJO, OUTPUT);
pinMode(LED_AZUL, OUTPUT);
// ================= BUZZER =================
pinMode(BUZZER, OUTPUT);
// ================= SERVO =================
servo.attach(SERVO_PIN);
servo.write(0);
// ================= LCD =================
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Sistema Aves");
lcd.setCursor(0,1);
lcd.print("Iniciando...");
delay(2000);
lcd.clear();
}
void loop() {
// ================= RTC =================
DateTime now = rtc.now();
// ================= OLED =================
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
if(now.hour() < 10) display.print("0");
display.print(now.hour());
display.print(":");
if(now.minute() < 10) display.print("0");
display.print(now.minute());
display.print(":");
if(now.second() < 10) display.print("0");
display.print(now.second());
// FECHA
display.setTextSize(1);
display.setCursor(0,40);
display.print(now.day());
display.print("/");
display.print(now.month());
display.print("/");
display.print(now.year());
display.display();
// ================= PIR =================
int movimiento = digitalRead(PIR_PIN);
// ================= HC-SR04 =================
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duracion = pulseIn(ECHO_PIN, HIGH);
float distancia = duracion * 0.034 / 2;
// ================= APAGAR LEDs =================
digitalWrite(LED_VERDE, LOW);
digitalWrite(LED_AMARILLO, LOW);
digitalWrite(LED_ROJO, LOW);
digitalWrite(LED_AZUL, LOW);
// ================= LCD =================
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Dist:");
lcd.print(distancia);
lcd.print("cm");
// ====================================================
// ================= DISTANCIA LEJANA =================
// ====================================================
if(distancia >= 150 && distancia <= 200) {
digitalWrite(LED_VERDE, HIGH);
lcd.setCursor(0,1);
lcd.print("Mov lejano");
tone(BUZZER, 500);
delay(300);
noTone(BUZZER);
}
// ====================================================
// ================= DISTANCIA MEDIA ==================
// ====================================================
else if(distancia >= 80 && distancia < 150) {
digitalWrite(LED_AMARILLO, HIGH);
lcd.setCursor(0,1);
lcd.print("Ave cerca");
tone(BUZZER, 1000);
delay(500);
noTone(BUZZER);
}
// ====================================================
// ================= DISTANCIA CORTA ==================
// ====================================================
else if(distancia >= 20 && distancia < 80) {
digitalWrite(LED_ROJO, HIGH);
lcd.setCursor(0,1);
lcd.print("Espantando");
tone(BUZZER, 1500);
for(int i = 0; i < 3; i++) {
servo.write(90);
delay(400);
servo.write(0);
delay(400);
}
noTone(BUZZER);
}
// ====================================================
// ================= ALARMA TOTAL =====================
// ====================================================
else if(distancia < 20 && movimiento == HIGH) {
lcd.setCursor(0,1);
lcd.print("PELIGRO !!!");
for(int i = 0; i < 5; i++) {
digitalWrite(LED_AZUL, HIGH);
tone(BUZZER, 2000);
servo.write(90);
delay(200);
digitalWrite(LED_AZUL, LOW);
noTone(BUZZER);
servo.write(0);
delay(200);
}
}
// ====================================================
// ================= SOLO PIR =========================
// ====================================================
else if(movimiento == HIGH) {
digitalWrite(LED_AMARILLO, HIGH);
lcd.setCursor(0,1);
lcd.print("Movimiento");
tone(BUZZER, 1200);
servo.write(90);
delay(1000);
servo.write(0);
noTone(BUZZER);
}
// ====================================================
// ================= SIN ACTIVIDAD ====================
// ====================================================
else {
lcd.setCursor(0,1);
lcd.print("Sin actividad");
noTone(BUZZER);
servo.write(0);
}
delay(500);
}