Pages: [1]   Go Down
Author Topic: Cómo aplicar temporizaciones diferentes a varias salidas?  (Read 453 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

¿Cómo puedo aplicar temporizaciones diferentes para varias salidas? Por ejemplo que la salida 5 se deconecte a los 2 segundos, la salida 6 a los 5 segundos y la 7 a los 10 segundos.
¿Cómo puedo hacer para que el rele1 (4) se desactive a los 2 segundos, sin afectar al resto del bucle, en el siguiente programa?:


int pulsador1=2; // asigna el pin 2 para el pulsador1
int pulsador2=3; // asigna el pin 3 para el pulsador2
int rele1=4; // asigna el pin 4 para el relé1
int rele2=5; // asigna el pin 5 para el relé2
int rele3=6; // asigna el pin 5 para el relé3
int p1=0; // variable para el estado de pulsador1
int p2=0; // variable para el estado de pulsador2
int inicio=0; // variable para el inicio del programa

void setup () {
  pinMode (rele1, OUTPUT); // declara el rele1 como salida
  pinMode (rele2, OUTPUT); // declara el rele2 como salida
  pinMode (rele3, OUTPUT); // declara el rele3 como salida
  pinMode(pulsador1, INPUT); // declara el pulsadir1 como entrada
  pinMode(pulsador2, INPUT); // declara el pulsadir2 como entrada
  }

void loop () {
  p1=digitalRead (pulsador1); // lee valor de la entrada
  p2=digitalRead (pulsador2); // lee valor de la entrada
  for(int i=0; i<35; i=i+1) { // crea un bucle de 35 ciclos
    if (p1==1 || p2==1) { // si están activos p1 o p2
      inicio=1; // activa la variable para el inicio del programa
      }
  if(inicio==1){
    digitalWrite (rele1, LOW); // desactiva el relé1
    digitalWrite (rele2, LOW); // desactiva el relé2
    digitalWrite (rele3, LOW); // desactiva el relé3
    delay(180); //esperamos 0.18 segundos
    digitalWrite (rele2, HIGH); // activa el relé2
    digitalWrite (rele3, HIGH); // activa el rele3
    delay(250); //esperamos 0.25 segundos
    }
  if(inicio==0) {
    digitalWrite (rele1, HIGH); // activa el relé1
    digitalWrite (rele2, HIGH); // activa el relé2
    digitalWrite (rele3, HIGH); // activa el relé3
    }
  if (i==35);
    inicio=0;
  }
}

Gracias de antemano!
Logged

Alicante (España)
Offline Offline
Full Member
***
Karma: 13
Posts: 233
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Archivos-Ejemplos-Digital-BlinkWhitoutDelay

Jopapa
Logged

Maracaibo
Online Online
Jr. Member
**
Karma: 1
Posts: 83
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Saludos.
Usa el ejemplo del blink si delay.

Ejemplo
Unsigned long tiempo;

Void setup(){
Tiempo=millis();
   }

Void loop(){  
If(millis()-tiempo>2000){   // accion despues de dos segundo

 }

If(millis()-tiempo>5000){   //accion despues de cinco segundos

 }




 }
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hola tengo casi el mismo problema ya pudiste solucionar algo yo en este momento puedo prender un rele y hasta que no termine el tiempo que le dije que quedara encendido no puedo prender el otro
Logged

Maracaibo
Online Online
Jr. Member
**
Karma: 1
Posts: 83
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bueno aqui le coloco un codigo basico para hacer el encendido de cinco leds simultáneamente.

Code:
/* Encender varios led difentes tiempos
El primer led encendera entre 1 y 10 segundos despues de iniciado el programa
El segundo encendera a los 2 segundos y finalizara a los 5s
El tercer led encendera a los 10s y finalizara a los 21s
El cuarto encendera a los 0,5s de iniciado el Sketch y apagara a los 8s
El quinto y ultimo led iniciara a los 0,5s y se apagara a los 25 s
cuando el quito led se apague toda la rutina comienza a repetirse.
*/

unsigned long tiempo;
int leds[5]= {2,3,4,5,6};
void setup(){
  for(int i =0; i<5;i++){ //Configura salida de leds en pines 2, 3,4,5 y 6 como salida
    pinMode(leds[i],OUTPUT);
  }
  tiempo= millis();
}
void loop(){
  if(millis()-tiempo>1000 && millis()-tiempo < 10000){
    digitalWrite(leds[0],HIGH);
  }else
  if (millis()-tiempo > 10000){
    digitalWrite(leds[0],LOW);
  } //primer
  if(millis()-tiempo>2000 && millis()-tiempo < 50000){
    digitalWrite(leds[1],HIGH);
  }else
  if (millis()-tiempo > 5000){
    digitalWrite(leds[1],LOW);
  } //Segundo
  if(millis()-tiempo>10000 && millis()-tiempo < 21000){
    digitalWrite(leds[2],HIGH);
  }else
  if (millis()-tiempo > 21000){
    digitalWrite(leds[2],LOW);
  } //tercer
  if(millis()-tiempo>500 && millis()-tiempo < 8000){
    digitalWrite(leds[3],HIGH);
  }else
  if (millis()-tiempo > 8000){
    digitalWrite(leds[3],LOW);
  } //cuarto
   if(millis()-tiempo>500 && millis()-tiempo < 25000){
    digitalWrite(leds[4],HIGH);
  }else
  if (millis()-tiempo > 25000){
    digitalWrite(leds[4],LOW);
    tiempo= millis();
  } //quinto 
 
}
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Muchísimas gracias Max! Lo probaré en cuanto tenga un momento. Seguro que le resulta útil a alguien más.
En mi programa no me ha ido muy bien con los "millis" a lo mejor es por usar también el "delay"
Lo he medio resuelto usando un contador para hacer temporizaciones.
Logged

Vilalba, Lugo, Spain
Offline Offline
Sr. Member
****
Karma: 23
Posts: 335
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Esto puede valerte:

http://forum.arduino.cc/index.php?topic=260302.0
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Max, el programa que pusiste funciona perfectamente y además es sencillo de modificar.
Solo una cosa: la secuencia arranca sola, ¿cómo hacer para que arranque con un pulsador? seguramente sea una tontería, pero estoy hecho un lío.
Muchas gracias!
Logged

Maracaibo
Online Online
Jr. Member
**
Karma: 1
Posts: 83
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Saludos
Ok te colocare el Sketch de una forma mas ordenada, en el circuito ademas de los leds debes conectar un pulsador entre el pin 7 y GND, cada vez que presiones el pulsador cambiara el estado de apagado a encendido, y de encendido a apagado. Ademas tiene un retardo de 50 milisegundos para evitar rebotes al presionar el botón.


Code:
/* Encender varios led difentes tiempos
El primer led encendera entre 1 y 10 segundos despues de iniciado el programa
El segundo encendera a los 2 segundos y finalizara a los 5s
El tercer led encendera a los 10s y finalizara a los 21s
El cuarto encendera a los 0,5s de iniciado el Sketch y apagara a los 8s
El quinto y ultimo led iniciara a los 0,5s y se apagara a los 25 s
cuando el quito led se apague toda la rutina comienza a repetirse.
*/

unsigned long tiempo;

int leds[5]= {2,3,4,5,6};
int pin_boton= 7; // Pin para el boton
boolean activa = false; //Variable de control de encendido


void setup(){
  for(int i =0; i<5;i++){ //Configura salida de leds en pines 2, 3,4,5 y 6 como salida
    pinMode(leds[i],OUTPUT);
  }
  pinMode(pin_boton,INPUT);
  tiempo= millis();
  digitalWrite(pin_boton,HIGH);
}
void loop(){
  if (digitalRead(pin_boton) == LOW){ //Revisa que has presioando el boton
    delay(50);
  if (digitalRead(pin_boton) == LOW){ // Espera 50 milisegundos para evitar antirrebotes.
      while(pin_boton == LOW){} //Espera que sueltes el boton
      if(activa==true){Activa = false;} //Si esta activo se apaga
      if(activa==false){Activa = true;} // Sie sta apagado se activa  
    }
  }
  if(activa == true){ //Si esta activo llama a la fucion encender_leds();
    encender_leds();
  }
}


void encender_leds(){
  if(millis()-tiempo>1000 && millis()-tiempo < 10000){
    digitalWrite(leds[0],HIGH);
  }else
  if (millis()-tiempo > 10000){
    digitalWrite(leds[0],LOW);
  } //primer
  if(millis()-tiempo>2000 && millis()-tiempo < 50000){
    digitalWrite(leds[1],HIGH);
  }else
  if (millis()-tiempo > 5000){
    digitalWrite(leds[1],LOW);
  } //Segundo
  if(millis()-tiempo>10000 && millis()-tiempo < 21000){
    digitalWrite(leds[2],HIGH);
  }else
  if (millis()-tiempo > 21000){
    digitalWrite(leds[2],LOW);
  } //tercer
  if(millis()-tiempo>500 && millis()-tiempo < 8000){
    digitalWrite(leds[3],HIGH);
  }else
  if (millis()-tiempo > 8000){
    digitalWrite(leds[3],LOW);
  } //cuarto
   if(millis()-tiempo>500 && millis()-tiempo < 25000){
    digitalWrite(leds[4],HIGH);
  }else
  if (millis()-tiempo > 25000){
    digitalWrite(leds[4],LOW);
    tiempo= millis();
  } //quinto  
}
« Last Edit: August 15, 2014, 08:18:49 am by max_saeta » Logged

Pages: [1]   Go Up
Jump to: