Ayuda con invernadero

Buenas tardes,

Me gustaria recibir ayuda con el siguiente problema, estoy haciendo un programa para un invernadero, el cual debe encender una bomba cuando la humedad este por debajo del 50% y apagarla cuando sea mayor al 50 % o hayan transcurrido 2 minutos, la ayuda que necesito es con el tiempo ya que no se como hacerlo

#include <TimerOne.h>
#include <LiquidCrystal.h>
#include <DHT.h>
unsigned long time;
unsigned long t=0;
int Dt;

volatile long int Time=0;
LiquidCrystal lcd (7, 6, 5, 4, 3, 2);

#define Bomba 1
#define DHTPIN A0
#define DHTTYPE DHT11 //DHT22
DHT dht(DHTPIN, DHTTYPE);

void setup() {
// put your setup code here, to run once:

lcd.begin(16, 2);
lcd.setCursor(1, 0);
lcd.print("RIEGO INVERNADERO");
pinMode(Bomba, OUTPUT);
dht.begin();
//Timer1.initialize(1000000); //Configura el TIMER en 1 Segundo
//Timer1.attachInterrupt(loop); //Configura la interrupción del Timer 1

}
void loop() {

int temp= dht.readTemperature();
int humedad = dht.readHumidity();
lcd.setCursor(0, 1);
lcd.print(">");
delay(100);
time = millis();
t=0;

if(humedad<50 && time - t< 10000 ){
digitalWrite(Bomba, HIGH);
delay(100);
}
else {
digitalWrite(Bomba, LOW);
}

//Time++;
if (humedad>50 || time - t> 10000){

//if (humedad>50 ||Time > 10) {
digitalWrite(Bomba, LOW);
delay (100);
// t = 0;
}
loop;
// if(humedad>50){
// digitalWrite(Bomba, LOW);
//delay (100);
//}
//apagar();
//if(humedad<=50){
// delay (10000);
// digitalWrite(Bomba, LOW);
// delay (10000);

//if(time - t> 10000){
//delay (10000);
//digitalWrite(Bomba, LOW);
//delay (100);
// time = millis();
//loop;

//if(time - t > Dt){

//Muestra en el LCD el valor actual de la humedad
lcd.setCursor(1, 1);
lcd.print("HUMEDAD: "+String(humedad)+" %");
lcd.setCursor(0, 1);
lcd.print(" ");
delay(80);

}
//void Temporizador(void)
//{
//Incrementa el timer
// Time++;
//Resetea el contador cuando llega a 1000 segundos
//if(Time>10){
// digitalWrite(Bomba, LOW);
//}
// Time = ;
//}
//void apagar()

Muchas gracias por la ayuda que me puedan brindar

Hola, deberías dejar solo los millis y borrar los DELAY de tu código, luego prueba.

Ya lo he hecho y no funciona, es que cuando se cumple el tiempo del millis, queda la salida apagada y no se vuelve a cumplir

sube el código para poder verlo desde algún IDE

Como lo subo??

Listo

Riego.ino (1.85 KB)

Buenas, por lo que veo en el código así en diagonal t siempre es 0 por lo que tu "time" sólo depende de los milis, si estos son más pequeños o más grandes de 10000. Por lo tanto y debido a tus condiciones siempre que milis sea mayor que 10000 será LOW y si es más pequeño depende de la humedad. Así que tu programa sólo funciona cada 49,710269629 días que es lo que tarda millis en reiniciarse.

Hay un tutorial de millis buenísimo en este mismo foro:
aquí

#include <TimerOne.h>
#include <LiquidCrystal.h>
#include <DHT.h>
unsigned long time;
unsigned long t=0;
int Dt;

volatile long int Time=0;
LiquidCrystal lcd (7, 6, 5, 4, 3, 2);

#define Bomba 1
#define DHTPIN A0
#define DHTTYPE DHT11 //DHT22
DHT dht(DHTPIN, DHTTYPE);

// datos millis
unsigned long tiempo = 100; //guarda tiempo de referencia para comparar
unsigned long interval1 = 1000; // disponible para cualquier conteo de uso
unsigned long interval2 = 900; // disponible para cualquier conteo de uso
unsigned long interval3 = 800; // disponible para cualquier conteo de uso
unsigned long tiempo1 = millis(); // iluminacion
unsigned long tiempo2 = millis(); // ventilacion
unsigned long tiempo3 = millis();

void setup() {
// put your setup code here, to run once:

lcd.begin(16, 2);
lcd.setCursor(1, 0);
lcd.print("RIEGO INVERNADERO");
pinMode(Bomba, OUTPUT);
dht.begin();
tiempo1 = millis(); //iluminacion
tiempo2 = millis(); //ventilacion
tiempo3 = millis(); //calefacion
//Timer1.initialize(1000000); //Configura el TIMER en 1 Segundo
//Timer1.attachInterrupt(loop); //Configura la interrupción del Timer 1

}
void loop() {
unsigned long currentMillis = millis();
int temp= dht.readTemperature();
int humedad = dht.readHumidity();
lcd.setCursor(0, 1);
lcd.print(">");
//delay(100);
time = millis();
t=0;

if(humedad<50 ){
digitalWrite(Bomba, HIGH);
tiempo1 = millis();
}
if (humedad>50) {
digitalWrite(Bomba, LOW);
tiempo1 = millis();
}

//Time++;
if (time - t> 10000){

//if (humedad>50 ||Time > 10) {
digitalWrite(Bomba, LOW);
tiempo2 = millis();
// t = 0;
}
// loop;
// if(humedad>50){
// digitalWrite(Bomba, LOW);
//delay (100);
//}
//apagar();
//if(humedad<=50){
// delay (10000);
// digitalWrite(Bomba, LOW);
// delay (10000);

//if(time - t> 10000){
//delay (10000);
//digitalWrite(Bomba, LOW);
//delay (100);
// time = millis();
//loop;

//if(time - t > Dt){

//Muestra en el LCD el valor actual de la humedad
lcd.setCursor(1, 1);
lcd.print("HUMEDAD: "+String(humedad)+" %");
lcd.setCursor(0, 1);
lcd.print(" ");
// delay(80);

}
//void Temporizador(void)
//{
//Incrementa el timer
// Time++;
//Resetea el contador cuando llega a 1000 segundos
//if(Time>10){
// digitalWrite(Bomba, LOW);
//}
// Time = ;
//}
//void apagar()

Por favor, lee las normas del foro ,sobre todo como postear codigo correctamente y como elegir un titulo adecuado y modificalo para adecuarlo a dichas normas .Gracias

#include <TimerOne.h>
#include <LiquidCrystal.h>
#include <DHT.h>
unsigned long time;
unsigned long t=0;
int Dt;

volatile long int Time=0;
LiquidCrystal lcd (7, 6, 5, 4, 3, 2);



#define Bomba 1
#define DHTPIN A0
#define DHTTYPE DHT11 //DHT22
DHT dht(DHTPIN, DHTTYPE);


// datos millis
 unsigned long tiempo = 100; //guarda tiempo de referencia para comparar
 unsigned long interval1 = 1000; // disponible para cualquier conteo de uso
 unsigned long interval2 = 900; // disponible para cualquier conteo de uso
 unsigned long interval3 = 800; // disponible para cualquier conteo de uso
 unsigned long  tiempo1 = millis();   // iluminacion
 unsigned long  tiempo2 = millis();   // ventilacion
 unsigned long  tiempo3 = millis();
 
void setup() {
  // put your setup code here, to run once:
 
 
  lcd.begin(16, 2);
  lcd.setCursor(1, 0);
  lcd.print("RIEGO INVERNADERO");
  pinMode(Bomba, OUTPUT);
  dht.begin();
  tiempo1 = millis();    //iluminacion
 tiempo2 = millis();    //ventilacion
 tiempo3 = millis();    //calefacion
//Timer1.initialize(1000000);      //Configura el TIMER en 1 Segundo
//Timer1.attachInterrupt(loop); //Configura la interrupción del Timer 1
 
}
void loop() {
  unsigned long currentMillis = millis();
  int temp= dht.readTemperature();
  int humedad = dht.readHumidity();
  lcd.setCursor(0, 1);
  lcd.print(">");
  //delay(100);
  time = millis();
  t=0;
 
  if(humedad<50 ){
    digitalWrite(Bomba, HIGH);
tiempo1 = millis();
}
    if (humedad>50) {
    digitalWrite(Bomba, LOW);
    tiempo1 = millis();
    }
 
//Time++;
 if (time - t>  10000){
 
//if (humedad>50 ||Time >  10) {
     digitalWrite(Bomba, LOW);
    tiempo2 = millis();
  //   t = 0;
  }
 // loop;
 // if(humedad>50){
   //  digitalWrite(Bomba, LOW);
    //delay (100);
    //}
//apagar();
//if(humedad<=50){
 // delay (10000);
  //  digitalWrite(Bomba, LOW);
   // delay (10000);
   

//if(time - t>  10000){
  //delay (10000);
  //digitalWrite(Bomba, LOW);
  //delay (100);
// time = millis();
//loop;

 


//if(time - t >  Dt){




//Muestra en el LCD el valor actual de la humedad
   lcd.setCursor(1, 1);
   lcd.print("HUMEDAD: "+String(humedad)+" %");
   lcd.setCursor(0, 1);
   lcd.print(" ");
   // delay(80);

}
//void Temporizador(void)
//{
  //Incrementa el timer
 // Time++;
  //Resetea el contador cuando llega a 1000 segundos
  //if(Time>10){
  //  digitalWrite(Bomba, LOW);
  //}
   // Time = ;
  //}
//void apagar()

Si, sigue las normas y pon el código algo así. Y además podías evitarnos tanta línea comentada, cuesta ver el código bueno. Los cambios que hiciste no sirven de nada, t siempre sigo siendo 0 y no veo la utilidad de tiempo1 y tiempo2

amigo como te fue con el código que mas necesitas?