Entrelazar 5 funciones en el tiempo

Primero que todo, buenas noches. necesito de sus conocimientos para solucionar un problema de código, ya llevo varios días tratando de solucionarlo pero no fui capaz. cualquier guía será de mucha ayuda, les explicare de que se trata el proyecto y el funcionamiento:
El proyecto es automatizar una pecera; el funcionamiento es el siguiente:
consta de una cascada (motor) se enciende 5 (mañana) y se apaga 21:15 (noche), tiene un respaldo de una bombita que con la señal de un sensor se enciende (el sensor es de nivel) , el esta pendiente del nivel de la cascada ;si el se queda sin agua o baja el nivel el sensor manda la señal pero antes de encender espera 5 segundos para encender el motor ,luego que se encienda funciona 20 segundos, también tiene una lampara que se enciende tipo 9.30 ( mañana ) y se apaga a las 18 (noche). además tiene un pulsador stop que es pin 13 esta externamente colocado en pull_down , y los otros 2 están directos al Arduino que son uno para pagar las dos bombas independientes del programa y el otro lo deje por si se necesita para salir del stop. el circuito esta conformado por un Arduino uno R3,rtc 3231, todas las señales de salida (output) deben de ser en low para encender los relé 5v.
espero haberme echo entender, voy a mostrar el código que trate de hacer. muchas gracias...`

#include "RTClib.h"
#include <Wire.h>
#include <Adafruit_SSD1306.h>



#define SCREEN_WIDTH 70         // ancho pantalla OLED
#define SCREEN_HEIGHT 40         // alto pantalla OLED
#define OLED_RESET     -1        // Reset pin # (or -1 if sharing Arduino reset pin)


Adafruit_SSD1306 display(OLED_RESET); 



RTC_DS3231 rtc;

 #define rele_1_ON 0
 #define rele_1_OFF 1

 #define rele_2_ON 0
 #define rele_2_OFF 1

 #define rele_3_ON 0
 #define rele_3_OFF 1

 #define rele_4_ON 0
 #define rele_4_OFF 1

 #define STOP_ON 1
 #define STOP_OFF 0
//
  

//

  int RELE_1 = 2;  // BOMBA //
  int RELE_2 = 4;  // LAMPARA //
  int RELE_3 = 6; // BOMBA_SENSOR //
  int RELE_4 = 8;
  int SENSOR =12;  // SENROR//
  int stop = 10 ;
  
  
  void setup() {

  Serial.begin(9600);
 
  delay(3000);

  Serial.println("Iniciando pantalla OLED");
  
  display.begin(SSD1306_SWITCHCAPVCC,0x3C);
  display.clearDisplay(); 

  display.setTextSize(1,1);
  display.setTextColor(WHITE);

  //pinMode(stop, INPUT_PULLUP);
  //pinMode(star,INPUT);
 
 pinMode(SENSOR, INPUT);
  
 pinMode(RELE_1, OUTPUT);
 pinMode(RELE_2,OUTPUT);
 
 pinMode(RELE_3, OUTPUT);
 pinMode(RELE_4, OUTPUT);
 pinMode(10,INPUT_PULLUP);/// STOP//
 
    rtc.begin(); 
    Wire.begin();
   if (!rtc.begin()) {
    Serial.println("No encontrado RTC");
    Serial.flush();
    while (1) delay(10);
  }

  Serial.println("Configurando la fecha y hora Actual");
  Serial.print("Fecha: ");
  Serial.println(F(__DATE__));
  Serial.print("Hora: ");
  Serial.println(F(__TIME__));


  Serial.println();


  
 //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

 
  
}

   void loop(){
  
    
    


  DateTime tiempo = rtc.now();


  display.setCursor(21,11);
  
  display.println("Fecha \t" + tiempo.timestamp(DateTime::TIMESTAMP_DATE));
  display.setCursor(30,20); 
  display.println("Hora \t" + tiempo.timestamp(DateTime::TIMESTAMP_TIME));
  
  display.println();

  delay(1000);

  DateTime now = rtc.now();

     //display.setCursor(22,11);
    //display.print(DiaSemana[now.dayOfWeek()]);
    //display.print(' ');
   // display.print(now.date(), DEC);
    display.print('/');
    display.print(now.month(), DEC);
    display.print('/');
    display.print(now.year(), DEC);
    display.print('/');
    //display.setCursor(30,22);
    display.print(now.hour(), DEC);
    display.print(':');
    display.print(now.minute(), DEC);
    display.print(':');
    display.print(now.second(), DEC); 
    delay(1000);
   display.display(); 
  display.setCursor(28,1);             //Ubicamos el cursor en posicion 0 LCD primera linea
   display.print("TEMPORIZANDO");
   display.display();
   delay(1000);
   display.clearDisplay(); 

   delay(1000);


  estadoactual = digitalRead(SENSOR);

 if (estadoactual && !estadoanterior) {tACTUAL=millis();
 }

 estadoactual = estadoanterior;

 if (millis()-tACTUAL < 5000UL ) {
 if (!digitalRead(SENSOR)) {digitalWrite(RELE_3, rele_3_ON);

  Serial.print ("___Bomba_Sensor encendido");
 
     }
 }
        
          

      if (now.hour()>=9 && now.minute()>=30 && now.hour()<18 && now.minute()<=01 ){
          digitalWrite(RELE_2, rele_2_ON);
          Serial.print ("____luz encendida");
          
         }

         else if  (now.hour()>=18  && now.hour()<9 ){
          digitalWrite(RELE_2, rele_2_OFF);
          Serial.print ("____luz Apagada");
         }

         
            

         if (now.hour()>=5 && now.minute()>=01 && now.hour()<22 && now.minute()<=10 ){
            digitalWrite(RELE_1, rele_1_ON);
            Serial.print ("____Bomba encendida");
            
 
          }
          
            if (now.hour()>=5 && now.minute()>=01 && now.hour()<22 && now.minute()<=10 ){
            digitalWrite(RELE_1, rele_1_OFF);
            Serial.print ("____Bomba apagada ");
          
           if (stop = 0 ){
           Serial.println(" PAR0 DE EMERGENCIA ");
           delay(500);
            digitalWrite(RELE_1, rele_1_OFF);
            Serial.print ("____Bomba apagada___EMERG");
           display.setCursor(28,1);             //Ubicamos el cursor en posicion 0 LCD primera linea
           display.print("STOP");
           display.display();
           delay(1000);
           display.clearDisplay(); 

          delay(3000);

           
          }

          }
          

Moderador
Titulo corregido de acuerdo al punto 5 de las normas.
No usar palabras inútiles como "Ayuda ..."

You have posted in an English-only forum section. Please take more care in future when you post. I will move your post for you.

Cómo describirías el problema?

Moderador
Cuando postees un código usa el Auto Formato del IDE,
Herramientas -> Auto Formato o directamente CTRL+T
eso ayuda a visualizar mejor lo que presentas.

Tu código tiene muchos errores.

ky-040-counter.ino: In function 'void loop()':
ky-040-counter.ino:101:3: error: 'estadoactual' was not declared in this scope
   estadoactual = digitalRead(SENSOR);
   ^~~~~~~~~~~~
ky-040-counter.ino:103:24: error: 'estadoanterior' was not declared in this scope
   if (estadoactual && !estadoanterior) {
                        ^~~~~~~~~~~~~~
ky-040-counter.ino:104:5: error: 'tACTUAL' was not declared in this scope
     tACTUAL = millis();
     ^~~~~~~
ky-040-counter.ino:106:18: error: 'estadoanterior' was not declared in this scope
   estadoactual = estadoanterior;
                  ^~~~~~~~~~~~~~
ky-040-counter.ino:107:18: error: 'tACTUAL' was not declared in this scope
   if (millis() - tACTUAL < 5000UL ) {
                  ^~~~~~~

Error during build: exit status 1

estadoactual, estadoanterior
tACTUAL, no estan definidos.

todo se soluciona con esto

unsigned long estadoactual, estadoanterior, tactual;

pero se supone que pones un código mas o menos funcional.

Otra cuestión es como explicas las cosas, realmente poco claro.
Cuando expliques algo toma una tarea y distínguela de la otra y agrega sus características para que entendamos mejor y más rápido.

Ejemplo:

  1. Cascada enciende a las 5:00 y apaga 21:15 luego en tu código pones las 22:10.
    La bomba que mantiene el nivel de la cascada se acciona con una demora de 5 segundos cuando el sensor de nivel así lo determine, y lo hace por 20 segundos.
  2. la lámpara se enciende 9:30 y se apaga a laso 18:00. En formato 24 hs no hace falta decir mañana o tarde/noche.
  3. Tiene un pulsador Stop o detener que estás en el pin 13 esta externamente colocado en pull_down
  4. Un pulsador apaga las dos bombas independientes del programa
  5. Pulsador de emergencia para salir del Stop

Mucho mas simple de leer, no?

Y faltó también decir que lleva una pantalla OLED donde se muestra ¿timestamp? entre otras cosas.

¿Para qué el/la timestamp? :thinking:

Yo me puse a reescribir el código y luego lo perdí por error.
Listo. Si encuentro ganas lo vuelvo a intentar.

Entiendo, si lleva una pantalla oled. Disculpa por tantos errores. Hace rato que no trabajaba en estos proyectos, ya que lo que estoy haciendo es solo un hobby.

Gracias por tomarse el tiempo, yo igual estoy trabajando en las correcciones. Pero cuando puedas y si lo encuentras te lo agradecería. Feliz día

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.