01 · Punto de partida
Del discreto al integrado
En el tema 14 medimos la luz con componentes discretos: un LDR con su divisor, un fotodiodo con su amplificador de transimpedancia. Funcionaban, pero cada decisión de diseño (la resistencia fija, Rf, el filtro óptico, la calibración) quedaba en nuestras manos. Un sensor digital de luz resuelve esas decisiones dentro del chip: contiene fotodiodos con filtros ópticos cuidadosamente elegidos, un amplificador con ganancia programable, un conversor de 16 bits y la interfaz I2C. Entrega un número que, según el modelo, ya son lux o son cuentas de color.
La comodidad tiene una contrapartida: el programador hereda parámetros que configurar. Dos de ellos reaparecen en casi todos los sensores ópticos digitales: el tiempo de integración (cuánto tiempo acumula luz el sensor antes de convertir) y la ganancia. Ambos mueven el sensor a lo largo de la escala de luz, y elegirlos mal produce lecturas saturadas o ruidosas. Este tema recorre cuatro dispositivos: el fototransistor (el eslabón entre lo discreto y lo integrado), el BH1750, el TCS34725 y los sensores de proximidad óptica.
02 · Un fotodiodo con ganancia
El fototransistor
Un fototransistor es un transistor bipolar cuya región de base recibe la luz. Funciona como un fotodiodo (la juntura base-colector genera una fotocorriente) seguido de un transistor que la multiplica por la ganancia β (de 100 a 1000 en un dispositivo típico). El resultado es una corriente mucho mayor, que se puede leer con una simple resistencia sin amplificador operacional. Lo vimos en el tema 7, dentro del TCRT5000 y de los optointerruptores.
| Aspecto | Fotodiodo | Fototransistor |
|---|---|---|
| Corriente de salida | nA a µA | β veces mayor: µA a mA |
| Linealidad | Excelente, en seis o más décadas | Aceptable solo en un rango acotado; la ganancia cambia con la corriente |
| Velocidad | ns a µs | Decenas de µs, según la resistencia de carga |
| Electrónica | Amplificador de transimpedancia | Una resistencia de carga |
| Dependencia de la temperatura | Baja | Mayor (por β y la corriente de oscuridad) |
| Respuesta espectral | 400 a 1100 nm (silicio) | Similar, con máximo en el infrarrojo cercano |
| Uso típico | Medición, comunicación rápida | Detección: barreras, reflexión, receptores IR |
La ganancia tiene un precio: la fotocorriente se multiplica, pero también la corriente de oscuridad y el ruido, y el transistor se satura con luz intensa. Como la ganancia β varía mucho entre unidades y con la temperatura, el fototransistor no es un instrumento de medición: sirve para decidir si hay más o menos luz infrarroja, o si un haz está cortado, como en los sensores de umbral. Se conecta en emisor común (con la resistencia de carga en el colector) o en seguidor de emisor, igual que cualquier transistor. En la práctica, un fototransistor casi siempre se emplea junto con su LED infrarrojo en un módulo.
03 · Lux sin cuentas
BH1750: lux por I2C
El BH1750 es un sensor de iluminancia digital de ROHM. Integra un fotodiodo con una respuesta espectral que imita la del ojo humano, con muy poca sensibilidad al infrarrojo, y devuelve directamente la iluminancia en un entero de 16 bits. Sus datos principales:
- Rango: de 1 a unos 65 000 lux.
- Interfaz: I2C, dirección 0x23 (pin ADDR a masa) o 0x5C (pin ADDR a Vcc).
- Alimentación: de 2,4 a 3,6 V en el chip; los módulos económicos incluyen un regulador y admiten 5 V.
- Conversión: el valor en lux es el registro dividido por 1,2, un factor de exactitud de la hoja de datos.
Se maneja con comandos de un byte. Los modos de medición determinan el compromiso entre resolución y tiempo:
| Modo (continuo) | Comando | Resolución | Tiempo de medición | Lux máximos |
|---|---|---|---|---|
| Alta resolución | 0x10 | 1 lx | 120 ms típico (180 ms máximo) | ≈ 54 612 (65 535 / 1,2) |
| Alta resolución 2 | 0x11 | 0,5 lx | 120 ms típico (180 ms máximo) | ≈ 27 306 (el registro se divide por 2,4) |
| Baja resolución | 0x13 | 4 lx | 16 ms típico (24 ms máximo) | ≈ 54 612 |
Además hay comandos de encendido (0x01), apagado (0x00), reinicio (0x07) y modos de medición única (0x20, 0x21 y 0x23), que miden una vez y se apagan solos, útiles para ahorrar energía. El tiempo de integración se puede ajustar con un registro (MTreg) para trabajar con luz muy escasa o muy intensa, desplazando el rango.
#include <Wire.h>
const uint8_t BH1750 = 0x23; // ADDR a masa
void bhEnviar(uint8_t comando) {
Wire.beginTransmission(BH1750);
Wire.write(comando);
Wire.endTransmission();
}
void bhIniciar() {
bhEnviar(0x01); // encender
bhEnviar(0x10); // medición continua en alta resolución
}
float bhLeerLux() {
if (Wire.requestFrom(BH1750, (uint8_t)2) != 2) return NAN;
uint8_t alto = Wire.read(); // dos lecturas separadas (el orden de evaluación
uint8_t bajo = Wire.read(); // de una expresión con dos read() no está definido)
uint16_t bruto = ((uint16_t)alto << 8) | bajo;
return bruto / 1.2;
}
Dos detalles de uso. La medición tarda hasta 180 ms: no tiene sentido leer más rápido (se obtiene el mismo valor), y la lectura debe planificarse con millis() y no con delay. Y un registro de 65 535 significa saturación: en esas condiciones el valor en lux no es fiable; hay que reducir la sensibilidad (con MTreg) o aceptar que la luz supera el rango. Con luz solar directa (más de 54 000 lux), el BH1750 en alta resolución se satura.
04 · Cuatro canales
TCS34725: color y luz clara
El TCS34725 (de ams) mide la luz en cuatro canales de 16 bits: rojo (R), verde (G), azul (B) y claro (C, sin filtro de color). Cada canal es un conjunto de fotodiodos cubiertos con un filtro de color; todos llevan un filtro bloqueador del infrarrojo, para que el resultado se parezca a lo que ve el ojo. Se comunica por I2C (dirección 0x29) y tiene un identificador (registro 0x12) que vale 0x44, útil para verificar que el chip responde.
Las dos variables que controlan el sensor son:
- El tiempo de integración, fijado por el registro ATIME. El sensor acumula luz durante
(256 − ATIME) × 2,4 ms: de 2,4 ms (un ciclo) a 614 ms (256 ciclos). Cada ciclo suma hasta 1024 cuentas, por lo que el máximo de cada canal es min(65 535, ciclos × 1024). - La ganancia del amplificador analógico: 1×, 4×, 16× o 60×.
| ATIME | Ciclos | Tiempo | Cuenta máxima por canal |
|---|---|---|---|
| 0xFF | 1 | 2,4 ms | 1024 |
| 0xF6 | 10 | 24 ms | 10 240 |
| 0xD5 | 42 | 101 ms | 43 008 |
| 0xC0 | 64 | 154 ms | 65 535 |
| 0x00 | 256 | 614 ms | 65 535 |
Es el mismo compromiso entre rango y resolución del tema 4: un tiempo largo y una ganancia alta ven la penumbra con muchas cuentas pero saturan con luz intensa; un tiempo corto y ganancia baja resisten la luz fuerte a costa de pocas cuentas y más ruido relativo. Los registros se leen en bloque con el bit de autoincremento del comando:
const uint8_t TCS = 0x29;
void tcsEscribir(uint8_t reg, uint8_t valor) {
Wire.beginTransmission(TCS);
Wire.write(0x80 | reg); // el bit 7 indica «comando»
Wire.write(valor);
Wire.endTransmission();
}
bool tcsIniciar(uint8_t atime, uint8_t ganancia) { // ganancia: 0 = 1×, 1 = 4×, 2 = 16×, 3 = 60×
Wire.beginTransmission(TCS);
Wire.write(0x80 | 0x12); // registro de identificación
Wire.endTransmission(false);
if (Wire.requestFrom(TCS, (uint8_t)1) != 1 || Wire.read() != 0x44) return false;
tcsEscribir(0x01, atime); // ATIME: (256 - atime) × 2,4 ms
tcsEscribir(0x0F, ganancia); // CONTROL
tcsEscribir(0x00, 0x01); // PON: encender
delay(3);
tcsEscribir(0x00, 0x03); // PON + AEN: habilitar la conversión de los cuatro canales
return true;
}
bool tcsLeer(uint16_t &c, uint16_t &r, uint16_t &g, uint16_t &b) {
Wire.beginTransmission(TCS);
Wire.write(0xA0 | 0x14); // lectura con autoincremento desde CDATAL
if (Wire.endTransmission(false) != 0) return false;
if (Wire.requestFrom(TCS, (uint8_t)8) != 8) return false;
uint16_t v[4];
for (uint8_t i = 0; i < 4; i++) {
uint8_t bajo = Wire.read();
uint8_t alto = Wire.read();
v[i] = ((uint16_t)alto << 8) | bajo; // cada canal: byte bajo primero
}
c = v[0]; r = v[1]; g = v[2]; b = v[3];
return true;
}
Después de configurar el sensor hay que esperar al menos un tiempo de integración antes de la primera lectura válida; el resto de las lecturas sale una por ciclo. Todo se organiza igual que en las estaciones del tema 13: iniciar, esperar con millis(), leer y validar. El canal claro sirve como medida de la luz total y como denominador de las proporciones de color.
05 · La parte difícil
Del conteo al color
Las cuatro cuentas no son un color: son la luz que llega, que combina la luz que emite la fuente y lo que el objeto refleja de ella. La misma hoja blanca da cuentas muy distintas bajo una lámpara incandescente (rica en rojo), un LED frío (rico en azul) y el sol. Para reconocer el color del objeto hay que separar su contribución de la de la iluminación.
Normalizar
El primer paso es eliminar la intensidad. Dividir los tres canales por el mayor (o por el canal claro) da proporciones que no dependen de cuánta luz haya:
De esas proporciones se obtienen el tono (hue, un ángulo en el círculo de colores), la saturación y el valor (brillo), el espacio HSV. Con el tono se clasifican los colores: rojo cerca de 0°, amarillo 60°, verde 120°, cian 180°, azul 240° y magenta 300°. Con una saturación baja el objeto es blanco o gris, y con un valor bajo, negro.
Balance de blancos
Normalizar quita la intensidad, pero no el color de la luz. Un objeto blanco bajo una lámpara cálida tiene más rojo que azul, y un clasificador por tono lo llamaría «amarillo». La solución es la misma que usan las cámaras: el balance de blancos. Se mide una referencia blanca (una hoja o una pieza de PTFE) bajo la misma iluminación y se obtienen tres factores que igualan sus canales; después, cada medición se multiplica por esos factores. Solo se corrige la luz si la referencia se mide en las mismas condiciones en que se medirán los objetos.
| Iluminación | R · G · B | Proporciones | Clasificación sin balance | Con balance |
|---|---|---|---|---|
| Neutra | 13 144 · 13 144 · 13 144 | 1,00 · 1,00 · 1,00 | Blanco | Blanco |
| Cálida | 18 402 · 13 144 · 6 572 | 1,00 · 0,71 · 0,36 | Amarillo | Blanco |
El balance exige además un entorno controlado: una iluminación estable, una distancia fija entre el sensor y el objeto, y de preferencia una cabina que bloquee la luz ambiente y un LED blanco propio. Un sensor de color en un ambiente sin control da resultados sobre todo ruidosos. Y recordá que la saturación de un canal rompe las proporciones: si el rojo llega al máximo, el cociente rojo/verde deja de ser válido.
06 · Con luz propia
Proximidad óptica
Algunos sensores combinan en el mismo chip un emisor infrarrojo y un fotodetector: el APDS-9960 (que además detecta gestos y color) y la familia VCNL son ejemplos. Detectan la presencia de un objeto cercano de un modo conocido por el tema 7: emiten un pulso de luz infrarroja y miden la cantidad que se refleja. Los fabricantes agregan tres mejoras sobre el reflexivo discreto:
- Emisión pulsada y medición diferencial. Miden con el LED encendido y apagado y restan, de modo que la luz ambiente se cancela (la técnica del tema 7).
- Resultado digital. Entregan un entero por I2C, con ajuste de la corriente del LED y del tiempo de integración.
- Umbrales e interrupción. Se programan un umbral alto y uno bajo, y el sensor activa una salida de interrupción al cruzarlos: es la histéresis por hardware, y permite dormir al microcontrolador.
Lo que mide un sensor de proximidad no es una distancia, sino una cantidad de luz reflejada. Esa cantidad cae aproximadamente con el cuadrado de la distancia, pero también depende de la reflectividad del objeto: una mano clara a 8 cm puede dar la misma cuenta que un objeto oscuro a 3 cm. Por eso se usan para decidir «hay algo cerca» (apagar una pantalla al acercarla al oído, abrir un dispensador) y no para medir distancias. Para medir distancias con exactitud se emplean sensores de tiempo de vuelo (tema 18).
07 · Seguir la luz
Rango dinámico y autorrango
Con sensores de ganancia y tiempo de integración programables, ninguna combinación cubre todas las situaciones. La solución es el autorrango: el programa ajusta la sensibilidad según la señal. La regla general es:
- Si el canal más alto supera el 80–90 % del máximo, hay riesgo de saturación: bajar la ganancia o el tiempo.
- Si el canal más alto está por debajo del 10–20 % del máximo, hay pocas cuentas y el ruido relativo es alto: subir la ganancia o el tiempo.
- Entre ambos límites, dejar como está. La banda entre los dos umbrales es, otra vez, una histéresis: sin ella, el sensor cambiaría de rango en cada medición.
Después de cada cambio hay que esperar una integración completa antes de volver a leer, y conviene normalizar el resultado por la ganancia y el tiempo para que las lecturas de distintos rangos sean comparables:
El orden en que se ajusta importa: el tiempo de integración es más lineal y menos ruidoso que la ganancia, pero cuesta velocidad; la ganancia responde rápido pero amplifica el ruido. Una práctica común es buscar primero el tiempo (hasta un valor aceptable de respuesta) y recurrir a la ganancia cuando el tiempo ya no puede subir. Un caso especial: a pleno sol, ni siquiera la ganancia mínima con 154 ms alcanza, y se acorta el tiempo hasta pocos milisegundos o se atenúa la luz con un difusor.
08 · Elegir
Comparación y elección
| Sensor | Salida | Mide | Exactitud y rango | Uso ideal |
|---|---|---|---|---|
| LDR + divisor | Tensión | Luz, cualitativa | Logarítmico, ±50 % entre unidades; seis décadas | Día/noche, económico |
| Fotodiodo + TIA | Tensión | Irradiancia, lineal | Exacto; dos a tres décadas por Rf | Medición y señales rápidas |
| Fototransistor | Corriente o tensión | Luz infrarroja, cualitativa | Poco lineal | Barreras y reflexión |
| BH1750 | I2C, lux | Iluminancia | 1 a 65 000 lux; respuesta cercana al ojo | Brillo de pantallas, domótica |
| TCS34725 | I2C, R/G/B/C | Color y luz | 16 bits por canal; tiempo y ganancia ajustables | Clasificación de color, balance |
| APDS-9960 / VCNL | I2C, proximidad | Luz reflejada propia | Centímetros; depende del objeto | Detección de presencia |
Una regla práctica: para saber cuánta luz hay con comodidad, BH1750; para reconocer colores, TCS34725 en un entorno controlado; para detectar objetos cercanos, un sensor de proximidad; para pulsos rápidos o la mejor linealidad, un fotodiodo con TIA; para decidir de día o de noche al mínimo costo, un LDR.
09 · Analogía con programación
Lux, color y autorrango en código
Probemos la lógica de este tema sin hardware. Primero, la conversión del registro del BH1750 y su saturación. Después, un modelo simple del TCS34725 (el conteo es proporcional a la luz, el color del objeto, la ganancia y el tiempo, con tope en el máximo), la clasificación del color por tono y el autorrango que busca la mayor ganancia que no sature. El modelo es didáctico: los factores reales los da la hoja de datos.
Python en tu navegador. Los bloques son editables: cambiá los valores y presioná «Ejecutar Python». La primera vez tarda unos segundos en cargar.
import colorsys
# ---- BH1750: registro de 16 bits dividido por 1,2 ----
print("lux reales registro lux calculados ¿saturado?")
for lux in (3, 50, 500, 20_000, 60_000):
bruto = min(65535, round(lux * 1.2))
print(f"{lux:9d} {bruto:8d} {bruto / 1.2:14.1f} {bruto == 65535}")
# ---- TCS34725 (modelo): cuentas = K · lux · reflectancia · ganancia · tiempo ----
K = 0.0652 # cuentas por lux y por ms (modelo)
def canal(lux, reflectancia, ganancia, ciclos):
tiempo = ciclos * 2.4 # ms
maximo = min(65535, ciclos * 1024)
return min(maximo, round(K * lux * reflectancia * ganancia * tiempo)), maximo
def nombre_color(r, g, b):
h, s, v = colorsys.rgb_to_hsv(r, g, b) # tono, saturación y valor
if v < 0.15:
return "negro"
if s < 0.2:
return "blanco" if v > 0.7 else "gris"
grados = h * 360
for limite, nombre in ((20, "rojo"), (70, "amarillo"), (160, "verde"), (200, "cian"),
(260, "azul"), (320, "magenta"), (360, "rojo")):
if grados < limite:
return nombre
print()
objetos = {"rojo": (0.8, 0.1, 0.1), "verde": (0.1, 0.7, 0.15), "azul": (0.1, 0.2, 0.8),
"blanco": (1, 1, 1), "amarillo": (0.85, 0.8, 0.1)}
for nombre, reflectancias in objetos.items():
r, g, b = (canal(500, refl, 4, 42)[0] for refl in reflectancias) # 500 lux, ganancia 4, 101 ms
m = max(r, g, b)
print(f"{nombre:9s} R={r:6d} G={g:6d} B={b:6d} -> {nombre_color(r / m, g / m, b / m)}")
# ---- Un objeto blanco bajo luz cálida: sin y con balance de blancos ----
calida = (1.4, 1.0, 0.5) # la luz tiene más rojo que azul
r, g, b = (canal(500 * peso, 1.0, 4, 42)[0] for peso in calida)
print()
print(f"Blanco bajo luz cálida: R={r} G={g} B={b}")
print(" sin balance:", nombre_color(1, g / r, b / r))
print(" con balance:", nombre_color(1, 1, 1))
# ---- Autorrango: la mayor ganancia que no pasa del 80 % del máximo (154 ms) ----
print()
for lux in (20, 200, 5000, 50_000):
for ganancia in (60, 16, 4, 1):
cuentas, maximo = canal(lux, 1.0, ganancia, 64)
if cuentas < 0.8 * maximo:
break
estado = "OK" if cuentas < 0.8 * maximo else "SATURADO: acortar el tiempo"
print(f"{lux:6d} lux -> ganancia {ganancia:2d}×, {cuentas:5d} cuentas ({estado})")
Resultado: el BH1750 convierte 3 lux en 4 cuentas (3,3 lux, la resolución gruesa de las luces bajas) y 60 000 lux en 65 535, saturado: el valor calculado, 54 612,5 lux, es un tope y no una medida. En el color, cada objeto se clasifica correctamente (rojo, verde, azul, blanco y amarillo). Un blanco bajo luz cálida da R=18 402, G=13 144, B=6 572: sin balance se llama «amarillo» y con balance, «blanco». El autorrango elige ganancia 60× con 20 lux, 16× con 200 lux y 1× con 5000 lux; con 50 000 lux ninguna ganancia alcanza y hay que acortar el tiempo de integración.
Los números dependen del modelo (la constante K es inventada), pero las conclusiones son las del sensor real: la saturación invalida el dato, el color depende de la luz y el rango se sigue con ganancia y tiempo.
10 · Exploración interactiva
Un luxómetro BH1750 y un sensor de color TCS34725
El primer instrumento simula el BH1750: elegí un modo y la iluminancia (en escala logarítmica) y mirá el registro, la conversión a lux, la resolución y la saturación. El segundo simula el TCS34725 apuntando a un objeto bajo una luz: configurá el tiempo de integración y la ganancia, cambiá el objeto y la iluminación, y compará la clasificación del color con y sin balance de blancos. El modelo de conteo es el del programa de Python.
Instrumento 1: BH1750
Instrumento 2: TCS34725 apuntando a un objeto
Recorrido guiado
- Con 500 lux en alta resolución: el registro es 600 y los lux calculados, 500,0. Pasá a la alta resolución 2: el registro se duplica (1200) y la resolución baja a ≈0,4 lux, pero el máximo cae a la mitad.
- Con 3 lux en baja resolución: el valor se cuantiza en pasos de 4 lx (4 lux, un error del 33 %). Es el precio de medir en 16 ms.
- Subí la iluminancia por encima de 54 000 lux: el registro llega a 65 535 y el LED indica saturación. El valor calculado es un tope, no una medida.
- En el instrumento 2, con el objeto rojo, 500 lux, 4× y 101 ms: R es la mayor y el color es «rojo». Cambiá a los demás objetos: cada uno se reconoce.
- Con el objeto amarillo, subí la ganancia a 60×: el rojo y el verde llegan al máximo (43 008) y el estado indica saturación. Las proporciones ya no son las del objeto (el azul pasa de 0,12 a 0,46 respecto del rojo). El nombre del color puede seguir saliendo bien por casualidad, pero el dato no es confiable.
- Con el objeto blanco, marcá «Luz cálida»: sin balance, el color se clasifica como «amarillo». Marcá «balance de blancos»: vuelve a «blanco».
- Con el objeto verde y la luz cálida, probá con y sin balance: verde se mantiene (el tono verde es dominante), pero las proporciones cambian. Con el gris, el balance recupera el nivel de gris; sin balance no se distingue del blanco.
- Bajá la luz a unos 3 a 5 lux con ganancia 1× y 2,4 ms: las cuentas son casi cero y el estado avisa de señal baja. Subí la integración a 154 ms y la ganancia a 16×: se recupera (centenares de cuentas).
Desafío: autorrango a mano
Con el objeto blanco, buscá la mayor ganancia que mantiene los tres canales por debajo del 80 % del máximo para 20 lux, 200 lux y 5000 lux, con 154 ms. Debería salir 60×, 16× y 1×, como en el programa de Python. Con 50 000 lux (el máximo del control), ninguna ganancia alcanza con 154 ms: probá con 2,4 ms. El tiempo de integración es la herramienta que queda cuando la ganancia ya llegó al mínimo.
11 · Método de trabajo
Cómo elegir y usar un sensor de luz o color digital
- Definí lo que necesitás: ¿lux, color, presencia o un umbral? Elegí el sensor por esa respuesta, no por el precio.
- Verificá la respuesta espectral: para lux, un sensor con respuesta cercana al ojo (BH1750); para color, filtros RGB con bloqueo infrarrojo (TCS34725).
- Revisá el rango de la aplicación (interior, exterior, penumbra) y comprobá que no sature en el peor caso.
- Configurá el tiempo y la ganancia (o el modo) de acuerdo con ese rango, y planificá un autorrango si el rango real es amplio.
- Respetá los tiempos de conversión y programalos sin bloquear con
millis(). - Detectá la saturación en cada lectura y tratá un dato saturado como inválido para cualquier cálculo de proporciones.
- Controlá la iluminación y la geometría en las mediciones de color: luz propia, cabina, distancia fija; calibrá con blanco y negro.
- Evitá la luz propia del equipo (LED indicadores, pantallas) y los reflejos de la carcasa.
Si el color «salta» entre mediciones, sospechá primero de la luz ambiente y de la saturación; si los lux son siempre 0, de la dirección I2C o del modo; si el sensor de proximidad siempre detecta, del reflejo de la ventana.
12 · Comprensión
Confusiones frecuentes
«Un fototransistor es un fotodiodo mejor»
Entrega más corriente, pero a costa de linealidad, velocidad y repetibilidad. Sirve para detectar, no para medir.
«El registro del BH1750 son los lux»
Son los lux multiplicados por 1,2 (o 2,4 en el modo de alta resolución 2). Hay que dividir.
«Un sensor de color mide el color del objeto»
Mide la luz que llega, que mezcla la fuente con el objeto. Sin controlar la iluminación y sin balance de blancos, el color varía con la lámpara.
«Más ganancia siempre es mejor»
Aumenta las cuentas y el ruido, y reduce el rango. Con luz intensa satura, y los datos saturados no sirven para calcular proporciones.
«Un sensor de proximidad mide distancias»
Mide luz reflejada, que depende de la reflectividad del objeto. Dos objetos a distancias distintas pueden dar la misma cuenta.
«Con el valor máximo del registro tengo el valor máximo de luz»
Un registro al tope indica saturación: la luz real puede ser mucho mayor y el número no la representa.
13 · Práctica guiada
Predecí antes de comprobar
1. Del registro a los lux
Un BH1750 devuelve los bytes 0x0B y 0xB8. ¿Cuántos lux indica en el modo de alta resolución? ¿Y si el sensor estuviera en el modo de alta resolución 2?
Ver solución
0x0BB8 = 3000. Modo normal: 3000 / 1,2 = 2500 lux. En el modo 2: 3000 / 2,4 = 1250 lux (la misma cuenta representa la mitad de luz). Hay que dividir según el modo configurado.
2. Tiempo de integración
Se configura ATIME = 0xEB en un TCS34725. ¿Cuántos ciclos son, cuánto dura la integración y cuál es la cuenta máxima por canal?
Ver solución
256 − 0xEB (235) = 21 ciclos. Tiempo = 21 × 2,4 = 50,4 ms. Máximo = 21 × 1024 = 21 504 cuentas.
3. ¿Puedo subir la ganancia?
Con ganancia 4× y 101 ms, un canal rojo marca 30 000 (el máximo es 43 008). Se quiere pasar a 16×. ¿Es seguro?
Ver solución
No. Pasar de 4× a 16× multiplica las cuentas por 4: 30 000 × 4 = 120 000, muy por encima de 43 008. El canal se saturaría. Para no pasar del 80 % del máximo se podría subir como mucho hasta 4× × (0,8 × 43 008 / 30 000) ≈ 4,6×; como el siguiente escalón es 16×, hay que quedarse en 4× (o ajustar el tiempo de integración).
4. Clasificar un color
Las proporciones normalizadas de un objeto son R = 0,90, G = 0,85, B = 0,10. ¿Qué tono tiene y cómo se llama?
Ver solución
El mayor es el rojo (0,90); el diferencial es 0,80. Tono = 60° × (G − B) / (máx − mín) = 60° × (0,85 − 0,10) / 0,80 ≈ 56°, entre rojo (0°) y verde (120°): amarillo. La saturación es 0,80 / 0,90 = 0,89: muy colorido.
5. Balance de blancos
Un papel blanco da R = 18 402, G = 13 144, B = 6 572 bajo una lámpara cálida. ¿Qué factores igualan los tres canales al verde?
Ver solución
Factor del rojo = 13 144 / 18 402 ≈ 0,714; del verde = 1; del azul = 13 144 / 6 572 = 2,0. Aplicados a cualquier medición bajo la misma lámpara, corrigen el color de la luz.
6. Elegir el sensor
Elegí BH1750, TCS34725 o un sensor de proximidad para: (a) regular el brillo de una pantalla según la luz de la habitación; (b) clasificar tapitas de colores en una cinta transportadora; (c) apagar un grifo electrónico cuando no hay una mano a menos de 5 cm.
Ver solución
(a) BH1750: lux directos, con respuesta cercana a la del ojo. (b) TCS34725 con iluminación propia, cabina y balance de blancos. (c) Sensor de proximidad con umbrales e interrupción: la luz reflejada indica «hay algo cerca».
14 · Síntesis
Ideas para recordar
- El fototransistor multiplica la fotocorriente por β: sirve para detectar (barreras y reflexión), no para medir, porque es poco lineal y varía con la temperatura.
- El BH1750 entrega un registro de 16 bits cuyo valor en lux es el registro / 1,2 (o / 2,4 en el modo de alta resolución 2); 65 535 indica saturación.
- El modo de baja resolución mide en 16 ms con 4 lx de resolución; los de alta resolución, en 120 ms con 1 o 0,5 lx.
- El TCS34725 mide R, G, B y claro con 16 bits; la integración es (256 − ATIME) × 2,4 ms y la cuenta máxima, min(65 535, ciclos × 1024).
- Tiempo y ganancia desplazan el rango del sensor: más sensibilidad ve la penumbra pero satura antes.
- Un canal saturado invalida las proporciones de color.
- El color que se mide mezcla la luz y el objeto; se normaliza para quitar la intensidad y se aplica balance de blancos para quitar el color de la luz.
- Un sensor de proximidad mide luz reflejada, no distancia; se usa con umbrales e histéresis.
- El autorrango sube o baja la sensibilidad con una banda de histéresis (10–20 % y 80–90 % del máximo) y normaliza el resultado por ganancia y tiempo.
¿Listo para el tema 16?
Antes de avanzar, convertí un registro 0x1388 del BH1750 en lux, calculá el máximo de cuentas de un TCS34725 con ATIME = 0xF6 y explicá por qué un objeto blanco puede clasificarse como amarillo. Si podés justificar las tres respuestas, ya sabés usar los sensores digitales de luz y color.
En el próximo tema armamos un taller: luz nocturna automática, que reúne un sensor de luz, la histéresis, el filtrado y la atenuación con PWM en un único programa.