Go Down

Topic: Duda acción pulsador (Read 9101 times) previous topic - next topic

igorreal

#15
Apr 14, 2010, 11:59 pm Last Edit: Apr 15, 2010, 02:54 pm by igorreal Reason: 1
Me alegro  ;)

Hay otras maneras de pasar de diagrama de estados a programación lineal, por ejemplo, sólo usando el switch.... Una vez entendido el concepto, ya es una cosa de traducción....

Pseudocódigo:


#define LED_OFF 1
#define LED_ON 2

int estado=0;

void loop(){
     swicth(estado){

           case LED_OFF:
                 delay(100); //rebotes
                 digitalWrite(led,LOW);
                 if digitalRead(pulsador){      
                             estado=LED_ON;
                             t_start=millis();
                 }
                 break;

           case LED_ON:
                 delay(100); //rebotes
                 digitalWrite(led,LOW);
                 if ((digitalRead(pulsador) || (millis() - t_start) > temp))      estado=LED_OFF;
                 break;
           
           default:
                 estado=LED_OFF
                 break;
     

}


En default, sería tu condicion inicial.....Podrías utilizarlo para inicializar variables, temporizadores,...


Saludos



Igor R.

111---111

He hecho algo así pero no funciona, lo del default no se como va...

Code: [Select]
#default LED_OFF 1
#default LED_ON 2

#define pulsador 8
#define led 2

int estado=0;
int temp=5000;
long t_start;

void setup(){
 
 pinMode(pulsador,INPUT);
 pinMode(led,OUTPUT);

}

void loop(){
 
    switch(estado){

          case LED_OFF:
                delay(100); //rebotes
                digitalWrite(led,LOW);
                    if (digitalRead(pulsador)){      
                    estado=LED_ON;
                    t_start=millis();
                    }
                break;

          case LED_ON:
                delay(100); //rebotes
                digitalWrite(led,LOW);
                if ((digitalRead(pulsador) || (millis() - t_start) > temp))      
                estado=LED_OFF;
                break;
         
          default:
                estado=LED_OFF
                break;
   

}

igorreal

#17
Apr 15, 2010, 02:57 pm Last Edit: Apr 15, 2010, 03:02 pm by igorreal Reason: 1
Es #define.... je,je,je. No se en que estaba pensando. He editado el post. ;D

A parte te falta:
1) un } al final. Tienes que cerrar el switch y el void loop.
2) un ;

Code: [Select]

#define LED_OFF 1
#define LED_ON 2

#define pulsador 8
#define led 2

int estado=0;
int temp=5000;
long t_start;

void setup(){

 pinMode(pulsador,INPUT);
 pinMode(led,OUTPUT);

}

void loop(){

 switch(estado){

   case LED_OFF:
     delay(100); //rebotes
     digitalWrite(led,LOW);
     if (digitalRead(pulsador)){
       estado=LED_ON;
       t_start=millis();
      }
     break;

   case LED_ON:
     delay(100); //rebotes
     digitalWrite(led,LOW);
     if ((digitalRead(pulsador) || (millis() - t_start) > temp))    estado=LED_OFF;
     break;

   default:
     estado=LED_OFF;
     break;


 }
}




111---111

Pues chico, no me funciona, he añadido las llaves al ultimo if y quitado unos parentesis del mismo que parecia que sobraban, compila pero al subirlo al arduino no hace nada.

De todas maneras, en programacion lineal como sería, como lo he puesto yo al principio? o sería menos engorroso.

Code: [Select]
#define LED_OFF 1
#define LED_ON 2

#define pulsador 8
#define led 2

int estado=0;
int temp=5000;
long t_start;

void setup(){

 pinMode(pulsador,INPUT);
 pinMode(led,OUTPUT);

}

void loop(){

 switch(estado){

   case LED_OFF:
     delay(100); //rebotes
     digitalWrite(led,LOW);
           if (digitalRead(pulsador)){
             estado=LED_ON;
             t_start=millis();
         }
     break;

   case LED_ON:
     delay(100); //rebotes
     digitalWrite(led,LOW);
           if (digitalRead(pulsador) || (millis() - t_start) > temp){    
           estado=LED_OFF;
         }
     break;

   default:
     estado=LED_OFF;
     break;
 }
}

MassoBBS

Ahí va mi duda la cual ya he explicado a Igor, en la cual quiero simular una bomba en la qie apretando un botón lanza una cuenta atrás mientras se "arma" y al finalizar explota y que cuando se está armando al presionar el pulsador 2 lance otra cuenta atrás para desarmarla. Vosotros me diréis...

Gracias!  ;)

Code: [Select]
#define pulsador 8
#define pulsador2 9
#define led 2
#define led2 3
#define led3 4
#define led4 5

int state=1;
long t_start;
long t_start2;
int temparmed=5000;
int tempdisarmed=5000;

void setup() {

 pinMode(pulsador,INPUT);
 pinMode(pulsador2,INPUT);
 pinMode(led,OUTPUT);
 pinMode(led2,OUTPUT);
 pinMode(led3,OUTPUT);
 pinMode(led4,OUTPUT);
 
}

void loop(){

    if (state==1 && digitalRead(pulsador)){
          delay(100); //evitar rebotes
          state=2;
          t_start=millis();
    }


    if (state==2 && (millis() - t_start) > temparmed){
          state=3;
    }
   
    if (state==2 && digitalRead(pulsador2)) {
            delay(100);
            state=4;
            t_start2=millis();
    }
   
    if (state==4 && (millis() - t_start) > tempdisarmed){
            state=1;
    }
             


    switch (state){
          case 1:
                digitalWrite(led,HIGH);
                break;
          case 2:
                digitalWrite(led2,HIGH);
                    delay(100);
                    digitalWrite(led2,LOW);
                    delay(100);
                break;
            case 3:
                    digitalWrite(led4,HIGH);
                    break;
            case 4:
                    digitalWrite(led3,HIGH);
                    delay(100);
                    digitalWrite(led3,LOW);
                    delay(100);                    
    }

}  

MassoBBS

Me voy a contestar a mi mismo, porque me ha funcionado. xD. De todas formas, si alguien ve algo que se pueda simplificar, o hacerlo de una manera más optima que lo diga por favor!

Salu2 ;)

igorreal

Me alegro que tu mismo llegaste a la solución!!!

;)

Go Up