🛠 Capteur de lumière avec seuil et hystérésis

Arduino Esplora — Ficha de placa · intermediaire · Schéma : IMG-esplora-intermediaire-1-esplora-capteur-lumiere-hysteresis.svg — Courbe d'hystérésis superposée à l'Esplora, avec la LED RVB verte en mode jour et rouge en mode nuit et les deux seuils annotés.

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

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

  1. 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.
  2. 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.
  3. 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.
  4. Zumbador que pita continuamente: llame a Esplora.tone(f, duree) con duración, o recuerde usar noTone; sin duración, el sonido queda bloqueado.
  5. 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

← Volver a la ficha 🛠 Todos los tutoriales