
Chisme 150 del Lince: datalogger micro:bit, la caja negra con reloj
Una mañana de otoño, la cueva de Sierra Bermeja amaneció revolucionada. Víctor Vílchez, el Lince de la Noche, entró con el móvil en la mano.
—¡Mira esto! Unos de la tele han estado anoche en el puerto de Peñas Blancas con aparatos que pitan y lucecitas. Dicen que han detectado «una presencia». El aparato marcaba campo magnético altísimo.
La Gata Montesa ni levantó la vista.
—¿Y qué había al lado del aparato?
—Pues… ellos. Con sus focos, sus baterías, sus móviles…
—Entonces ya tienes varios sospechosos antes que un fantasma.
El Lince se quedó pensando.
—Pero lo han visto miles de personas.
—Verlo no lo hace verdad. Si alguien dice que existe algo extraordinario, tiene que traer pruebas. Y si no las hay, se buscan. —La Gata sacó una micro:bit y un reloj diminuto con una pila amarilla—. Vamos a dejar esto grabando toda la noche: temperatura, luz, sonido, movimiento y campo magnético, cada minuto, con la hora exacta. Mañana veremos qué pasó de verdad.
—¿Y si sale el fantasma?
—Entonces seremos los primeros en tener pruebas. Pero apuesto a que saldrá otra cosa.
Introducción
En este chisme 150 vas a convertir la micro:bit V2 en una caja negra: un aparato que hace registro de datos de todo lo que mide, con la fecha y la hora reales, aunque esté desenchufada del ordenador. Al día siguiente sacas los datos como una hoja de cálculo. En otras palabras: un datalogger micro:bit con reloj. Este reloj ya lo usamos con la ESP32 en el chisme 142.
Usaremos solo los sensores que ya lleva la micro:bit y un reloj DS3231, porque la micro:bit no sabe qué hora es: solo cuenta milisegundos desde que se enciende.
En la página del chisme 150 tienes todo explicado paso a paso: la conexión, cómo poner el reloj en hora, el programa troceado y explicado, cómo sacar los datos y un simulador para practicar sin placa.
Y una idea para toda la clase: conocer Sierra Bermeja es la mejor forma de protegerla. Para eso hay que medir, guardar los datos y analizarlos.
Qué necesitamos
- Una micro:bit V2 (el registro de datos no existe en la V1).
- La placa de ampliación del kit Keyestudio.
- Un reloj DS3231 de Keyestudio (pines SCL, SDA, + y −) y 4 cables Dupont.
- Un portapilas o un cargador USB para dejarla grabando.
- Un ordenador con Chrome o Edge y MakeCode.
Qué guarda cada fila
| Columna | Qué es | De dónde sale |
|---|---|---|
| fecha, hora | Fecha y hora reales | Reloj DS3231 |
| temp_microbit | Temperatura en °C | Chip de la micro:bit |
| temp_reloj | Temperatura en °C (cuartos de grado) | Sensor interno del DS3231 |
| luz | Luz media (0-255) | Matriz de LEDs |
| sonido_max | Sonido más alto del intervalo (0-255) | Micrófono (solo el nivel, no graba audio) |
| movimiento | Cuánto ha variado la aceleración | Acelerómetro |
| magnetico_uT | Campo magnético en microteslas | Brújula |
Es una buena forma de ver el registro de datos de la micro:bit: cada fila es un momento y cada columna una medida.
Conexión
El reloj va a la cabecera I2C de la derecha de la placa de ampliación (20, 19, V2, G):
| DS3231 | Placa de ampliación |
|---|---|
| SCL | 19 |
| SDA | 20 |
| + | V2 |
| − | G |
Importante: el puente de V2 tiene que estar en 3,3 V. Si está en 5 V, las líneas de datos llegarían a 5 V a la micro:bit, que solo admite 3,3 V.

El programa
Este programa es largo para hacerlo con bloques, así que lo pegamos en la pestaña JavaScript de MakeCode. Antes hay que añadir la extensión datalogger (Extensiones → datalogger); si no, sale «Cannot find name ‘datalogger’».
// Chisme 150 - La caja negra del Lince: micro:bit V2 + reloj DS3231
// Necesita la extensión "datalogger"
let intervalo = 1000
let grabando = false
let sonidoMax = 0
let fuerzaMax = 0
let fuerzaMin = 99999
let luzSuma = 0
let luzCuenta = 0
let dia = 0
let mes = 0
let anio = 0
let hora = 0
let minuto = 0
let segundo = 0
let borrarPedido = 0
let ultimaFila = 0
// --- Reloj DS3231 (dirección I2C 104) ---
function bcdADecimal (b: number) {
return (b >> 4) * 10 + (b & 15)
}
function decimalABcd (d: number) {
return Math.idiv(d, 10) * 16 + d % 10
}
function dos (n: number) {
return n < 10 ? "0" + n : "" + n
}
function leerReloj () {
pins.i2cWriteNumber(104, 0, NumberFormat.UInt8BE)
let buf = pins.i2cReadBuffer(104, 7)
segundo = bcdADecimal(buf[0] & 127)
minuto = bcdADecimal(buf[1])
hora = bcdADecimal(buf[2] & 63)
dia = bcdADecimal(buf[4])
mes = bcdADecimal(buf[5] & 31)
anio = 2000 + bcdADecimal(buf[6])
}
function ponerFechaHora (d: number, me: number, a: number, h: number, mi: number, s: number) {
let b = pins.createBuffer(8)
b[0] = 0
b[1] = decimalABcd(s)
b[2] = decimalABcd(mi)
b[3] = decimalABcd(h)
b[4] = 1
b[5] = decimalABcd(d)
b[6] = decimalABcd(me)
b[7] = decimalABcd(a - 2000)
pins.i2cWriteBuffer(104, b)
}
function temperaturaReloj () {
pins.i2cWriteNumber(104, 17, NumberFormat.UInt8BE)
let t = pins.i2cReadBuffer(104, 2)
let entero = t[0]
if (entero > 127) {
entero = entero - 256
}
return entero + (t[1] >> 6) * 0.25
}
function empezar (ms: number, texto: string) {
intervalo = ms
grabando = true
basic.showString(texto)
basic.clearScreen()
ultimaFila = 0
}
// --- Botones ---
input.onButtonPressed(Button.A, function () {
empezar(1000, "1s")
})
input.onButtonPressed(Button.B, function () {
empezar(60000, "1m")
})
input.onButtonPressed(Button.AB, function () {
grabando = false
basic.showIcon(IconNames.No)
})
input.onLogoEvent(TouchButtonEvent.Pressed, function () {
if (input.runningTime() - borrarPedido < 3000) {
grabando = false
datalogger.deleteLog(datalogger.DeleteType.Full)
datalogger.setColumnTitles("fecha", "hora", "temp_microbit", "temp_reloj", "luz", "sonido_max", "movimiento", "magnetico_uT")
basic.showIcon(IconNames.Skull)
} else {
borrarPedido = input.runningTime()
basic.showString("?")
}
})
datalogger.onLogFull(function () {
grabando = false
basic.showIcon(IconNames.Sad)
})
// --- Al iniciar ---
// PONER EL RELOJ EN HORA (solo una vez): quita las // de la línea de abajo, pon la fecha y hora
// de dentro de 1 minuto, descarga, y después vuelve a poner las // y descarga otra vez.
// ponerFechaHora(24, 10, 2026, 13, 45, 0)
datalogger.includeTimestamp(FlashLogTimeStampFormat.None)
datalogger.mirrorToSerial(true)
datalogger.setColumnTitles("fecha", "hora", "temp_microbit", "temp_reloj", "luz", "sonido_max", "movimiento", "magnetico_uT")
leerReloj()
if (anio == 2000) {
// el reloj no tiene fecha: avisamos
basic.showString("HORA?")
}
basic.showIcon(IconNames.Happy)
// --- Muestreo rápido: 10 veces por segundo ---
basic.forever(function () {
sonidoMax = Math.max(sonidoMax, input.soundLevel())
let f = input.acceleration(Dimension.Strength)
fuerzaMax = Math.max(fuerzaMax, f)
fuerzaMin = Math.min(fuerzaMin, f)
luzSuma += input.lightLevel()
luzCuenta += 1
basic.pause(100)
})
// --- Grabación: una fila cada intervalo (se comprueba cada 100 ms) ---
basic.forever(function () {
if (grabando && input.runningTime() - ultimaFila >= intervalo) {
ultimaFila = input.runningTime()
leerReloj()
datalogger.log(
datalogger.createCV("fecha", dos(dia) + "/" + dos(mes) + "/" + anio),
datalogger.createCV("hora", dos(hora) + ":" + dos(minuto) + ":" + dos(segundo)),
datalogger.createCV("temp_microbit", input.temperature()),
datalogger.createCV("temp_reloj", temperaturaReloj()),
datalogger.createCV("luz", luzCuenta > 0 ? Math.round(luzSuma / luzCuenta) : 0),
datalogger.createCV("sonido_max", sonidoMax),
datalogger.createCV("movimiento", fuerzaMax - fuerzaMin),
datalogger.createCV("magnetico_uT", Math.round(input.magneticForce(Dimension.Strength)))
)
sonidoMax = 0
fuerzaMax = 0
fuerzaMin = 99999
luzSuma = 0
luzCuenta = 0
led.plot(4, 4)
basic.pause(50)
led.unplot(4, 4)
}
basic.pause(100)
})
Lo que hace, en resumen (en la página del chisme está explicado línea a línea):
- Reloj: habla con el DS3231 por I2C (dirección 104). El reloj guarda los números en BCD (cada cifra en 4 bits) y las funciones
bcdADecimalydecimalABcdlos traducen. - Muestreo rápido: 10 veces por segundo mira el sonido, el movimiento y la luz, y se queda con el máximo del sonido, la variación del movimiento y la media de la luz.
- Grabación: cuando toca, guarda una fila con las 8 columnas con
datalogger.log. - Botones: A graba cada segundo, B cada minuto, A+B para y el logo dos veces borra.
Poner el reloj en hora (solo una vez)
- Busca la línea
// ponerFechaHora(24, 10, 2026, 13, 45, 0). - Borra las
//y pon la fecha y la hora de dentro de un minuto. - Pulsa Descargar justo a esa hora.
- Vuelve a poner las
//y descarga otra vez.
La pila del reloj lo mantiene en hora aunque desenchufes todo. Si al encender la micro:bit sale «HORA?», el reloj no tiene fecha.
Cómo se usa
- A: graba una fila cada segundo (para probar).
- B: graba una fila cada minuto (para toda la noche).
- A+B: para. Lo grabado se queda en la memoria.
- Logo dos veces en menos de 3 segundos: borra el registro.
- Un punto en la esquina parpadea cada vez que guarda una fila. Si sale una cara triste, la memoria está llena.
Para dejarla toda la noche: desconéctala del ordenador, ponle el portapilas, pulsa B y déjala donde no la muevan ni le dé el sol directo.
Sacar los datos y enviarlos
- Para con A+B y conecta la micro:bit al ordenador.
- Abre la unidad MICROBIT y haz doble clic en MY_DATA: se abre en el navegador con una tabla y una gráfica.
- Pulsa Download para guardar los datos en CSV.
- Cámbiale el nombre (por ejemplo,
sierra-bermeja-24-10-2026.csv) y guárdalo en tu carpeta. - Escribe un correo nuevo, pulsa Adjuntar (el clip), elige el CSV y envíalo a tu profesor.
En el simulador de la página puedes practicar todo esto, y hasta descargar un CSV simulado:

Tienes la guía oficial del registro de datos en microbit.org (data logging), y si te interesa el pensamiento crítico, empieza por el escepticismo científico.
Nuestros datos reales
Así quedaron unos segundos de nuestra prueba, con la placa junto al portátil y las cortinas echadas:
| fecha | hora | temp_microbit | temp_reloj | luz | sonido_max | movimiento | magnetico_uT |
|---|---|---|---|---|---|---|---|
| 24/10/2026 | 13:35:47 | 30 | 28.25 | 0 | 124 | 440 | 121 |
| 24/10/2026 | 13:35:48 | 30 | 28.25 | 0 | 121 | 40 | 81 |
| 24/10/2026 | 13:36:00 | 30 | 28.25 | 0 | 78 | 72 | 55 |
| 24/10/2026 | 13:36:08 | 30 | 28.25 | 0 | 0 | 125 | 82 |
| 24/10/2026 | 13:36:10 | 30 | 28.25 | 0 | 28 | 186 | 83 |
Y ya dan para pensar:
- La micro:bit marca 30 °C y el reloj 28,25 °C. Dos termómetros, dos medidas: el chip de la micro:bit se calienta al funcionar.
- La luz es 0 porque la habitación estaba casi a oscuras: la matriz de LEDs es poco sensible. Un 0 no significa «no hay luz»: significa «menos de lo que el sensor puede ver».
- El campo magnético va de 55 a 121 µT. El de la Tierra en España ronda los 45 µT: lo que lo sube es el portátil que había al lado.
- Falta el segundo 13:36:09: la fila llegó unas décimas tarde y el reloj ya marcaba el siguiente. Un ejemplo real de que los aparatos también tienen sus límites.
Pensamiento crítico: ¿fantasmas en Sierra Bermeja?
Hay programas y vídeos en los que alguien pasea por un lugar oscuro con aparatos que pitan y lucecitas que se encienden, y dice que ha detectado «una presencia». Con esta caja negra puedes comprobar lo fácil que es hacer subir una lectura: acerca un móvil, un altavoz, un imán o un cable con corriente, y el campo magnético se dispara. Da una palmada y salta el sonido. Mueve la mesa y aparece «actividad».
Que un número suba no dice por qué ha subido. Un buen científico busca primero las causas sencillas y, si alguien afirma algo extraordinario, le pide pruebas que otros puedan comprobar.
Y una pregunta para pensar: si de verdad alguien tuviera pruebas de algo así, ¿no las compartiría con todo el mundo para que se estudiaran? A veces lo que se busca no es la verdad, sino la atención… y lo que esa atención da. Merece la pena admirar a quien hace cosas útiles: quien cura, quien enseña, quien limpia, quien investiga. Lo demás, como en el circo, puede entretener, pero no conviene confundirlo con la realidad.
Qué estamos midiendo realmente
- Muestreo: si solo miramos una vez por minuto, nos perdemos lo que pasa entre medias. Por eso guardamos el máximo del sonido y la variación del movimiento de todo el intervalo.
- Resolución y límites: la luz de la matriz va de 0 a 255 y en interior oscuro se queda en 0. El reloj mide la temperatura en cuartos de grado.
- Dato frente a medida: el campo magnético no dice «qué» lo produce; solo cuánto hay.
- Capacidad (estimación): caben del orden de 2.000 filas de 8 columnas. A una fila por minuto, más de un día. Si sale la cara triste, se ha llenado.
Para el aula
- Predice: antes de mirar los datos de la noche, dibuja cómo crees que serán las gráficas de luz, temperatura y sonido. Después compáralas.
- Busca la causa: marca en la gráfica cada pico de sonido o de campo magnético e intenta explicarlo (una puerta, el limpiador, un aparato que se enciende).
- Dos termómetros: calcula la diferencia media entre
temp_microbitytemp_reloj. ¿Es siempre la misma? - Experimento del fantasma: un grupo provoca un pico a escondidas y otro tiene que averiguar qué lo causó solo con los datos.
- Debate: ¿qué pruebas pedirías a alguien que dice haber detectado algo extraordinario?
Retos por niveles
2º de ESO
- Reto 1: haz que funcione, graba un minuto y abre MY_DATA.
- Reto 2: descarga el CSV, ábrelo en una hoja de cálculo y haz una gráfica de una columna.
3º de ESO
- Reto 3: cambia el intervalo de B a 5 minutos (300000 ms). ¿Cuántas horas cabrían ahora?
- Reto 4: añade una columna con la aceleración x (
input.acceleration(Dimension.X)) para saber hacia dónde se inclina la placa. - Reto 5: deja la caja negra grabando una noche entera y señala en la gráfica el amanecer.
4º de ESO
- Reto 6: añade el LM35 del chisme 147 como tercer termómetro y compara los tres.
- Reto 7: añade el sensor UV del chisme 148 y mide la radiación a lo largo de un día.
- Reto 8: convierte el proyecto en una investigación de ciencia ciudadana: varias cajas negras en distintos sitios del instituto la misma noche, y compara los datos.
Para enseñárselo a los pequeños (versión monitor)
Esta sección es para el alumnado de 1º de Bachillerato que da el taller a los de ESO.
Guion de 10 minutos
- (2 min) La pregunta: enseña una lectura que «sube de golpe» y pregunta: «¿Qué ha pasado aquí?». Deja que propongan explicaciones, aunque sean fantásticas.
- (3 min) Grabar: pulsa A y deja que ellos provoquen picos: palmada, móvil cerca, mover la placa.
- (3 min) Ver los datos: abre MY_DATA y busca cada pico en la tabla.
- (2 min) Conclusión: «Que un número suba no dice por qué sube. Hay que buscar la causa y comprobarla».
Preguntas que hacer
- ¿Por qué necesitamos un reloj si la micro:bit ya cuenta el tiempo?
- ¿Qué prueba te convencería de que algo extraordinario es real?
Errores típicos
- Olvidar la extensión datalogger: errores en rojo al pegar el programa.
- El puente de V2 en 5 V.
- No volver a poner las
//en la línea de poner en hora: el reloj se reinicia en una hora antigua. - Esperar luz en una habitación oscura: la luz da 0.
Lo que no hay que darles hecho: la explicación de cada pico. Que la busquen ellos en los datos.
Qué hemos aprendido
Has convertido la micro:bit en una caja negra que hace registro de datos con la fecha y la hora reales, has visto cómo se habla con un reloj por I2C, qué es el muestreo y por qué un número que sube no es una prueba de nada por sí solo. Los datos de la noche se quedan en un CSV listo para analizar.
A la mañana siguiente, el Lince y la Gata abrieron MY_DATA. A las 3:12 había un pico de campo magnético… justo cuando el Lince había dejado el móvil cargando al lado de la caja negra.
—Vaya —dijo el Lince—. El fantasma era yo.
—Lo bueno de los datos —dijo la Gata Montesa— es que no se pueden convencer de nada. Solo cuentan lo que pasó.



