Controlar bomba de agua y ventilador

Buenas noches!

Estoy a punto de :o ... un estrés al 1000%.... tenemos un proyecto con un grupo de estudiantes el cual tengo que controlar una bomba de agua y un ventilador a la vez.

Necesitamos que el ventilador prenda en diferentes momentos del vídeo al igual que la bomba de agua.

Abajo dejo la programación que realizamos. No podemos hacer que el ventilador y la bomba inicien apagados, y que a los 35 segundos prenda el ventilador por 15 segundos, luego apague...y así todo el resto.

Código:

int vent= 2;
int bom = 3;

void setup(){

 pinMode(2, OUTPUT);
 pinMode(3, OUTPUT);
 
}

void loop(){
 digitalWrite(3,LOW); 
 delay(20000);      
 delay(20000);  
 delay(20000);
 delay(20000);
 delay(7000); 
 
 digitalWrite(2,LOW);  
 delay(20000);       
 delay(15000);       // apagado x 35 seg.
 digitalWrite(2,HIGH); //
 delay(15000);         // a los 2 segundos se apaga el ventilador . Video: 0.50
 digitalWrite(2,LOW);  // apaga
 delay(25000);         // Video: 1.15

 digitalWrite(2,HIGH); // 
 delay(11000);         // a los 11 segundos se apaga el ventilador -
 digitalWrite(2,LOW);  // apaga - Video: 1.27
 
 digitalWrite(3,HIGH); // prende al 1.27 minuto la bomba
 delay(3000);          // a los 3 segundos se apaga el ventilador
 digitalWrite(3,LOW);  // apaga - Video: 1.30
 delay(20000);
 delay(20000);
 delay(20000);
 delay(16000);         // apaga - Video: 2.46
 
 digitalWrite(3,HIGH); // prende al 2.46 minuto la bomba
 delay(3000);          // a los 3 segundos se apaga el ventilador
 digitalWrite(3,LOW);  // apaga - Video: 2.49
 
 
 digitalWrite(2,HIGH);  // prende ventilador al 3.22
 delay(20000);        // Ventilador prendido - Video: 3.43
 digitalWrite(2,LOW);
 delay(7000);
 
 digitalWrite(2,HIGH); // prende ventilador al 3.50
 delay(8000);         // a los 2 segundos se apaga el ventilador
 digitalWrite(2,LOW);
  
  
}

Ésto es lo que necesito que pase....

Bomba (3)

  • Prende al 1,27 segundos por 3.
  • Prende al 2.46 segundos por 3.

Ventilador (2)

  • Prende al 0.35 segundos por 15.
  • Prende al 1.15 segundos por 11.
  • Prende al 3.22 segundos por 20.
  • Prende al 3.50 segundos por 8.

AYUDAAAAAAAAAAAaaaaaaaaaaaaaaaaaaaaaaa :slight_smile:

Saludos, desde Uruguay

Parque_Zorrilla.ino (1.32 KB)

que significa

Prende al 1,27 segundos por 3.

3 veces a 1.27 segundos?

Nota: por lo visto tu stress te ha imposibilitado leer las normas del foro y publicar debidamente tu código.
Por favor tomate 5 minutos para publicarlo debidamente. Asi que edita tu post inicial y permite que se vea lo que han hecho hasta ahora.
Yo como no veo nada no responde hasta que se cumplan las normas.

Prende al minuto 1.27 segundos por 3 segundos y luego apaga.

Tu error esta en usar delay().
Si hubieras leido un poco de los temas de este foro verás qeu siempre se dice que no hay que usar delay() porque te genera mas problemas que soluciones.
Si haces algo y le pones un delay(tiempo) durante ese tiempo el Arduino no hará nada.
Pero si en cambio usas millis() podrás hacer cosas aparentemente simultáneas.

Te invito a que leas en la sección Documentación => Indice de temas tutoriales => millis()

También deberías aprender sobre las máquinas de estado.
Estas permiten que se vayan cumpliendo tareas paso a paso.. aunque los pasos pueden ser de pocos milisegundos o muchos.

Asi que usando una máquina de estados y millis() vas cumpliendo tus tareas y cada estado llama al siguiente y solo cuando se cumple algo, se pasa al próximo.

Por ejemplo podrias hacer una máquina para la bomba y otra para el ventilador y esto no interferirá entre ambos.
Te haré la máquina para la bomba y tu crea el del ventilador.

Bomba (3)

  • Prende al 1,27 segundos por 3 seg off
  • Prende al 2.46 segundos por 3 seg off

Como son segundos si pasas 1.27 seg a milisegundos solo multiplicas x 1000 = 1270 mseg

voy a dejar las cuestiones del código que no me interesan y solo mostraré la definición de variables globales y parte del loop que involucra la maquina de estados para la bomba

// defino variables globales

const byte bombaPin = 3;             // usa el pin que gustes. Nunca uses valores fijos, usa etiquetas
unsigned long start_bomba;          // esta es la variable que controlara los tiempos de la boma
byte estadoBomba 0;                    // variable que controla los estados de la bomba.
// en el loop

    switch(estadoBomba) {
          case 0: // primer estado de la bomba
                      digitalWrite(bombaPin, LOW);  // Ojo con esto. si usas un rele, debe ser LOW (invertido)
                      estadoBomba = 1;
                      start = millis();
                      break;
          case 1: if (millis() - start > 1270UL) {   // Encendida x 1270 milseg
                      digitalWrite(bombaPin, HIGH);
                      estadoBomba = 2;
                      start = millis();
                      break;
          case 2: if (millis() - start > 3000UL) {   // apagada x 3000 mseg
                      digitalWrite(bombaPin, LOW);
                      estadoBomba = 3;
                      start = millis();
                      break;
          case 3: if (millis() - start > 2460UL) {   // apagada x 3000 mseg
                      digitalWrite(bombaPin, HIGH);
                      estadoBomba = 4;
                      start = millis();
                      break;
          case 4: if (millis() - start > 3000UL) {   // apagada x 3000 mseg
                      estadoBomba = 0;
                      break;
    }

Si usas un RELE un LOW activa la salida y un HIGH lo desactiva por eso luce como aparentemente mal pero esta bien.

Eso hará que la bomba repita un ciclo como el que has descripto una y otra vez.

Primero gracias por la información. Segundo, si estoy en un foro es porque obviamente estoy aprendiendo.

No siempre se tiene el tiempo para todo. Entiendo que tengan que decirlo pero a veces está bueno ponerse en el lugar del otro.

Gracias!