#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
// ================= VARIABLES GLOBALES =================
volatile bool interrupcionSalir = false;
volatile bool reiniciarSensor = false;
int contadorReinicio = 0;
int opcionMenu = -1;
bool enEjecucion = false;
// Servo y Joystick
Servo servoJoystick;
int Y = A0; // Eje Y conectado a A0
// DHT y LCD
#define PinSensor 10
#define Tipo DHT22
DHT dht(PinSensor, Tipo);
LiquidCrystal_I2C lcd(0x27, 16, 2); // LCD I2C
// ================ PROTOTIPOS ================
void leerJoystick();
void leerSensorGolpe();
void leerTempHumedad();
void leerNivelAgua();
void leerSensorIR();
void leerUltrasonido();
void mostrarMenu();
void ISR_salirSensor() {
interrupcionSalir = true;
}
void ISR_reiniciarSensor() {
reiniciarSensor = true;
}
void mostrarMenu() {
Serial.println("\n--- MENU DE SENSORES ---");
Serial.println("1. Sensor Joystick");
Serial.println("2. Sensor de Golpe/Impacto");
Serial.println("3. Sensor Temp/Humedad");
Serial.println("4. Sensor Nivel de Agua");
Serial.println("5. Sensor Infrarrojo Movimiento");
Serial.println("6. Sensor Ultrasonido");
Serial.println("0. Salir");
Serial.print("Seleccione una opcion: ");
}
void setup() {
Serial.begin(9600);
// Interrupciones
pinMode(2, INPUT_PULLUP); // Salida de sensor
pinMode(3, INPUT_PULLUP); // Reinicio
attachInterrupt(digitalPinToInterrupt(2), ISR_salirSensor, FALLING);
attachInterrupt(digitalPinToInterrupt(3), ISR_reiniciarSensor, FALLING);
// Inicialización
servoJoystick.attach(4);
dht.begin();
lcd.init();
lcd.backlight();
mostrarMenu();
}
void loop() {
if (enEjecucion) return;
if (Serial.available() > 0) {
opcionMenu = Serial.parseInt();
Serial.println(opcionMenu);
switch (opcionMenu) {
case 1: leerJoystick(); break;
case 2: leerSensorGolpe(); break;
case 3: leerTempHumedad(); break;
case 4: leerNivelAgua(); break;
case 5: leerSensorIR(); break;
case 6: leerUltrasonido(); break;
case 0: Serial.println("Saliendo..."); break;
default: Serial.println("Opcion invalida."); break;
}
delay(500);
if (!enEjecucion) mostrarMenu();
}
}
// ================ FUNCIONES DE SENSORES ================
void cicloReinicio() {
for (int i = 0; i < 10; i++) {
Serial.print("Contador: ");
Serial.println(i);
delay(500);
}
reiniciarSensor = false;
}
void leerJoystick() {
enEjecucion = true;
Serial.println(">> Sensor Joystick activado. Boton pin 2 para salir, pin 3 para reiniciar.");
while (!interrupcionSalir) {
if (reiniciarSensor) cicloReinicio();
int position_Y = analogRead(Y);
int angulo = map(position_Y, 0, 1023, 0, 180);
servoJoystick.write(angulo);
Serial.print("Joystick Y: ");
Serial.print(position_Y);
Serial.print(" -> Angulo: ");
Serial.println(angulo);
delay(200);
}
interrupcionSalir = false;
enEjecucion = false;
Serial.println("\n[SALIDA POR INTERRUPCION]");
mostrarMenu();
}
void leerSensorGolpe() {
const int pinGolpe = 11;
const int pinBuzzer = 7;
pinMode(pinGolpe, INPUT_PULLUP);
pinMode(pinBuzzer, OUTPUT);
digitalWrite(pinBuzzer, LOW);
Serial.println(">> Sensor de Golpe activado. Boton pin 2 para salir, pin 3 para reiniciar.");
enEjecucion = true;
while (!interrupcionSalir) {
if (reiniciarSensor) cicloReinicio();
if (digitalRead(pinGolpe) == LOW) {
Serial.println("[GOLPE DETECTADO]");
digitalWrite(pinBuzzer, HIGH);
delay(200);
digitalWrite(pinBuzzer, LOW);
}
delay(50);
}
interrupcionSalir = false;
enEjecucion = false;
digitalWrite(pinBuzzer, LOW);
Serial.println("\n[SALIDA POR INTERRUPCION]");
mostrarMenu();
}
void leerTempHumedad() {
enEjecucion = true;
Serial.println(">> Sensor Temp/Humedad activado. Boton pin 2 para salir, pin 3 para reiniciar.");
while (!interrupcionSalir) {
if (reiniciarSensor) cicloReinicio();
float h = dht.readHumidity();
float t = dht.readTemperature();
Serial.print("Humedad: "); Serial.print(h); Serial.print(" % ");
Serial.print("Temperatura: "); Serial.print(t); Serial.println(" C");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: "); lcd.print(t); lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Humedad: "); lcd.print(h); lcd.print(" %");
delay(5000);
}
interrupcionSalir = false;
enEjecucion = false;
lcd.clear();
Serial.println("\n[SALIDA POR INTERRUPCION]");
mostrarMenu();
}
void leerNivelAgua() {
const int pinNivel = A1;
enEjecucion = true;
Serial.println(">> Sensor Nivel Agua activado. Boton pin 2 para salir, pin 3 para reiniciar.");
while (!interrupcionSalir) {
if (reiniciarSensor) cicloReinicio();
int valor = analogRead(pinNivel);
float porcentaje = map(valor, 0, 1023, 0, 100);
Serial.print("Nivel de Agua: "); Serial.print(porcentaje); Serial.println(" %");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Nivel de Agua:");
lcd.setCursor(0, 1);
lcd.print(porcentaje); lcd.print(" %");
delay(1000);
}
interrupcionSalir = false;
enEjecucion = false;
lcd.clear();
Serial.println("\n[SALIDA POR INTERRUPCION]");
mostrarMenu();
}
void leerSensorIR() {
int PIR = 8;
int RELE = 9;
int ESTADO = 0;
pinMode(PIR, INPUT);
pinMode(RELE, OUTPUT);
enEjecucion = true;
Serial.println(">> Sensor Infrarrojo activado. Boton pin 2 para salir, pin 3 para reiniciar.");
while (!interrupcionSalir) {
if (reiniciarSensor) cicloReinicio();
ESTADO = digitalRead(PIR);
if (ESTADO == HIGH) {
digitalWrite(RELE, HIGH);
Serial.println("[MOVIMIENTO DETECTADO]");
delay(100);
} else {
digitalWrite(RELE, LOW);
}
}
interrupcionSalir = false;
enEjecucion = false;
Serial.println("\n[SALIDA POR INTERRUPCION]");
mostrarMenu();
}
void leerUltrasonido() {
const int echoPin = 5;
const int trigPin = 6;
const int buzzerPin = 7;
long duration;
int distance;
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(buzzerPin, OUTPUT);
tone(buzzerPin, 1000, 200);
delay(300);
enEjecucion = true;
Serial.println(">> Sensor Ultrasonico activado. Boton pin 2 para salir, pin 3 para reiniciar.");
while (!interrupcionSalir) {
if (reiniciarSensor) cicloReinicio();
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2;
Serial.print("Distancia: "); Serial.print(distance); Serial.println(" cm");
if (distance > 0 && distance <= 50) {
int freq = map(distance, 1, 50, 2000, 500);
tone(buzzerPin, freq);
Serial.print("Objeto detectado! Sonando a "); Serial.print(freq); Serial.println(" Hz");
} else {
noTone(buzzerPin);
digitalWrite(buzzerPin, LOW);
}
delay(100);
}
interrupcionSalir = false;
enEjecucion = false;
noTone(buzzerPin);
digitalWrite(buzzerPin, LOW);
Serial.println("\n[SALIDA POR INTERRUPCION]");
mostrarMenu();
}