int sensorLluviaPin = A0;
int motorAPin = 9;
int motorBPin = 10;
int finCarreraAbiertoPin = A5;
int finCarreraCerradoPin = A4;
int botonStartPin = 4;
int botonStopPin = 5;
int ledRojoPin = 6;
int ledVerdePin = 7;
int sensorMovimientoPin = 8;
int pirState = false;
int ledMovimientoPin = 11;
bool techoAbierto = false;
bool motorEnMovimiento = false;
void setup() {
pinMode(motorAPin, OUTPUT);
pinMode(motorBPin, OUTPUT);
pinMode(botonStartPin, INPUT_PULLUP);
pinMode(botonStopPin, INPUT_PULLUP);
pinMode(ledRojoPin, OUTPUT);
pinMode(ledVerdePin, OUTPUT);
pinMode(sensorMovimientoPin, INPUT);
pinMode(ledMovimientoPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
// Lectura sensores analogos
int valorLluvia = analogRead(sensorLluviaPin);
int finCarreraAbierto = analogRead(finCarreraAbiertoPin);
int finCarreraCerrado = analogRead(finCarreraCerradoPin);
bool start = digitalRead(botonStartPin) == LOW;
bool stop = digitalRead(botonStopPin) == LOW;
// Lectura sensor de movimiento PIR
int val = digitalRead(sensorMovimientoPin);
if (val == HIGH) {
digitalWrite(ledMovimientoPin, HIGH);
if (pirState == LOW) {
Serial.println("Movimiento detectado");
pirState = HIGH;
}
} else {
digitalWrite(ledMovimientoPin, LOW);
if (pirState == HIGH) {
Serial.println("No hay movimiento");
pirState = LOW;
}
}
// Modo automatico
if (valorLluvia < 500 && !techoAbierto && !motorEnMovimiento) {
abrirTecho();
}
if (valorLluvia > 600 && techoAbierto && !motorEnMovimiento) {
cerrarTecho();
}
// Modo manual
if (start && !motorEnMovimiento) {
if (techoAbierto) cerrarTecho();
else abrirTecho();
}
if (stop) {
pararTecho();
}
}
void abrirTecho() {
motorEnMovimiento = true;
digitalWrite(ledVerdePin, HIGH);
digitalWrite(ledRojoPin, LOW);
Serial.println("Abriendo techo");
digitalWrite(motorAPin, HIGH);
digitalWrite(motorBPin, LOW);
while (analogRead(finCarreraAbiertoPin) > 200) {
delay(100);
}
pararTecho();
techoAbierto = true;
Serial.println("Techo abierto");
}
// =======================================================
void cerrarTecho() {
motorEnMovimiento = true;
digitalWrite(ledVerdePin, LOW);
digitalWrite(ledRojoPin, HIGH);
Serial.println("Cerrando techo");
digitalWrite(motorAPin, LOW);
digitalWrite(motorBPin, HIGH);
while (analogRead(finCarreraCerradoPin) > 200) {
delay(100);
}
pararTecho();
techoAbierto = false;
Serial.println("Techo cerrado");
}
// =======================================================
void pararTecho() {
digitalWrite(motorAPin, LOW);
digitalWrite(motorBPin, LOW);
motorEnMovimiento = false;
digitalWrite(ledRojoPin, LOW);
digitalWrite(ledVerdePin, LOW);
Serial.println("Motor detenido");
}
Sensor
movimiento
Sensor
lluvia
Motor del techo
Techo
cerrado
Techo
abierto