He montado un proyecto de un sistema de riego automático con un fotosensor LDR, un módulo de medición de temperatura ambiente y humedad, un sensor de la humedad en el suelo con 2 antenas de TV y una minibomba de agua para acuario.
Mi objetivo que placa Arduino consuma lo menos posible. Alimento la placa Arduino Rev Uno con una pila de 3,7V y 6000 mAh (según el fabricante). Para recargar la pila de 3,7V he usado un panel solar, un regulador de carga y un regulador de voltaje y un módulo que evita que la pila 3,7V se dañe por defecto o exceso de carga.
He leido que delay incrementa bastante el consumo de recursos de la placa y que es mejordelayMicroseconds(). Otra opción sería la funcion millis. Pero me ha interesado especialmente el modo sleep
Otro problema que tengo es que la bomba de agua riega en exceso. ¿Se puede poner un delay por varias horas entre el primer y el segundo riego? No quiero usar un módulo de reloj, es añadir mas elementos al proyecto y no me gusta esa idea. ¿Algún consejo o idea?
Les dejo el código para que lo vean:
/* SISTEMA DE RIEGO AUTOMÁTICO CON SENSOR DE HUMEDAD DE SUELO, SENSOR
DE HUMEDAD DE AIRE, SENSOR DE LUZ Y SENSOR DE NIVEL DE LÍQUIDOS */
#include <SimpleDHT.h>
// Librería <SimpleDHT.h> del sensor de temperatura y humedad relativa
#include <SPI.h>
//Librería <SPI.h> del motor DC compatible con la minibomba de agua DC
#define humidity_sensor_pin A0
//Se define variable del sensor de humedad en el suelo en el pin A0
#define ldr_pin A5
//Defino variable del sensor de fotoresistencia LDR en el pin A5
// for DHT11,
// VCC: 5V or 3V
// GND: GND
// DATA: 2
int pinDHT11 = 2;
// Se declara la variable pinDHT11 y lo asocio al pin 2
SimpleDHT11 dht11;
int ldr_value = 0;
//Se declara la variable ldr_value (fotoresistencia) y
int water_pump_pin = 3;
//Se declara la variable mini bomba de agua y lo asocio al pin 3
int water_pump_speed = 255;
//Velocidad de la minibomba de agua oscila entre 100 como mínimo y 255 como máximo. Yo he //elegido 255 pero ustedes pueden elegir la que estimen conveniente. A más velocidad, mayor //bombeo de agua
int pin_water_sensor = 13;
void setup() {
Serial.begin(9600);
pinMode(pin_water_sensor, INPUT);
}
void loop() {
// start working...
// Mide la temperatura y humedad relativa y muestra resultado
Serial.println("*******************************");
Serial.println("Sample DHT11...");
// read with raw sample data.
byte temperature = 0;
byte humidity_in_air = 0;
byte data[40] = {0};
if (dht11.read(pinDHT11, &temperature, &humidity_in_air, data)) {
Serial.print("Read DHT11 failed");
return;
}
Serial.print("Sample RAW Bits: ");
for (int i = 0; i < 40; i++) {
Serial.print((int)data[i]);
if (i > 0 && ((i + 1) % 4) == 0) {
Serial.print(' ');
}
}
Serial.println("");
Serial.print("Sample OK: ");
Serial.print("Temperature: ");Serial.print((int)temperature); Serial.print(" *C, ");
Serial.print("Relative humidity in air: ");Serial.print((int)humidity_in_air); Serial.println(" %");
// DHT11 sampling rate is 1HZ.
// Ground humidity value in %
// Mide la humedad en el suelo en % y muestra el resultado
int ground_humidity_value = map(analogRead(humidity_sensor_pin), 0, 1023, 100, 0);
Serial.print("Ground humidity: ");
Serial.print(ground_humidity_value);
Serial.println("%");
// Light value in %
// Mide la luminosidad en % y muestra el resultado
int ldr_value = map(analogRead(ldr_pin), 1023, 0, 100, 0);
Serial.print("Light: ");
Serial.print(ldr_value);
Serial.println("%");
Serial.println("*******************************");
int estado = digitalRead(pin_water_sensor);
Serial.print("Estado sensor: ");
Serial.println(estado);
switch(estado) {
case 0: // Hay agua en el depósito
//**************************************************************
// Condiciones de riego
// Si la humedad en el suelo es igual o inferior al 50%, si la luminosidad es inferior al 30%,
// Si la temperatura es inferior al 30%, entonces el sistema de riego riega.
// En caso de que no se cumpla alguno o ninguno de los 3 requisitos anteriores,
// el sistema de riego no riega
//**************************************************************
if( ground_humidity_value <= 50 && ldr_value < 30 && temperature < 30) {
digitalWrite(water_pump_pin, HIGH);
Serial.println("Irrigate");
analogWrite(water_pump_pin, water_pump_speed);
}
//El motor de la bomba de agua arranca con la velocidad elegida anteriormente en el código
else{
digitalWrite(water_pump_pin, LOW);
Serial.println("Do not irrigate");
//El motor de la bomba de agua se para y no riega
}
break;
case 1: // No hay agua en el depósito
digitalWrite(water_pump_pin, LOW);
Serial.println("NO WATER");
break;
}
delayMicroseconds (50);
}
Gracias por contestar.