Disparo por flancos en Arduino

Hola,

Desearía conocer si hay alguna forma de realizar un disparo pro flancos en Arduino.

Gracias

creo que la forma más sencilla es usando las interrupciones (pines dos y tres)

Hola...

attachInterrupt(digitalPinToInterrupt(interruptPin), Función, Flanco);

Donde Flanco puede ser:
RISING Cuando es flanco de subida.
FALLING Flanco de bajada.

y Función, es la función desde donde vas a procesar la interrupción

Mas información en Arduino attachInterrupt()

Gracias Visionario.

Olvide decir que lo que necesito no es una interrupción externa sino que cuando una variable cambie dispare un evento.

Entonces es trivial...

Hay varias maneras...
Una es verificar el valor de esa variable al comienzo de loop(), la segunda manera es crear una función que es la que recibirá el cambio de la variable cada vez que la quieras cambiar y esta misma ejecuta el "triger" al cambio de la variable, evidentemente debes almacenar el valor previo de la variable para comparar el nuevo estado y saber si es mayor o menor y ejecutar la tarea correspondiente.

es muy facil
Lee un pin o variable por ejemplo

bool valorAnt = false;
bool valor = digitalRead(Pin);
if (valor && !valorAnt) {  // flanco 0 a 1
  // lo que necesites hacer
}
valorAnt = valor;

surbyte:
es muy facil
Lee un pin o variable por ejemplo

bool valorAnt = false;

bool valor = digitalRead(Pin);
if (valor && !valorAnt) {  // flanco 0 a 1
 // lo que necesites hacer
}
valorAnt = valor;

Muy bien explicado @surbyte esto tenía en mente y lo bien queda el código. Otro que me llevo a la colección. Gracias y saludos!

Muy agradecido a todos.

Creo que utilizaré el método que apuntó Visionario al principio: sacar la variable por un pin, llevarlo a otro pin de entrada y y provocar una interrupción.

No obstante probaré antes la manera que sugiere surbyte.

Saludos

madel:
Creo que utilizaré el método que apuntó Visionario al principio: sacar la variable por un pin, llevarlo a otro pin de entrada y y provocar una interrupción.

Aunque puedes hacer como gustes, a mi me parece un verdadero despilfarro de recursos pero claro que estas en tu derecho de usar lo que gustes.
Y tu mismo has dicho..

Olvide decir que lo que necesito no es una interrupción externa sino que cuando una variable cambie dispare un evento

Yo uso las interrupciones para seguir eventos externos.
Una variable la manejo como te indiqué.
Pero dime... que pasa si debes seguir dos variables. Ahhh el UNO/NANO tiene 2 ISRs.. bien!!!
y si fueran 3.. mmm te compras un MEGA/DUE que tiene mas.
Y si fueran 10? no puedes usar ISRs o requieres un controlador de Interrupciones. Muy complicado!!!
Ahi tienes la fundamentacion.
Tu variable tiene mucho tiempo para informarte que cambio de estado. Y de ese modo lo manejas facilmente.
Deja las ISRs externas para contar RPM o ver un evento rápido, medir una PWM, o frecuencia o lo que fuere. O ver el paso por cero de la AC. No se.. hay miles de cosas para las que fue diseÑado incluída un cambio de estado digital en una entrada,
Ejemplo yo lo uso para ver cuando suena una llamada de telefono y tranquilamente por lo lenta que es pude usar el mismo método que te propongo. Pero se me ocurrió hacerlo asi.

Muchas gracias, surbyte, por el consejo y el interés por que haga las cosas lo mejor posible.

Verás, el problema es que, realizando un programa de control para placas solares, por una parte mido la intensidad de carga de las baterías y por otra la intensidad de descarga.

Posteriormente estos dos valores los resto para obtener un valor que me indica si las baterías están cargándose (valor positivo) o descargándose (valor negativo) y cual es el valor de carga o descarga.

Este valor de carga o descarga incrementa o decrementa, cada segundo, una variable (capacidad acumulada de las baterías).

Pues bien, en el momento en que se ejecuta el incremento o decremento me ofrece un valor erróneo, ya que en un ciclo de scan, la instrucción llega a ejecutarse varias veces, cuando necesito que solo lo haga una vez.

Espero que entiendas esto y si tienes una solución, que la tendrás, dime como lo puedo hacer.

Gracias

Pues entonces postea todo el código y lo vemos pero hablar en el aire es dificil.
Yo estoy trabajando en algo parecido y me interesa tu punto de vista o tu enfoque de como lo estas haciendo y comparlo con lo que yo aun no he hecho.

Jamás escribí que se saca una variable por un pin! Nunca. Que quede claro, porque de haberlo dicho sería una soberana estupidez y un ridículo desperdicio de recursos.

Por favor revise lo que he escrito.
Saludos

Buenos días surbyte, al final encontré una solución más fácil que funciona correctamente.
Se trata de un Timer que dispara cada segundo e incrementa la variable Capacidad con la diferencia de las variables de carga y descarga de las baterías.

#include <TimerOne.h>
int EntradaCarga = A0;
int EntradaDescarga = A1;

int ValorSensorCarga;
int ValorSensorDescarga;
float Integracion;
float IntensidadCarga;
float IntensidadDescarga;
float Capacidad;


void setup(void)
{
  Timer1.initialize(1000000);         // Dispara cada segundo
  Timer1.attachInterrupt(ISR_1); // Activa la interrupcion y la asocia a ISR_Blink
  Serial.begin(9600);
}

void loop(void)
{
  ValorSensorCarga = analogRead(EntradaCarga);  // Mide la corriente de Carga
  IntensidadCarga =map(ValorSensorCarga,0,1023,0,100);  // y la mapea para 0 a 100 Amp.

  ValorSensorDescarga = analogRead(EntradaDescarga); // Mide la corriente de Descarga
  IntensidadDescarga = map(ValorSensorDescarga,0,1023,0,100);  // y la mapea para 0 a 100 Amp.

  Integracion = IntensidadCarga - IntensidadDescarga;  // Calcula de diferencia

    noInterrupts();               // Suspende las interrupciones

    interrupts();                 // Autoriza las interrupciones

  Serial.print("Carga = ");
  Serial.println(IntensidadCarga);
  Serial.print("Descarga = ");
  Serial.println(IntensidadDescarga);
  Serial.print("Capacidad = ");
  Serial.println(Capacidad);
  delay(1000);
}

void ISR_1()
{   
  // Incrementa la variable Capacidad con la variable Integracion
  Capacidad = Capacidad + (Integracion / 3600);  
}

Pido disculpas a Visionario, pero en su primera respuesta escribió:

attachInterrupt(digitalPinToInterrupt(interruptPin), Función, Flanco);
Donde Flanco puede ser:
RISING Cuando es flanco de subida.
FALLING Flanco de bajada.
y Función, es la función desde donde vas a procesar la interrupción

por lo que entendí lo de sacar la variable por un pin e introducirla por otro para realizar una interrupción hardware.

Ahhh pero tu problema estaba mal explicado!!

Porque tu mas que diferencia lo que buscas es la diferencia por tiempo.
Ahora al tener un TIMER se simplifica porque el timer te toma los cambios que puedes calcular fácilmente y sabes en que tiempo ocurren.

Efectivamente surbyte, a veces cuesta explicar las cosas. La diferencia es fácil, IntensidadCarga - IntensidadDescarga. Mi problema era sumar la variable Integración a Capacidad cada segundo sin que se ejecutara varias veces.

De todos modos muy agradecido.