🛠 Capteur de lumière avec seuil et hystérésis
Objetivos
Aprovechar en serio el sensor de luz integrado (una LDR leída en el canal 5 del multiplexor analógico): escalado, filtrado por media móvil e histéresis para evitar el parpadeo alrededor del umbral. Este es el esquema básico de cualquier sistema de alerta basado en sensores analógicos, y la Esplora lo permite sin un solo cable.
Material
- Arduino Esplora + cable micro-USB.
- Biblioteca Esplora.
- Opcional: una linterna para probar el umbral.
Código completo
/* Veilleur de lumiere : la LED RVB passe au vert le jour, au rouge la nuit.
- moyenne glissante sur 8 mesures (le mux impose des lectures sequentielles)
- hysteresis de 60 points pour ne pas osciller autour du seuil.
NB : le capteur est une LDR, 1023 = tres eclaire, 0 = obscurite. */
#include <Esplora.h>
const int SEUIL_ALLUMAGE = 350; // sous ce niveau -> mode nuit
const int SEUIL_EXTINCTION = 410; // au-dessus -> mode jour (hysteresis)
const int N = 8; // taille de la fenetre de moyenne
unsigned long mesures[N];
size_t idx = 0;
bool jour = true;
unsigned long moyenne {
unsigned long s = 0;
for (size_t i = 0; i < N; i++) s += mesures[i];
return s / N;
}
void setup {
Serial.begin(9600);
for (size_t i = 0; i < N; i++) mesures[i] = Esplora.readLightSensor;
}
void loop {
mesures[idx] = Esplora.readLightSensor;
idx = (idx + 1) % N;
unsigned long lum = moyenne;
if (jour && lum < SEUIL_ALLUMAGE) {
jour = false; // bascule en nuit
Esplora.writeRGB(255, 0, 0);
Esplora.tone(440, 120); // bip court sur le buzzer (D6)
} else if (!jour && lum > SEUIL_EXTINCTION) {
jour = true; // retour au jour
Esplora.writeRGB(0, 255, 0);
}
Serial.print("lum="); Serial.print(lum);
Serial.println(jour ? " JOUR" : " NUIT");
delay(100);
}
Verificación esperada
Con luz de día, el LED está en verde. Tape el sensor con el dedo: por debajo de ~350, el LED pasa a rojo con un pitido breve. Suelte a medias: el LED permanece en rojo hasta 410 (histéresis) — sin este margen, cambiaría frenéticamente. La media móvil suaviza los picos (un golpe de mano frente al sensor ya no provoca un error de medición claro).
Errores frecuentes
- Umbral idéntico en subida y bajada: oscilación permanente alrededor del umbral; el margen de histéresis (aquí 60 puntos) es obligatorio en un sensor ruidoso.
- Media recalculada sobre una ventana no llena: inicialice el búfer con mediciones reales en
setup, de lo contrario los primeros ciclos se verán falseados por ceros. - Olvidar la naturaleza de la LDR: la respuesta es logarítmica respecto a la iluminación real; un umbral en valor ADC no es lineal en lux — reajuste sus umbrales para SU entorno.
- Zumbador que pita continuamente: llame a
Esplora.tone(f, duree)con duración, o recuerde usarnoTone; sin duración, el sonido queda bloqueado. - Leer otros sensores entre medias sin demora: cada cambio de canal del multiplexor tiene un tiempo de estabilización; la biblioteca se encarga de ello, pero no vuelva a crear la lectura con
analogRead(A4)directo sin respetar este tiempo.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
joystick-couleur.inoArduinojeu-boutons.inoArduinoslider-luminosite.inoArduinothermometre-couleur.inoArduinosonometre.inoArduinoaccelerometre-tilt.inoArduino