Flanco de subida [SOLUCIONADO]

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.

Pseudocódigo rápido:

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

Cheyenne:
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

Para apagarlo tienes que añadir seguido del if:

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

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

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.

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

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.

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!

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

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?

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

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