// Librerías
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Definir el tamaño de la OLED 128x64
#define TAM_LARGO 128
#define TAM_ANCHO 64
// Definir pines del sensor ultrasónico
const int trig = 13;
const int echo = 12;
// Variables de almacenamiento de distancia y tiempo
long tiempo;
int distancia;
// Dirección de la OLED
#define ADRESS 0x3C
// Crear instancia del objeto OLED
Adafruit_SSD1306 display(TAM_LARGO, TAM_ANCHO, &Wire, -1);
// Pines de LED RGB y buzzer
const int led_R = 26; // LED rojo
const int led_V = 25; // LED verde
const int buzzer = 14; // Buzzer
void setup() {
// Iniciar comunicación serial
Serial.begin(115200);
if (!display.begin(SSD1306_SWITCHCAPVCC, ADRESS)) {
Serial.println(F("ERROR DE INICIALIZACION OLED"));
for (;;); // Bucle infinito para indicar fallo
}
// Limpiar la pantalla o buffer y configurar OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(10, 20);
// Imprimir el nombre
display.println(F("LEONARDO TONATO"));
display.display();
delay(500);
// Inicializar pines del sensor ultrasónico
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
// Configurar pines de LED RGB y buzzer
pinMode(led_R, OUTPUT);
pinMode(led_V, OUTPUT);
pinMode(buzzer, OUTPUT);
}
void loop() {
Ultrasonico();
}
void Ultrasonico() {
// Generar pulso
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
// Leer el valor del tiempo de retorno del pulso
tiempo = pulseIn(echo, HIGH);
// Calcular la distancia, validando que el tiempo no sea cero
if (tiempo > 0) {
distancia = tiempo * 0.034 / 2;
} else {
distancia = -1; // Valor para indicar error si no hay medición
}
// Mostrar en la pantalla OLED
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(1);
display.println("Distancia: ");
display.setTextSize(2);
display.setCursor(30, 20);
if (distancia != -1) {
display.print(distancia);
display.println(" cm");
} else {
display.println("Error");
}
display.display();
// Validar información en el puerto serial
Serial.print("Distancia: ");
if (distancia != -1) {
Serial.print(distancia);
Serial.println(" cm");
} else {
Serial.println("Error en la medición");
}
// Controlar LEDs y buzzer según la distancia
if (distancia > 150) {
digitalWrite(led_V, HIGH);
digitalWrite(led_R, LOW);
noTone(buzzer);
} else if (distancia > 15 && distancia <= 150) {
digitalWrite(led_V, LOW);
digitalWrite(led_R, HIGH);
int intermitencia = map(distancia, 15, 150, 100, 2000); // Intermitencia entre 100 ms y 2000 ms
tone(buzzer, 1000);
delay(100);
noTone(buzzer);
delay(intermitencia);
} else if (distancia <= 15 && distancia != -1) { // Valor continuo si la distancia es menor o igual a 15 cm
digitalWrite(led_V, LOW);
digitalWrite(led_R, HIGH);
tone(buzzer, 1000);
}
delay(100);
}