buen día colegas!
estoy haciendo un proyecto donde por medio de una perilla de 4 posiciones, pretendo controlar el encendido y tiempo de encendido de una salida la cual llamé "reac". las condiciones de la perilla son:
1.-siempre que la perilla esté en posición 1, mi salida reac debe apagarse.
2.-si la perilla esta en posición 2, la salida "reac" debe encenderse 40 segundos, después apagarse 10 segundos y volver repetir este ciclo de encendido y apagado permanentemente.
3.-si la perilla esta en posicion 3, la salida "reac" debe encenderse 50 segundos, después apagarse 10 segundos y volver repetir este ciclo de encendido y apagado permanentemente.
4.-si la perilla está en posición 4, la salida "reac" debe encenderse 60 segundos, después apagarse 20 segundos y volver repetir este ciclo de encendido y apagado permanentemente.
estas condiciones ya las tengo sin problemas. el problema es que si cambio la perilla, por ejemplo de la posición 2 la 3 y en ese momento la salida "reac" estaba apagada, al cambiarlo la 3 sigue apagada mi salida hasta que no termine el tiempo de apagado de la posición anterior y así entre las posiciones 2,3 y 4.
lo que deseo es que al cambiar la posición la salida se resetién los tiempos para que se encienda de inmediato la salida y se actualize el tiempo de encendido y apagado de la nueva posición. tengo entendido que con un cambio de estado lo puedo hacer, pero me podrían ayudar decirme como lo puedo hacer? ya que es uno de mis primeros proyectos en arduino.
gracias!!!
estoy haciendo un proyecto donde por medio de una perilla de 4 posiciones, pretendo controlar el encendido y tiempo de encendido de una salida la cual llamé "reac". las condiciones de la perilla son:
1.-siempre que la perilla esté en posición 1, mi salida reac debe apagarse.
2.-si la perilla esta en posición 2, la salida "reac" debe encenderse 40 segundos, después apagarse 10 segundos y volver repetir este ciclo de encendido y apagado permanentemente.
3.-si la perilla esta en posicion 3, la salida "reac" debe encenderse 50 segundos, después apagarse 10 segundos y volver repetir este ciclo de encendido y apagado permanentemente.
4.-si la perilla está en posición 4, la salida "reac" debe encenderse 60 segundos, después apagarse 20 segundos y volver repetir este ciclo de encendido y apagado permanentemente.
estas condiciones ya las tengo sin problemas. el problema es que si cambio la perilla, por ejemplo de la posición 2 la 3 y en ese momento la salida "reac" estaba apagada, al cambiarlo la 3 sigue apagada mi salida hasta que no termine el tiempo de apagado de la posición anterior y así entre las posiciones 2,3 y 4.
lo que deseo es que al cambiar la posición la salida se resetién los tiempos para que se encienda de inmediato la salida y se actualize el tiempo de encendido y apagado de la nueva posición. tengo entendido que con un cambio de estado lo puedo hacer, pero me podrían ayudar decirme como lo puedo hacer? ya que es uno de mis primeros proyectos en arduino.
gracias!!!
code: [select]
const int min = 0;
const int max = 1023;
const int reac=13;
int reacstate = low;
long ontime = 40000;
long offtime= 10000;
unsigned long previousmillis = 0;
void setup() {
pinmode (reac, output);
serial.begin(9600);
}
void loop()
{
int sensorreading = analogread(a0);
int range = map(sensorreading, min, max, 0, 3);
unsigned long currentmillis = millis();
switch (range) {
case 0:
reacstate=low;
digitalwrite(reac, reacstate);
serial.println("off");
break;
case 1:
serial.println("tiempo 1");
if((reacstate == high) && (currentmillis - previousmillis >= ontime)) {
reacstate = low;
previousmillis = currentmillis;
digitalwrite(reac, reacstate);
}
else if (currentmillis - previousmillis > offtime )
{
reacstate = high;
previousmillis = currentmillis;
digitalwrite(reac, reacstate);
}
break;
case 2:
serial.println("tiempo 2");
if (reacstate == low) {
if(currentmillis - previousmillis > offtime) {
previousmillis= currentmillis;
reacstate = high; }
digitalwrite(reac, reacstate);
} else {
if(currentmillis - previousmillis > (ontime + 10000)) {
previousmillis= currentmillis;
reacstate = low;
digitalwrite(reac, reacstate); }
}
break;
case 3:
serial.println("tiempo 3");
if (reacstate == low) {
if(currentmillis - previousmillis > offtime) {
previousmillis= currentmillis;
reacstate = high; }
digitalwrite(reac, reacstate);
} else {
if(currentmillis - previousmillis > (ontme + 20000)) {
previousmillis= currentmillis;
reacstate = low;
digitalwrite(reac, reacstate); }
}
break;
digitalwrite(reac, reacstate);
delay(100);
}}
y en lugar de hacerlo como swich case mejor encapsulas tus casos en funciones y el el programa principal solo preguntas con if??? no se algo como esto
algo como eso como siempre, solo es una idea, un pseudo codigo, tendrias que desarrollarlo no esperes que este codigo funcione, pero es la idea jejejeje
creo que al usar la funcion milis de esta manera puedes llevar tus eventos en paralelo y solo hacer mostrar uno cuando lo hagas llamar.
la funcion millis se resetea sola despues 50 dias, osea muchisimo tiempo jajaja
espero te sea de ayuda
code: [select]
void setup(){
if (range == 0) rango0();
if (range == 1) rango1();
if (range == 2) rango2();
if (range == 3) rango3();
if (range == 4) rango4();
}
void rango0(){
reacstate=low;
digitalwrite(reac, reacstate);
serial.println("off");
}
void rango1(){
serial.println("tiempo 1");
if((reacstate == high) && (currentmillis - previousmillis >= ontime)) {
reacstate = low;
previousmillis = currentmillis;
digitalwrite(reac, reacstate);
}
else if (currentmillis - previousmillis > offtime )
{
reacstate = high;
previousmillis = currentmillis;
digitalwrite(reac, reacstate);
}
}
etc...
algo como eso como siempre, solo es una idea, un pseudo codigo, tendrias que desarrollarlo no esperes que este codigo funcione, pero es la idea jejejeje
creo que al usar la funcion milis de esta manera puedes llevar tus eventos en paralelo y solo hacer mostrar uno cuando lo hagas llamar.
la funcion millis se resetea sola despues 50 dias, osea muchisimo tiempo jajaja
espero te sea de ayuda
Arduino Forum > International > Español > Software (Moderators: surbyte, Hector_A) > REINICIAR MILLIS CADA CAMBIO DE ESTADO
arduino
Comments
Post a Comment