Pages: [1]   Go Down
Author Topic: Flanco de subida [SOLUCIONADO]  (Read 4103 times)
0 Members and 1 Guest are viewing this topic.
Entre Bits
Offline Offline
Full Member
***
Karma: 2
Posts: 119
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Alguien puede facilitarme algun ejemplo de como hacer un flanco de subida??

Tengo un arduino UNO con ethernet shield, quiero activar un led durante 2 segundos, para activar este led puedo hacerlo desde un pulsador o desde la web, el problema es que quiero que si se deja pulsado cualquiera de ellos no repita el ciclo sino que espere a estar desactivado y vuelto a activar, se que para algunos es una chorrada o debe ser super sencillo pero me he atascado aqui y por mas pruebas que hago no encuentro la solucion. Estoy acostumbrado a la programacion de PLC´s pero el tema de programas tipo C no lo tengo muy por la mano. Gracias de antemano.


« Last Edit: March 21, 2012, 01:50:40 am by dystrom » Logged

Offline Offline
God Member
*****
Karma: 7
Posts: 635
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Pseudocódigo rápido:

EstadoActual = Entrada
Si EstadoActual = 1 y EstadoAnterior = 0 ejecutar acción
EstadoAnterior = EstadoActual
Logged


Entre Bits
Offline Offline
Full Member
***
Karma: 2
Posts: 119
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pseudocódigo rápido:

EstadoActual = Entrada
Si EstadoActual = 1 y EstadoAnterior = 0 ejecutar acción
EstadoAnterior = EstadoActual

Gracias Cheyenne, pero cuando EstadoAnterior cambia de estado??, ya que si no el led queda encendido de por vida.

Este es el codigo que he probado según tu ejemplo:

const int pulsador = 2;     // Pulsador
const int led =  13;      // LED

// variables:
int EstadoActual = 0;
int EstadoAnterior = 0;
int cnt = 0;

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

void loop(){
  EstadoActual = digitalRead(pulsador);
  if (EstadoActual == 1 & EstadoAnterior == 0){
    digitalWrite (led, HIGH);
    EstadoAnterior = EstadoActual;
  }  
}

La idea es que cuando pulse haga un SET y cuando vuelva a pulsar un RESET
« Last Edit: March 15, 2012, 01:18:31 pm by dystrom » Logged

Offline Offline
God Member
*****
Karma: 7
Posts: 635
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Para apagarlo tienes que añadir seguido del if:

Si EstadoActual = 0 y EstadoAnterior = 1 ejecutar acción (apagar led)
Logged


Entre Bits
Offline Offline
Full Member
***
Karma: 2
Posts: 119
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si pongo eso cuando suelto se apaga y no es lo que quiero hacer, pongo el codigo con tu modificacion

const int pulsador = 2;     // the number of the pushbutton pin
const int led =  14;      // the number of the LED pin
const int led2 =  15;      // the number of the LED pin

// variables will change:
int EstadoActual = 0;
int EstadoAnterior = 0;
int cnt = 0;

void setup() {
  pinMode(led, OUTPUT);   
  pinMode(led2, OUTPUT);   
  pinMode(pulsador, INPUT); 
 Serial.begin(9600); 
}

void loop(){
  EstadoActual = digitalRead(pulsador);
  if (EstadoActual == 1 & EstadoAnterior == 0){
      digitalWrite (led,HIGH);
      EstadoAnterior = EstadoActual;
  }
   if (EstadoActual == 0 & EstadoAnterior == 1){
      digitalWrite (led,LOW);
      EstadoAnterior = EstadoActual;
  }
}

He pensado en poner un contador, y luego una comparacion

Cada vez que pulse incremento contador

Si contador = 1 led ON
Si contador = 2 led Off y contador = 0

voy a probarlo y comento resultado

Logged

Offline Offline
God Member
*****
Karma: 7
Posts: 635
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Perdona me he liado. He releído el primer post y veo que se trataba de encender un led 2 segundos y apagarlo. La última instrucción no hay que ponerla. Es el primer código que has puesto. Y al encender el led pones un delay y lo apagas. Si tu programa no te admite un delay entonces lo enciendes y apagas según el ejemplo del IDE blinksindelay.
Logged


Offline Offline
God Member
*****
Karma: 7
Posts: 635
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Otra cosa. La instrucción EstadoAnterior = EstadoActual; tienes que ponerla fuera de la sentencia if.
Logged


COM22
Offline Offline
God Member
*****
Karma: 6
Posts: 702
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Para estos casos lo mejor es utilizar millis() no he probado el código, pero tendria que hacer: cuando detecta el flanco de salida encender el LED 2 sec. aunque lo mantengas pulsado o sueltes el pulsador.

Quote
const int pulsador = 2;     // the number of the pushbutton pin
const int led =  14;      // the number of the LED pin
const int timeledon =  2000;  // tiempo en que la led esta encendida en ms

// variables will change:
int EstadoActual = 0;
int EstadoAnterior = 0;
int time; // almacena el tiempo de millis()

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

void loop(){
  EstadoActual = digitalRead(pulsador);
  
  if (EstadoActual == 1 & EstadoAnterior == 0){
      time = millis();
      EstadoAnterior = EstadoActual;
  }
  
  if ( time+timeledon > millis()){
     digitalWrite (led,HIGH);
  } else {
     digitalWrite (led,LOW);
  }
}


Un saludo!
« Last Edit: March 15, 2012, 03:09:52 pm by JRodrigo » Logged


Offline Offline
God Member
*****
Karma: 7
Posts: 635
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ese es el código pero sacando EstadoAnterior = EstadoActual; fuera del if.
Logged


Entre Bits
Offline Offline
Full Member
***
Karma: 2
Posts: 119
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buenas, primero pediros perdón porque no he podido probar el código hasta hoy de ahi que no haya podido contestar y agradeceros la ayuda,  Cheyenne tienes razon hay que poderlo fuera del IF, por cierto hay un problema, el programa solo funciona 10 veces seguidas, yo creo que es por algo relacionado con la comparacion con millis, lo que pasa es que pulsas el boton, se enciende 2 segundos y se apaga pero cuando lo has hecho unas 10 veces se queda encendido y no se apaga nunca ¿se os ocurre que puede ser?
Logged

Offline Offline
God Member
*****
Karma: 7
Posts: 635
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Pon las variables de tiempo como long ya que como int enseguida se desbordarán.
Logged


Entre Bits
Offline Offline
Full Member
***
Karma: 2
Posts: 119
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Gracias de nuevo, ya he probado el programa y cambiandolo a LONG se acabo el problema.
Logged

Pages: [1]   Go Up
Jump to: