Buenas! Aunque llevo un par de años con Arduino, lo he tenido un poco aparcado entre la universidad y otras cosillas.
Entre ellas, estamos utilizando Arduino como un sistema de control de temperatura en una nevera para la fermentación de cerveza XD
Ahora, en la uni hemos empezado un proyecto con el que tocamos algo de Arduino y estoy bastante oxidado.
Para practicar, estoy haciendo una "alarma".
Que básicamente consta de 3 botones, varios leds, el timbre, un laser...
Mejor que os enseñe el diseño con fritzing:
Mi idea es, cuando cruzas el laser, el sensor LDR deja de recibir luz y empieza una cuenta atrás.
El codigo "básico" (secuencia botones, encendido leds, etc lo tengo claro, creo) Pero no tengo ni idea de como hacer la cuenta atrás.
¿Alguna idea?
Todo lo que he programado ha sido en python, y el C que conozco ha sido por Arduino, que es poco :~
puedes usar la funcion millis() que devuelve el tiempo que lleva ejecutandose el skech almacenandola en una variable y sumandole el tiempo que quieras en la cuenta atras ,luego solo tienes que comprobar si el tiempo de ejecucion es igual al almacenado en la variable.No es exactamente una cuenta atras pero es una manera de saber si ha pasado un periodo de tiempo determinado.
long tiempo;
const long tiempoCuenta = 10000; // Tiempo de la cuenta atras en milisegundos en este caso 10 segundos
void setup(){
Serial.begin(9600);
tiempo = millis() + tiempoCuenta;
}
void loop(){
if (millis() >= tiempo){
Serial.println("¡¡¡¡Alarma!!!!!");
}
}
Gracias!
Al final lo he conseguido (de una forma bastante cutre, mucho xD)
long tiempo;
const long tiempoCuenta = 5000; // Tiempo de la cuenta atras en milisegundos en este caso 10 segundos
const int Rled1 = 11;
const int b1 = 2;
int buttonstate1 = 0;
int apretado = 0;
int stop = 0;
int rojo = 0;
cuando cruzas el laser, el sensor LDR deja de recibir luz y empieza una cuenta atrás.
Un laser atacando una LDR? No lo creo posible.
Que un laser incida sobre un fototransistor o un fotodiodo de la misma longitud de onda si. Sobre una LDR que reaccion a luz ambiente no, porque justamente el laser es una luz coherente y la respuesta de la LDR será pobre.
cuando cruzas el laser, el sensor LDR deja de recibir luz y empieza una cuenta atrás.
Un laser atacando una LDR? No lo creo posible.
Que un laser incida sobre un fototransistor o un fotodiodo de la misma longitud de onda si. Sobre una LDR que reaccion a luz ambiente no, porque justamente el laser es una luz coherente y la respuesta de la LDR será pobre.
Claro que es posible, yo las he usado asi.
Wikipedia:
Las células son también capaces de reaccionar a una amplia gama de frecuencias, incluyendo infrarrojo (IR), luz visible, y ultravioleta (UV).
Yo las he hecho funcionar con Luz IR, la limitante que he econtrado es que son lentas para responder y su reaccion a multiples tipos de luz, por ello no las he dejado descubiertas. Cuando no quiero que cualquier tipo de luz afecte mi circuito ahi si he utilizado fotodiodos y LED infrarrojos.
Ok. Estuve leyendo y veo que muchos lo usan asi.
Yo no lo haría.
Yo haría una barrera infrarroja IR con diodo IR y fotodiodo o fototransistor. Es seguro, no requiere que esté tapado ni nada por el estilo.
Hay cientos de barreras por todos lados, mucho mas simple que estar peleando con una LDR y su reacción con todo lo que la rodea.
surbyte:
Ok. Estuve leyendo y veo que muchos lo usan asi.
Yo no lo haría.
Yo haría una barrera infrarroja IR con diodo IR y fotodiodo o fototransistor. Es seguro, no requiere que esté tapado ni nada por el estilo.
Hay cientos de barreras por todos lados, mucho mas simple que estar peleando con una LDR y su reacción con todo lo que la rodea.
Pues los fotodiodos tambien es recomendable que tengan un filtro, porque hay otros tipos de fuentes de luz infrarroja que pueden afectarlos, las lamparas incandesentes por ejemplo emiten cierta candidad de luz IR, por ello incluso los receptores de IR de los televisores tienen filtro a pesar que tienen circuitos internos para quitar la portadora de la señal del control remoto.
A ver.. tienes razón, pero, IR enfrentando a LDR vs IR enfrentando a fotodiodo con máxima respuesta en la longitud de onda del IR.
Dime quien se ve mas afectado por cuestiones externas?
Siii ponele un cilindro pequeño para confinar el haz y ya esta.
Industrialmente nunca vi un IR atacando un LDR. Yo.. aclaro. Tal vez haya.. hay cada cosa.!!
Volviendo al programa
Adjunto mi solución. Le agregué algo y no lo probé finalmente. Me dices si no funciona.
#define TIEMPOCUENTA 500 // Tiempo de la cuenta atras en milisegundos en este caso 10 segundos
// Definiciones de hardware
const int LedROJO = 11;
const int Boton1 = 2;
// Variables globales
long tiempo;
boolean currentState = LOW; // alamstroage for current measured button state
boolean lastState = LOW; //storage for last measured button state
boolean debouncedState = LOW; //debounced button state
int debounceInterval = 20; //wait 20 ms for button pin to settle
unsigned long timeOfLastButtonEvent = 0; //store the last time the button state changed
boolean puedoMostrar = false;
boolean MostrarCambios = false;
void setup(){
Serial.begin(9600); // Inicializo Puerto Serie
pinMode(LedROJO, OUTPUT); // Configuro Hardware
pinMode(Boton1, INPUT);
}
void loop(){
currentState = digitalRead(Boton1); // Leo el estado el pin Boton1
unsigned long currentTime = millis();
if (currentState != lastState){
timeOfLastButtonEvent = currentTime;
MostrarCambios = true;
}
if (currentTime - timeOfLastButtonEvent > debounceInterval){ //ha pasado sufiente tiempo
if (currentState != debouncedState){ //si el estado actual es diferente guardo el estado actual
debouncedState = currentState; // update the debounced state
puedoMostrar = true;
//trigger an event
}
}
lastState = currentState;
if (debouncedState == HIGH){
if (MostrarCambios) {
Serial.println("Pin HIGH");
Serial.println(millis() - timeOfLastButtonEvent);
MostrarCambios = false;
}
if ( currentTime - timeOfLastButtonEvent >= TIEMPOCUENTA){
if (puedoMostrar) {
Serial.println("Alarma");
digitalWrite(LedROJO,HIGH);
puedoMostrar = false;
}
}
} else {
if (MostrarCambios) {
Serial.println("Pin LOW");
MostrarCambios = false;
}
}
// if ( millis()-tiempo >=TIEMPOCUENTA && apretado == 1){
// Serial.println("Alarma");
// digitalWrite(LedROJO,HIGH);
// rojo = 1;
// }
// if (rojo == 1 && buttonstate1 == HIGH) {
// digitalWrite(LedROJO,LOW);
// apretado = 0;
// }
}