//conexiones
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
//tiempo
#include <Time.h>
//sensor DHT
#include "DHT.h"
#define DHTPIN 5
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
String readString;
boolean leyendo;
unsigned long epoch;
int horas;
int minutos;
int segundos;
int dia;
int mes;
int anio;
unsigned int horaInicio = 0;
unsigned int horaFin = 0;
unsigned int horaActual = 0;
unsigned int minutoActual;
unsigned int minutoUltimaActivacion;
byte estadoAutomatico[7] = {2, 0, 2, 2, 2, 2, 2}; // 0 no definido, 1 encendido, 2 apagado. luz, periodo, int, ext, vent, riego, renovacion aire
byte estadoManual[5] = {2, 2, 2, 2, 2,}; // 1 encendido, 2 apagado. luz, int, ext, vent, riego
byte optoPins[5] = {66, 6, 7, 8, 9}; //66 reservado riego, 6 int, 7 luz, 8 vent, 9 ext.
float temperatura;
int humedad;
// Configuración de direccion MAC e IP.
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,108);
// Inicia las librerias Ethernet server.
EthernetServer server(1989);
unsigned int localPort = 8888; // Puerto local para escuchar UDP
//IPAddress timeServer(130, 206, 194, 254); // time.nist.gov NTP server (fallback)
IPAddress timeServer(130,206,3,166); // Red Iris Bilbao
//IPAddress timeServer(130,206,206,248); // Red Iris Madrid
const int NTP_PACKET_SIZE= 48; // La hora son los primeros 48 bytes del mensaje
byte packetBuffer[ NTP_PACKET_SIZE]; // buffer para los paquetes
EthernetUDP Udp; // Una instancia de UDP para enviar y recibir mensajes
void setup() {
Serial.begin(9600); // Inicia el puerto serie.
dht.begin(); // Inicia el Sensor
Ethernet.begin(mac, ip); // Inicia la conexión Ethernet y el servidor.
server.begin(); // Inicia el servidor
Udp.begin(localPort);
Serial.print("IP local del servidor ");
Serial.println(Ethernet.localIP());
//declaraciones de pins
digitalWrite(5, INPUT_PULLUP); //pullup para cable señal de sensor dht
for (byte i = 0;i<5; i++){
pinMode(optoPins[i], OUTPUT);
digitalWrite(optoPins[i], LOW);
}
// encendido y apgado de led para ver que se resetea la placa.
digitalWrite (optoPins[0], HIGH);
delay(2000);
digitalWrite (optoPins[0], LOW);
//funciones para sincronizar y poner en hora el reloj de arduino
hora();
setTime(horas, minutos, segundos, dia, mes, anio);
minutoUltimaActivacion = (horas*60+minutos);
}
void loop() {
//Lectura de sensor dht
humedad = dht.readHumidity();
temperatura = dht.readTemperature();
//lectura de hora via servidor
hora();
horaActual = horas;
minutoActual = (horas*60 + minutos);
Serial.println(minutoActual);
Serial.println("XXXXXXXX");
Serial.println(minutoUltimaActivacion);
//control renovacion de aire
if(estadoManual[2] == 2 && minutos % 15 == 0){ // va a ser verdadero en todas las horas en punto, y quince, y treinta, y cuarenta y cinco minutos.
if (minutoUltimaActivacion > minutoActual) { //habría que comprobar por si acaso hemos saltado de día
minutoActual+=3600; // sumamos un día a la hora
}
if (minutoActual - minutoUltimaActivacion >= 15) {
digitalWrite(optoPins[4], HIGH);
estadoAutomatico[3] == 1;
estadoAutomatico[6] == 1;
minutoUltimaActivacion=minutoActual; // reseteamos el contador
}
else if((minutoActual - minutoUltimaActivacion >= 30) && temperatura < 27.00 ){
digitalWrite(optoPins[4], LOW);
estadoAutomatico[3] = 2;
estadoAutomatico[6] = 2;
}
}
delay(1000);
/*
//control de humedad en vegetativo
if( estadoAutomatico[6] == 2 && estadoAutomatico[1] == 1 && estadoAutomatico[3] == 2 && humedad >= 85){
estadoAutomatico[3] = 1;
digitalWrite(optoPins[4], HIGH);
}
if (humedad >= 95 && estadoAutomatico[3] == 1){
estadoAutomatico[2] = 1;
digitalWrite(optoPins[1], HIGH);
}
if ( humedad <= 80 && estadoAutomatico[2] == 1){
if(estadoManual[1] == 2){
digitalWrite(optoPins[1], LOW);
estadoAutomatico[2] = 2;
}
}
if(humedad <= 75 && estadoAutomatico[3] == 1 && estadoAutomatico[6] == 2 && temperatura <= 23.00){
if(estadoManual[2] == 2){
digitalWrite(optoPins[4], LOW);
estadoAutomatico[3] = 2;
}
}
//seguridad en cultivo
if(estadoAutomatico[1] == 1 && humedad <= 70){
if(estadoManual[1] == 2 && estadoManual[2] == 2){
digitalWrite(optoPins[4], LOW);
digitalWrite(optoPins[1], LOW);
estadoAutomatico[2] = 2;
estadoAutomatico[3] = 2;
}
// digitalWrite(LedErrorHumedad, HIGH);
}else {
// digitalWrite(LedErrorHumedad, LOW);
}
//control de humedad en floracion
if( estadoAutomatico[6] == 2 && estadoAutomatico[1] == 2 && estadoAutomatico[3] == 2 && humedad >= 45){
estadoManual[2] = 1;
digitalWrite(optoPins[4], HIGH);
}
if (humedad >= 55 && estadoAutomatico[3] == 1){
estadoManual[1] = 1;
digitalWrite(optoPins[1], HIGH);
}
if ( humedad <= 45 && estadoAutomatico[2] == 1){
if(estadoManual[1] == 2){
digitalWrite(optoPins[1], LOW);
estadoAutomatico[2] = 2;
}
}
if(humedad <= 35 && estadoAutomatico[3] == 1 && estadoAutomatico[6] == 2 && temperatura <= 23.00){
if(estadoManual[2] == 2){
digitalWrite(optoPins[4], LOW);
estadoAutomatico[3] = 2;
}
}
//seguridad en cultivo
if(estadoAutomatico[1] == 2 && humedad <= 30){
if(estadoManual[1] == 2 && estadoManual[2] == 2){
digitalWrite(optoPins[4], LOW);
digitalWrite(optoPins[1], LOW);
estadoAutomatico[2] = 2;
estadoAutomatico[3] = 2;
}
// digitalWrite(LedErrorHumedad, HIGH);
}else {
// digitalWrite(LedErrorHumedad, LOW);
}
/* //control de temperatura
if(temperatura >= 25.00 && estadoAutomatico[3] == 2){
estadoAutomatico[3] = 1;
digitalWrite(optoPins[4], HIGH);
}
if (temperatura >= 27.00 && estadoAutomatico[3] == 1){
estadoAutomatico[2] = 1;
digitalWrite(optoPins[1], HIGH);
}
if ( temperatura <= 25.00 && estadoAutomatico[2] == 1){
if(estadoManual[1] == 2){
digitalWrite(optoPins[1], LOW);
estadoAutomatico[2] = 2;
}
}
if(temperatura <= 20.00 && estadoAutomatico[3] == 1 && estadoAutomatico[6] == 2){
if(estadoManual[2] == 2){
digitalWrite(optoPins[4], LOW);
estadoAutomatico[3] = 2;
}
}
// seguridad en cultivo
if(temperatura <= 18.00 ){
if(estadoManual[1] == 2 && estadoManual[2] == 2)
{
digitalWrite(optoPins[4], LOW);
digitalWrite(optoPins[1], LOW);
estadoAutomatico[2] = 2;
estadoAutomatico[3] = 2;
}
// digitalWrite(LedErrorTemperatura, HIGH);
}else {
// digitalWrite(LedErrorTemperatura, LOW);
}
*/
//control de luz
if(estadoAutomatico[1] == 2){
horaInicio = 1260; // En minuto las 21 horas para inicio
horaFin = 780; // las 13 horas del dia siguiente para fin
if(horaInicio <= horaActual && (horaFin + 3600) >= horaActual){
digitalWrite (optoPins[2], HIGH);
estadoAutomatico[0] = 1;
}
else{
digitalWrite (optoPins[2], LOW);
estadoAutomatico[0] = 2;
}
}
if(estadoAutomatico[1] == 1){
horaInicio = 1380;// las 23 horas para inicio
horaFin = 660;// las 11 horas del dia siguiente para fin
if(horaInicio <= horaActual && (horaFin + 3600)>= horaActual){
digitalWrite (optoPins[2], HIGH);
estadoAutomatico[0] = 1;
}
else{
digitalWrite (optoPins[2], LOW);
estadoAutomatico[0] = 2;
}
}