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...?
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).
¡¡Ups! Es verdad. No me acordaba del comparador analógico. Disculpas . 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).
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.
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
}
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.