Cómo detectar un contacto HIGH aunque sea muy veloz

Hola

En el video del link se verá una balanza moviendose de un lado a otro, en el centro posee un imán que cada vez que pasa por el centro acciona un Reed swicht (interruptor de láminas), sin embargo, el código va gobernado por un reloj RTC que copia lo que se lee en los sensores conectados cada segundo, así que la mayoría de las veces por asuntos del azar, no coincide el balanceo con el momento de registro de la lectura, así que aunque hubo un evento HIGH este no se registra, porque los ocurren en menos de un segundo.

Cómo me recomiendan que controle eso, agradezco que me den la idea con un pedacito de código.

gracias

https://www.dropbox.com/s/m817dwydhzh34dn/IMG_4800.MOV?dl=0

Muchas gracias por su tiempo

Puedes usar interrupciones:
https://www.arduino.cc/en/Reference/AttachInterrupt
El pedacito de codigo esta en el ejemplo…

Este programa te da error?

int pin = 13;
volatile int state = LOW;

void setup() {
    pinMode(pin, OUTPUT);
    attachInterrupt(digitalPinToInterrupt(pin), blink, CHANGE);
}

void loop() {
    digitalWrite(pin, state);
}

void blink() {
    state = !state;
}
El sketch usa 1,194 bytes (3.7%) del espacio de almacenamiento. El máximo es 32,256 bytes.
Las variables globales usan 17 bytes (0.8%) de la memoria dinámica, dejando 2,031 bytes para variables locales. EL máximo es 2,048 bytes.
[Stino - Compilación terminada "Interrupcion" en 41.8s.]

Ese código es del ejemplo que te dan en las interrupciones... Comprueba que puedes cargar cualquier otro programa sin problemas en el arduino.

No estoy seguro, pero ¿todos los pines del arduino UNO pueden configurarse como interrupciones? Porque según dice en la propia web, solo pueden usarse los pines digitales 2 y 3. Prueba cambiando pin=2;

Gracias a ti.

jvasquez05: correcto survite, ese es el código que me da error.

Gracias

alomejor es por la version del IDE .Prueba con esto: attachInterrupt(0, blink, CHANGE);para usar la interrupcion 0 ,que esta en el pin 2 , o bien : attachInterrupt(1, blink, CHANGE);para usar la interrupcion 1 ,que esta en el pin 3.

attachInterrupt(digitalPinToInterrupt(pin), blink, CHANGE);

Esta linea dice, cuando haya un CAMBIO 0 a 1 o 1 a 0, en el pin, vaya a la rutina blink.

Ahora si tu pones RISING solo lo hará cuando pases de 0 a 1 Si le poens FALLING solo lo hará cuando vayas de 1 a 0. supongo que buscas RISING y entonces solo ejectutará blink cuando pase de 0 a 1. tu quieres ahora que además no responda a interrupciones x 1 seg. bien usa

detachInterrupt(digitalPinToInterrupt(pin));

Entonces en tu rutina blink cambiaría a

// defino 
volatile unsigned long intervalo;

// Setup igual
void loop() {
    
    if (flag && millis() > intervalo) {
        // hacer lo que quieras hacer superado los 1000 mseg
        digitalWrite(pin, state);  /// QUEEEEEEEEE porque usas el mismo pin??
        Serial.println (state);
    }
}

void blink() {
    state = !state;
   detachInterrupt(digitalPinToInterrupt(pin)); // detengo la interrupción
   intervalo = millis() + 1000UL;
}

bueno escribia toda la rutina cuando me encuentro que tu estas cambiando el estado del pin que usas como interrpción? No entiendo.

Tienes elproblema que tiene mucha gente y es falta de experiencia para poder integrar varios códigos porque alguno trae consigo algún vicio (delay tal vez) u otro elemento que demora el funcionamiento del conjunto. En lugar de atacarlo como lo estas haciendo plantéalo en su conjunto. Trae todo el código y vemos como afecta esta lectura las demás y viceverza.

PD: Te envié un enlace de un sistema predictivo meteorológico. Lo viste? Hecho con arduino y matlab. Lo hice por Mensaje Privado.

Si claro, cuando un archivo supera 9000 caracteres debes ir a Modify a la derecha abajo y verás que aparece la opción de Adjuntar achivos. y ahi puedes subirlo. No soporta .rar pero si .zip o .ino