-
Notifications
You must be signed in to change notification settings - Fork 0
/
codigo.ino
132 lines (103 loc) · 4.55 KB
/
codigo.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include "DHT.h"
#define LEDSTATUS 5 // led de status conectado al pin digital D1 (GPIO5)
#define PINTEMPERATURA 4 // sensor de temperatura conectado al pin digital D2 (GPIO4)
#define PINBOMBA 12 // bomba de agua conectada al pin digital D6 (GPIO12)
#define PINHUMEDAD 0 // sensor de humedad conectado al pin analógico A0
#define INTERVALO 60 // intervalo entre mediciones cuando NO hay que regar (segundos)
#define CONSTANTECAUDAL 50 // constante experimental según la potencia de la bomba y la superficie de riego
#define CONSTANTEABSORCION 10 // constante experimental según el tamaño de la maceta y la evapotranspiración de la planta
DHT dht(PINTEMPERATURA, DHT22); // inicializo sensor de temperatura ambiente
const int humedadAire = 840; // valor de humedad calibrado en aire
const int humedadAgua = 470; // valor de humedad calibrado en agua
int rangoHumedad = humedadAire - humedadAgua; // rango de humedad calibrado
float temperaturaMedida = 0;
int humedadMedida = 0; // valor medido de resistividad, inversamente proporcional a la humedad absoluta
int humedadMedidaAbsoluta = 0; // valor medido de humedad absoluta
int humedadMedidaRelativa = 0; // valor medido de humedad relativa (porcentaje entre humedadAire y humedadAgua)
int humedadDeseadaRelativa = 80; // valor esperado de humedad en % siendo 0% = seco (humedadAire) y 100% = humedadAgua)
int diferenciaHumedad = 0; // valor de error entre humedad medida y humedad deseada
int proximaMedicion = 0;
int duracionBomba = 0;
void esperarTiempo(int tiempo){
Serial.print("Esperando por ");
Serial.print(tiempo);
Serial.print(" segundos hasta la próxima medición...");
int tiempoTranscurrido = 0;
while (tiempoTranscurrido < tiempo){
Serial.print(".");
delay(1000);
tiempoTranscurrido++;
}
}
void setup() {
pinMode(LEDSTATUS, OUTPUT);
pinMode(PINTEMPERATURA, INPUT);
pinMode(PINBOMBA, OUTPUT);
Serial.begin(9600); // abro puerto serial con tasa 9600 bps
Serial.println("");
Serial.println("");
Serial.println(" << Sistema de Riego >> ");
Serial.println(" Teoría de Control - UTN - FRBA ");
Serial.println("Nahuel Oyhanarte <[email protected]>");
Serial.println("Hernán Domingo <[email protected]>");
Serial.println("Rodrigo De Luca <[email protected]>");
Serial.println("Juan Manuel Constenla <[email protected]>");
Serial.println("");
dht.begin();
delay(2000);
}
void loop() {
Serial.println("");
digitalWrite(LEDSTATUS, HIGH);
// mido temperatura ambiente
temperaturaMedida = dht.readTemperature();
// registro temperatura ambiente
if (!isnan(temperaturaMedida)) {
Serial.print(F("Temperatura: "));
Serial.print(temperaturaMedida);
Serial.println(F("°C"));
} else {
Serial.println(F("Error al leer del sensor de temperatura."));
temperaturaMedida = 20; // valor default en caso de error de medición
}
// mido humedad en suelo
humedadMedida = analogRead(PINHUMEDAD);
humedadMedidaAbsoluta = 1023 - humedadMedida;
humedadMedidaRelativa = (humedadMedidaAbsoluta - (1023 - humedadAire)) * 100 / rangoHumedad;
// registro humedad en suelo
Serial.print("Humedad medida absoluta: ");
Serial.println(humedadMedidaAbsoluta);
Serial.print("Humedad medida relativa: ");
Serial.println(humedadMedidaRelativa);
Serial.print("Humedad deseada relativa: ");
Serial.println(humedadDeseadaRelativa);
// calculo señal de error
diferenciaHumedad = humedadDeseadaRelativa - humedadMedidaRelativa;
if (diferenciaHumedad > 0) {
Serial.println("Indicación: Hay q regar!");
// calculo duración de accionamiento de la bomba (segundos)
duracionBomba = diferenciaHumedad * temperaturaMedida / CONSTANTECAUDAL;
// activo la bomba (delay requiere milisegundos)
Serial.print("Regando por ");
Serial.print(duracionBomba);
Serial.print(" segundos...");
digitalWrite(PINBOMBA, HIGH);
int tiempoRegado = 0;
while (tiempoRegado < duracionBomba){
Serial.print(".");
delay(1000);
tiempoRegado++;
}
Serial.println("");
digitalWrite(PINBOMBA, LOW);
// calculo tiempo hasta la próxima medición
proximaMedicion = duracionBomba * CONSTANTEABSORCION;
// espero hasta la próxima medición (delay requiere milisegundos)
esperarTiempo(proximaMedicion);
} else {
Serial.println("Indicación: NO hay que regar.");
// espero intervalo pre-seteado antes de volver a chequear (delay requiere milisegundos)
esperarTiempo(INTERVALO);
}
Serial.println("");
}