Muy buenas a todos!, sé que hay varias programaciones de riego automático pero lo que yo propongo creo que nadie lo ha subido y es que soy un poco novato en la programación de arduino, consiste en un riego automátizado con un RTC (sin sensor de humedad, sólo que se active a X horas y se desactive a X horas a través del RTC), con las variables de un PIR y un mando IR, os cuento como quisiera hacerlo haber si alguien puede echarme una mano: el riego se activa por ejemplo lunes, miercoles y viernes a una hora determinada, pero si al huerto donde tengo las plantas entra un animal (tengo inquilinos gatunos jejeje) lo detecte el PIR y me active un aspersor para auyentarlo, y la variable tambien del mando IR que si yo quiero entrar a mi huerto, poder desactivarlo/activarlo desde dentro de casa para no mojarme yo mismo con dicho mando.
Tengo las programaciones por separado: - Programación para activar/desactivar un relé mediante el RTC
Programación del PIR que mientras esté detectando mantenga una salida activada
Programación del mando IR funcionando perfectamente
Pero lo que no sé es digamos "mezclar las 3 programaciones" para que interactúen como he dicho, lo he intentado pero nada... error de compilación.
Muchísimas gracias de antemano y perdonad el tostón jejeje
#include <Wire.h>
#include "RTClib.h"
const int outputPin = LED_BUILTIN;
bool state = false;
// RTC_DS1307 rtc;
RTC_DS3231 rtc;
void setup() {
Serial.begin(9600);
delay(1000);
if (!rtc.begin()) {
Serial.println(F("Couldn't find RTC"));
while (1);
}
if (rtc.lostPower()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
// Comprobar si esta programado el encendido
bool isScheduledON(DateTime date)
{
int weekDay = date.dayOfTheWeek();
float hours = date.hour() + date.minute() / 60.0;
// De 09:30 a 11:30 y de 21:00 a 23:00
bool hourCondition = (hours > 09.30 && hours < 11.30) || (hours > 21.00 && hours < 23.00);
// Miercoles, Viernes, o Sabado
bool dayCondition = (weekDay == 3 || weekDay == 6 || weekDay == 0);
if (hourCondition && dayCondition)
{
return true;
}
return false;
}
void loop() {
DateTime now = rtc.now();
if (state == false && isScheduledON(now)) // Apagado y debería estar encendido
{
digitalWrite(outputPin, HIGH);
state = true;
Serial.print("Activado");
}
else if (state == true && !isScheduledON(now)) // Encendido y deberia estar apagado
{
digitalWrite(outputPin, LOW);
state = false;
Serial.print("Desactivar");
}
delay(3000);
}
PIR:
int ledPin = 12; // declaramos el led en el pin 12 del arduino
int sensorPin=11; // declaramos el sensor PIR en el pin 11
int val = 0; //variable para asignar la lectura del sensor PIR
void setup()
{
pinMode(ledPin, OUTPUT); //El pin 12 del arduino lo asignamos como salida para el led
pinMode(sensorPin, INPUT); //El pin 11 lo asignamos como entrada para la señal del sensor
Serial.begin(9600);
for(int i = 0; i < 30; i++) //Utilizamos un for para calibrar el sensor depende del tipo de sensor que utilicemos va a cambiar el tiempo de calibración
{
delay(1000);
}
delay(50);
}
void loop()
{
val = digitalRead(sensorPin); //Lee el valor de la variable (val)
if (val == HIGH) //Si detecta que hay movimiento manda activar el led que hay conectado en el pin 12 del arduino
{
digitalWrite(ledPin, HIGH);
}
else //Si la condición anterior no se cumple manda apagar el led
{
digitalWrite(ledPin, LOW);
}
}
Mando IR:
#include <Arduino.h>
#include <NECIRrcv.h>
#define IRPIN 8 // pin that IR detector is connected to
int led = 7;
static int aux = 1;
NECIRrcv ir(IRPIN) ;
void setup()
{
pinMode(led, OUTPUT);
ir.begin() ;
}
void loop()
{
unsigned long ircode ;
while (ir.available()) {
ircode = ir.read() ;
if(ircode == 4077715200){ /*en nuestro caso, corresponde con el botón encendido/apagado del mando, nº 1 del mando/
if(aux == 0){
digitalWrite(led, LOW);
aux = 1;
}
else{
digitalWrite(led, HIGH);
aux = 0;
}
}
}
}
Y cual es el proyecto?
Es una consulta para que te junten 3 códigos. Algo para software no para proyectos.
guia facil para que lo soluciones tu:
Toma el código mas grande y usalo como base.
Luego elige el primero a integrar y velo de este modo.
Todo lo que este por enecima de setup debe repetirse en el código base.
Si hay cosas repetidas en setup entonces no las pongo. ejemplo : si ya defini elpuerto serie no lo hago dos veces.
lo mismo hago con Loop.
repito 2. para el 3er código.
Te recomiendo que minimices el uso de delay porque de lo contrario hasta que no termine de cumplirse cada delay tu te estaras mojando antes de que reconozca el comando IR.
Primeramente pedir disculpas porque creia que este hilo iría en proyectos, y segundo muchas gracias por la explicación, está muy bien explicado, voy a intentarlo cogiendo como base la programación del RTC que es la más larga, te voy contando si no pudiera hacer algo, muchas gracias por contestar surbyte.