Interrupción LDR y encendido LED

Buenas!
Estoy intentando aprender a usar interrupciones pero no entiendo como hacerlo con un dispositivo que envíe valores.

Me explico: mi objetivo es conectar el LDR al pin 2 y que cuando el valor que éste envía sea inferior a 400 entonces pague el led y que cuando sea mayor, lo encienda.
Lo que o entiendo es como asociar el HIGH a >400 y el LOW a <400 para que cuando lance la interrupción apague o encienda el led

int led = 13;
volatile int estat;

void setup(){
Serial.begin(9600); 
pinMode( led, OUTPUT ); 
attachInterrupt(0, interrupcio, CHANGE); 
}

void loop(){
int valorFotorresistencia; 
valorFotorresistencia = analogRead(A0);
Serial.println(valorFotorresistencia); 
analogWrite(led, valorFotorresistencia/4); 
delay(1000); //Esperamos 1000ms
}


void interrupcio() {
  estat = !estat
  analogWrite(led, estat);
}

Con un pulsador estaría claro ya que la unica posibilidad de datos en él es o HIGH o LOW, pero el LDR, ultrasonidos, etc...?

Muchas gracias de antemano!

Si no me equivoco, lo que dices no es posible. Arduino puede generar una interrupción al cambiar un pin de entrada digital, no analógica. En lectura analógica creo que lo que sí puede es generar una interrupción cuando finaliza el proceso de lectura analógica (esto evitaría tener que detener el programa mientras el conversor realiza su trabajo).
La solución a lo que propones creo que es hardware: recibir la señal como digital, pero adaptada, de manera que entregue HIGH a partir de cierto nivel de luz.
Yo en hardware estoy totalmente pez, pero a poco que busques encontrarás algo, y a buen seguro que no será muy complicado (un potenciómetro para regular el nivel de cambio HIGH/LOW y poco más).

Hola,

Leyendo un poco (y borrando la animalada que habia puesto antes) existe una interrupcion llamada Analog Comparator que te puede servir.

Revisa esta información:

http://forum.arduino.cc/index.php/topic,17450.0.html

http://www.leonardomiliani.com/2012/analogcomp-una-libreria-per-gestire-il-comparatore-analogico/?lang=en

Saludos.

¡¡Ups! Es verdad. No me acordaba del comparador analógico. Disculpas :zipper_mouth_face:. Como ya he dicho, la electrónica y el hardware no son mi fuerte. Espero que lo de meter una señal analógica en un pin digital no sea una completa burrada (creo que había un voltaje estipulado a partir del que una entrada digital tomaba un estado u otro, aunque seguro que será más preciso utilizar el comparador).

Y como se utiliza dicho comparador? Me he metido en el enlace pero no entiendo muy bien el inglés y no me he enterado

A grosso modo, compara el voltaje que llega por una patilla con un voltaje de referencia en otra, o bien con un voltaje de referencia interno (creo que de 1,1 V). Puede generar una interrupción cuando el voltaje sube del de referencia, cuando baja, o en ambos casos. En cuanto a circuitería, seguro que Luis_AM3C podrá orientarte (yo desde luego, no).
En cuanto a software, en el primer vínculo (al final de la página) que Luis_AM3C envió, tienes un buen ejemplo de uso, programando la interrupción enredando directamente en los registros del micro (a lo machote :)) y si descargas la librería del segundo vínculo tienes un par de ejemplos de uso con dicha librería.

Hola,

Aqui esta otro enlace http://www.gammon.com.au/forum/?id=11916 que muestra un circuito de ejemplo con una LDR.

Si tienes muchos problemas con el ingles ve a http://translate.google.com y copia el enlace y le das traducir de ingles a español.

Como te dijo noter, tienes dos opciones modificar los registros como salen allí, o si quieres mantener tu codigo mas legible te descargas la carpetas la copias dentro de libraries, reinicias el IDE de Arduino, y usas las funciones que alli explican.

Para el circuito lo mas conveniente es que uses un potenciomentro (si es multivuelta mejor la precision) entre 5V y GND y la pata del medio a AIN0 y ajustes alli el voltaje al que quieres que se dispare la interrupción.

La libreria te permite ajustar al igual que si fuese una interrupcion digital externa, entonces puedes usar RISING para que se active solo cuando pasa de 0 a 1.

Te toca a ti tomarte la molestia de bajarte la libreria y probar, si esta bien hecha seguramente incluya codigo de ejemplo.

Yo supongo que será algo así.

#include "analogComp.h"
//tus demas include

void setup(void)
{
     analogComparator.setOn(AIN0, A0);//aqui el LDR estaria en el A0, puedes ponerlo en AIN1 o cualquiera entre A0-A6
     analogComparator.enableInterrupt(intAnalogComp, CHANGE); //entra a la interrupcion cada vez que ocurre un cambio
     //tu demas inicializacion
}

void loop(void)
{
     //tu codigo
}

void intAnalogComp(void)
{
    digitalWrite(13, analogComparator.waitComp(0) );//donde esta el 0 son los ms que se revisa la comparacion, no se si 0 funcione
}

Saludos.

pasa algo si pongo un delay en el loop de 100 ms y el led de Tx del Arduino parpadea muy rápido? puede llegar a fundirse?

ESque necesito enviar un valor muy seguido pero me da miedo petar el led del arduino

Hola,

El led nunca va a fundirse, si no hay ninguna parte en el loop que sea de tiempo critico puedes colocar el delay que te convenga.

Saludos.

hola buenas noches nesesito apagar la lectura análoga que código o comando me sirve para lograr esto muchas gracias :smiley:

Empieza leyendo las normas del foro, no respondiendo hilos del 2013 o sea que debiste haber respetado al advertencia de que hilo no tenía movimientos desde hace 120 días.
Así que este hilo esta cerrado y te invito a que crees uno propio con tu inquietud.
Si faltas una norma te seguiré llamando la atención.