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);
}
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.
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.