Salidas de relay

Hola, tengo el siguiente código que corre en un UNO,

quiero modificar el tiempo que demora en activarse la salida 2 luego de que la salida 1 se encuentra activada… si alguien puede ayudarme le agradezco

/**/
#define BTN 2
#define RL1 4
#define RL2 7
/**/

/**/
volatile int flag = 0;
/**/
volatile int timespan = 0;
/**/

void setup(){
    /**/
    pinMode(BTN, INPUT_PULLUP);
    /**/
    pinMode(RL1, OUTPUT);
    pinMode(RL2, OUTPUT);
    /**/
    digitalWrite(RL1, HIGH);
    digitalWrite(RL2, HIGH);
    /**/
    attachInterrupt(digitalPinToInterrupt(BTN), set, RISING);
    /**/
    start();
    /**/
}

void loop(){
    /**/
    delay(10);
    /**/
}

bool start(){
    /**/
    int t = random(900000, 1500000); // 900000, 1500000
    /**/
    delay(t);
    /**/
    digitalWrite(RL1, LOW); 
    /**/
    reset();
    /**/
    for (int i = 0; i < 12000; i++){
        /**/
        delay(10);
        /**/
        if (flag == 1){
            /**/
            digitalWrite(RL1, HIGH);
            digitalWrite(RL2, HIGH);
            /**/
            return start();
            /**/
        }
    }
    /**/
    reset();
    /**/
    for (int i = 0; i < 60; i++){
        /**/
        digitalWrite(RL2, LOW);
        /**/
        for (int j = 0; j < 200; j++){
            /**/
            delay(10);
            /**/
            if (flag == 1){
                /**/
                digitalWrite(RL1, HIGH);
                digitalWrite(RL2, HIGH);
                /**/
                return start();
                /**/
            }
        }
        /**/
        digitalWrite(RL2, HIGH);
        /**/
        for (int j = 0; j < 200; j++){
            /**/
            delay(10);
            /**/
            if (flag == 1){
                /**/
                digitalWrite(RL1, HIGH);
                digitalWrite(RL2, HIGH);
                /**/
                return start();
                /**/
            }
        }
    }
    /**/
    return start();
    /**/
}

void set(){
    /**/
    int t = millis();
    /**/
    if (t - timespan < 1000){
        /**/
        return;
        /**/  
    }
    /**/
    timespan = t;
    /**/
    flag = 1;
    /**/
}

void reset(){
    /**/
    flag = 0;
    /**/  
}

Hola, lo que te ocurre es que usas millis() en la rutina de servicio de la interrupcion, y dentro de estas rutinas no funcionan ni los delays() ni los millis(). y creo recordar que los micros() dan errores. Debes sacar esos calculos de la rutina de servicio de interrupción.
Saludos.

Es que funcionar, funciona y lo hace bien !!

Solo quiero modificar el tiempo en el cual se activa RL2

Hola, pues si dices que funciona bien, con lo que tarda no tengo paciencia para probarlo a fondo, al grano:
Los trazos de programa que controlan los tiempos de RL2 son:

//-------------------------------------
    digitalWrite(RL2, LOW);
    for (int j = 0; j < 200; j++) {
      delay(10);
//--------------------------------------      


//--------------------------------------
    digitalWrite(RL2, HIGH);
    for (int j = 0; j < 200; j++) {
      delay(10);
//--------------------------------------

La forma que tienes de cambiarlos es o modificando el numero de veces que se realizan los bucles “j <200”, o el tiempo de cada vuelta "delay (10).
Saludos.

gracias @gonpezzi resolvi esa parte…

lo siguiente que me sucede es que al reiniciarse el programa el relay 1 queda HIGH
no así el relay 2…

no entiendo el porque

Es lo que dice el programa que debe hacer, en el setup los pones los dos en HIGH, se llama a la función “start” y en esa funcion la tercera linea lo pone en LOW.
saludos.

Vamos a ver el programa funciona asi:
RL1=HIGH, RL2=HIGH (fijados en el setup)
(1) Se produce un retardo aleatorio de ente 15 y 25 minutos por la funciónn random, (la variable t la tienes que definir como long ya que asi te lo devolvera la función random),
Cambio a RL1=LOW, RL2=HIG (asi se mantiene 2 minutos 1er for)
Se producen 60 veces el cambio, (2º for):
RL1=LOW, RL2=LOW (2 segundos 3er for).
RL1=LOW, RL2=HIGH(2 segundos 4º for).
Vuelve al punto (1) con los valores RL1=LOW, RL2=HIGH.
Todo esto si no se produce una interrupción (puesta a cero del pin2).
Si se produce una interrupcion se vuelve al punto (1) con RL1=HIGH, RL2=HIGH.

Tu programa esta mal desarrollado.
setup se usa para inicializar objetos, dispositivos y loop se usa para correr todo el programa indefinidamente.
No se hacen alteraciones como en tu caso

void loop(){
    /**/
    delay(10);
    /**/
}

Esto es lo mismo que nada.
Otra cosa, no uses delay() aprende a trabajar con millis(). Ve a Documentación y mira los tutoriales que alli estan justamente para aprender a programar bien.

Finalmente puedes usar interrupciones para responder a un boton pero es una mala idea porque no fueron concebidas para algo tan burdo, sino para responder a otras situaciones. Justamente no esta pero… si quieres ahi esta. En lo personal considero que no es adecuado.

Puedes explicar que quieres hacer. Yo lo veo pero esta como todo dado vuelta de como debería hacerse.
Dirás: pero funciona, si claro, funciona pero este modo de programar no te va a servir en el corto plazo.
Si explica que deseas hacer lo podemos reestructurar.
Lo primero es que quieres que un rele se encienda por un tiempo aleatorio.
Luego lo mantienes por 120 segundos o sea 2 minutos a menos que presiones el pulsador. Entonces apagas los dos Reles y vuelves a comenzar o bien si no se presiona nada sigues
Esperas 60 mseg por el RL2 en ON y luego 2000 mseg apagando los dos si es que presionas el pulsador de lo contrario apagas el RL2.
y repites la seuecuencia para 2000 mseg en ambos pulsadores.
RARO lo ultimo.

Es asi?
Luego accionas

Hola a todos gracias por responder y ser tan amables...

Lo explotares desde el lado lógico y no programación ya que soy nuevo en el tema..

Deseo lo siguiente..

primero un tiempo random al inicio, entonces luego se activa relay 1, transcurrido un tiempo mas, se activa relay 2, si no sucede nada luego de un tiempo en el parpadeo que ven del relay 2 se reiniciar el ciclo a cero.

El pulsador es para poder reiniciar el ciclo en luego de la activación tanto de relay 1 o 2 volviendo a estado inicial.

Ese seria el basico programa; pero quizás el código un poco abrupto de hecho

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