
Chismes del Lince 23: La estación del tiempo del Lince (micro:bit, Bluetooth y móvil)
Hasta ahora la micro:bit nos ha servido de contador de pasos, de brújula, de nivel y de mando de juego. Hoy la convertimos en una estación del tiempo: mide la temperatura, la luz y el ruido, los manda al móvil por Bluetooth y la página los dibuja en una gráfica mientras grabas. Podrás marcar momentos («Inicio del eclipse», «Entramos al aula»…) y descargar todo en un archivo para abrirlo en Excel.
La hemos pensado para el eclipse del verano: dejarla midiendo durante horas y ver después qué pasó con la luz y la temperatura mientras la Luna tapaba el Sol. Vamos a hacer una estación del tiempo con micro:bit.
Antes de empezar, un aviso importante: estas medidas son aproximadas. La micro:bit no es una estación meteorológica de verdad. Sirve para ver cómo cambian las cosas (¿baja la luz?, ¿cuándo?, ¿cuánto más o menos?), pero no para dar valores exactos. Los números que verás no coinciden con los de un termómetro, un luxómetro o un sonómetro, y no se pueden comparar con datos oficiales. Más abajo te explicamos por qué.
Lo que mide, de verdad, cada sensor
| Medida | Qué mide en realidad | Qué esperar |
|---|---|---|
| Temperatura (°C) | La temperatura del chip de la micro:bit, no la del aire | Se calienta con la propia placa, con el sol directo y con tus manos. Sale en números enteros y puede diferir unos grados de un termómetro. Mejor en la sombra y sin tocarla |
| Luz (%) | La micro:bit no tiene sensor de luz: usa los LEDs de la pantalla como si fueran sensores | Es un valor relativo de 0 a 255 que la página muestra como porcentaje. No son lux. A pleno sol se satura (llega al máximo y ya no distingue cambios) |
| Ruido (%) | El micrófono de la micro:bit V2 | Valor relativo de 0 a 255, no son decibelios. Cada punto guardado recoge el máximo de ese intervalo, para no perder los ruidos cortos |
Por eso la página lo dice en la cabecera («Medidas aproximadas») y en la guía, y te avisa en rojo cuando la luz o el ruido llegan al máximo y la medida se ha saturado.
Estación del tiempo con micro:bit
Lo que necesitas
- Un micro:bit V2 (el ruido necesita el micrófono) con su portapilas.
- Un móvil Android con Chrome, con el Bluetooth y la ubicación encendidos. En iPhone, Safari no sirve: hay que abrir la página en el navegador Bluefy.
- Un papel blanco o un plástico translúcido para tapar los LEDs.
- Un cargador para el móvil, si vas a grabar durante horas.
- El ordenador con MakeCode para programar.
Paso 1. Programa el micro:bit
Crea un proyecto nuevo en MakeCode y usa solo bloques.
- Añade la extensión Bluetooth (Extensiones → Bluetooth). No añadas la de Radio.
- Monta este programa:
al iniciar
bluetooth servicio uart
para siempre
uart bluetooth escribir líneacon ununirque lleve, en este orden:temperatura (°C),",",nivel de luz,","ynivel de sonidopausa (ms) 200
Los tres bloques de medida están en Entrada (temperatura, nivel de luz, nivel de sonido). Para añadir más piezas al unir, pulsa el + del bloque.

Si prefieres JavaScript, cambia al modo JavaScript, pega esto y vuelve a Bloques; MakeCode lo convierte solo:
bluetooth.startUartService()
basic.forever(function () {
bluetooth.uartWriteLine("" + input.temperature() + "," + input.lightLevel() + "," + input.soundLevel())
basic.pause(200)
})
No pongas iconos ni texto en la pantalla de LEDs. Los LEDs encendidos interfieren con la medida de la luz, porque la micro:bit usa esos mismos LEDs para medirla.
Paso 2. Sin emparejamiento (muy importante)
Antes de descargar, hay que cambiar un ajuste para que la página pueda conectar sin pedir códigos:
- Pulsa el engranaje ⚙️ → Configuración del proyecto.
- Marca No se requiere emparejamiento (No Pairing Required: Anyone can connect via Bluetooth).
Paso 3. Pásalo al micro:bit
- Descarga el programa y cópialo a la unidad MICROBIT.
- Espera a que deje de parpadear el led amarillo de atrás.
- Reinicia el micro:bit con el botón de atrás.
Si cambias algo del programa, repite los pasos 2 y 3.
Paso 4. Prepara el móvil
- Bluetooth y ubicación encendidos.
- Si en Ajustes → Bluetooth aparece “BBC micro:bit”, pulsa Olvidar. No hay que emparejarla desde ahí.
- Cierra cualquier otra app que use el micro:bit.
Paso 5. Abre la página y conecta
- Abre en Chrome, escribiendo la dirección directamente: https://montesteam.org/app/chisme-23-estacion.html
- Pulsa Conectar micro:bit.
- Elige BBC micro:bit […] en la lista.
- Cuando la página ponga Conectado a…, verás los tres medidores moverse en directo, cada uno con su barra.
Paso 6. Mide, graba y marca
- Elige cada cuánto guardar un punto: cada 1, 2, 5, 10, 30 o 60 segundos. Cada punto guardado es el promedio de la temperatura y de la luz, y el máximo del ruido en ese intervalo. Para varias horas, 10 o 30 segundos van bien.
- Pulsa Empezar a grabar. La página pide mantener la pantalla encendida y va guardando los datos en el móvil cada poco: si se cierra la pestaña, no se pierden.
- Con el selector de la gráfica puedes ver la temperatura, la luz o el ruido, con las horas en el eje.
- Con Marcar dejas una señal con nombre en el momento exacto: Inicio del eclipse, Inicio de la totalidad, Fin de la totalidad, Fin del eclipse, Entramos al aula, Salimos al patio u Otro momento. Aparece como una línea vertical en la gráfica y como una nota en el archivo.
- Descargar CSV te da un archivo con la hora, los segundos, la temperatura, la luz, el ruido y la nota. Usa «;» como separador y coma decimal para que Excel en español lo abra bien.
- Borrar datos vacía todo, por si quieres empezar una medición nueva. Descarga el CSV antes.
Si la conexión se corta, la página reintenta conectar sola hasta 20 veces. Mantén la micro:bit cerca y encendida; los datos ya guardados no se pierden.
Prueba antes, con un día normal
No esperes al día del eclipse para ver cómo se comporta. Un día cualquiera:
- Graba un punto cada 5 segundos.
- Pasa la micro:bit de la sombra al sol y de vuelta, y marca cada cambio.
- Compara la gráfica con lo que ves y con un termómetro de verdad. ¿Cuánto se parece? ¿Cuánto tarda la temperatura en reaccionar? ¿La luz se satura en el sol aunque tenga el papel?
Así sabrás qué esperar y podrás explicar los datos del eclipse con honestidad.
Para el eclipse
- Tapa los LEDs con un papel blanco o un plástico translúcido. A pleno sol la luz se satura y no veríamos el cambio.
- El móvil, enchufado, con la pantalla encendida y Chrome abierto en la página, durante todo el rato.
- La micro:bit con su portapilas, fuera de la mano y, para la temperatura, mejor en un sitio donde no le dé el sol directo.
- Marca los momentos clave con el botón Marcar según los vayáis viendo.
- Recuerda: la estación mide, pero no protege tus ojos. Para mirar el eclipse, usa siempre gafas de eclipse homologadas. No mires al Sol directamente, ni siquiera cuando esté casi tapado.
Y cuando analicéis los datos, tened presente lo del principio: son medidas aproximadas. Lo interesante no es el número exacto, sino la forma de la curva: cuándo empieza a bajar la luz, cuándo toca fondo, cuándo se recupera, y si la temperatura la sigue (y con cuánto retraso).
Retos para clase
- Antes del eclipse, predecid cómo será la gráfica de la luz y de la temperatura. Después compararla con la real.
- Medid con la estación y con un termómetro de verdad a la vez. ¿Cuántos grados de diferencia hay? ¿Es siempre la misma?
- Comparad el ruido del aula con el del patio. ¿Qué momentos del recreo salen más marcados?
- Pasad el CSV a una hoja de cálculo y haced vuestra propia gráfica.
- Reto avanzado: ¿cómo mejoraríais la estación para que los datos fueran más fiables? (Pensad en dónde se coloca, en cómo se protege del sol y en qué otros sensores usaríais.)
Si algo falla
- No aparece en la lista: comprueba que está encendido, que el programa está descargado y que activaste «No se requiere emparejamiento».
- Se conecta pero los medidores no se mueven: revisa que
bluetooth servicio uartesté en «al iniciar» y que elunirlleve las tres medidas separadas por comas. - La luz marca siempre el máximo: la medida está saturada. Tapa los LEDs con papel blanco o ponla en la sombra.
- La luz sale rara o salta: comprueba que no haya nada mostrándose en la pantalla de LEDs.
- El ruido no cambia nunca: el micrófono solo existe en la micro:bit V2.
- La temperatura sube sola: el chip se calienta con el sol y con la mano. Déjala en la sombra y sin tocarla.
- Excel lo abre todo en una columna: al abrir el archivo, indica que el separador es el punto y coma.
- La pantalla del móvil se apaga: conecta el cargador y mantén Chrome abierto en la página.
- En iPhone no conecta: abre la página con Bluefy.
Qué hemos aprendido
Un sensor no da «la verdad»: da una medida aproximada, y saber cuánto fiarnos de ella es parte de la ciencia. Hemos visto que la micro:bit mide la temperatura de su chip, que usa sus LEDs para medir la luz y que el micrófono da valores relativos. Por eso nos fijamos en los cambios y no en el valor exacto. También hemos aprendido a promediar y a quedarnos con el máximo, a marcar momentos para poder interpretar los datos después y a sacarlos en un CSV. Y, sobre todo, que contar con claridad los límites de nuestras medidas hace nuestros datos más útiles, no menos.

Datos para WordPress
- Título: Chismes del Lince 23: La estación del tiempo del Lince (micro:bit, Bluetooth y móvil)
- Slug: chismes-del-lince-23-estacion-del-tiempo-microbit
- Extracto SEO: Convierte la micro:bit en una estación del tiempo: temperatura, luz y ruido en el móvil por Bluetooth, con gráfica y CSV. Medidas aproximadas.
- Etiquetas: estación del tiempo, micro:bit, Bluetooth, Web Bluetooth, sensores, eclipse, temperatura, luz, ruido, CSV, makecode, programación con bloques, Chismes del Lince, steam
HTML
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<title>Chisme 23 · La estación del tiempo del Lince</title>
<style>
:root{
--bg:#eef2ef; --ink:#10201c; --soft:#4d625b; --card:#ffffff; --line:#cfdad5;
--pine:#1f5b4a; --slow:#2563a8; --ok:#1f7a4d; --norte:#c8321f; --oro:#b8892b;
box-sizing:border-box; padding-bottom:env(safe-area-inset-bottom,0px);
}
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]){
--bg:#0f1a17; --ink:#e8f1ed; --soft:#9db3aa; --card:#172622; --line:#2a3d37;
--pine:#5fc4a2; --slow:#7db3ee; --ok:#6fd89f; --norte:#ff6a55; --oro:#e0b45a;}}
:root[data-theme="dark"]{--bg:#0f1a17; --ink:#e8f1ed; --soft:#9db3aa; --card:#172622; --line:#2a3d37;
--pine:#5fc4a2; --slow:#7db3ee; --ok:#6fd89f; --norte:#ff6a55; --oro:#e0b45a;}
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--ink);font:17px/1.4 "Trebuchet MS","Segoe UI",system-ui,sans-serif}
.tira{height:4.4rem;padding-top:env(safe-area-inset-top,0px);background:#e8b84a;overflow:hidden;box-sizing:content-box}
.tira img{display:block;width:100%;height:4.4rem;object-fit:cover;object-position:50% 40%}
main{max-width:32rem;margin:0 auto;padding:.8rem 1rem 2rem}
h1{font-size:1.25rem;margin:.1rem 0 .1rem;text-align:center}
.sub{color:var(--soft);margin:0 0 .7rem;font-size:.88rem;text-align:center}
button,select{font:inherit}
button{font-weight:700;border:2px solid var(--pine);background:var(--pine);color:var(--bg);
border-radius:.8rem;padding:.6rem 1rem;min-height:2.9rem;cursor:pointer}
button.alt{background:transparent;color:var(--pine)}
button:disabled{opacity:.5;cursor:not-allowed}
button:focus-visible,select:focus-visible{outline:3px solid var(--slow);outline-offset:2px}
.fila{display:flex;gap:.5rem;justify-content:center;flex-wrap:wrap}
#estado{margin:.6rem 0 .1rem;color:var(--soft);min-height:1.4em;text-align:center}
#ayuda{margin:0 0 .4rem;color:var(--soft);font-size:.85rem;min-height:1em;text-align:center}
.med{display:grid;grid-template-columns:repeat(3,1fr);gap:.5rem;margin:.5rem 0}
.m{background:var(--card);border:1px solid var(--line);border-radius:.8rem;padding:.5rem .6rem;text-align:center}
.m b{display:block;font-size:1.7rem;line-height:1.1;font-variant-numeric:tabular-nums}
.m span{color:var(--soft);font-size:.8rem}
.barra{height:.5rem;border-radius:.3rem;background:var(--line);margin-top:.35rem;overflow:hidden}
.barra i{display:block;height:100%;width:0;transition:width .25s}
#aviso{color:var(--norte);font-weight:700;font-size:.9rem;text-align:center;min-height:1.2em}
.graf{background:var(--card);border:1px solid var(--line);border-radius:.8rem;padding:.5rem;margin:.5rem 0}
.seg{display:flex;gap:.3rem;margin-bottom:.4rem}
.seg button{flex:1;min-height:2.4rem;padding:.3rem;font-size:.9rem;background:transparent;color:var(--pine)}
.seg button[aria-pressed="true"]{background:var(--pine);color:var(--bg)}
canvas{width:100%;height:11rem;display:block}
.ajustes{display:grid;gap:.5rem;background:var(--card);border:1px solid var(--line);border-radius:.8rem;padding:.7rem;margin:.5rem 0}
.ajustes label{display:block;font-size:.9rem}
select{width:100%;padding:.45rem;border-radius:.6rem;border:2px solid var(--line);background:var(--bg);color:var(--ink)}
.dos{display:grid;grid-template-columns:1fr auto;gap:.5rem;align-items:end}
.nota{color:var(--soft);font-size:.85rem;text-align:center;margin:.4rem 0}
.guia{background:var(--card);border:1px solid var(--line);border-radius:.8rem;padding:.2rem .9rem;margin-top:.8rem}
.guia summary{font-weight:700;cursor:pointer;padding:.6rem 0}
.guia ol,.guia ul{padding-left:1.2rem;margin:.2rem 0 .6rem}
</style>
</head>
<body>
<header class="tira"><img alt="MonteSTEAM: el lince entre pinos y montañas" src="data:image/jpeg;base64,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"></header>
<main>
<h1>La estación del tiempo del Lince</h1>
<p class="sub">Medidas aproximadas: la temperatura es la del chip; la luz y el ruido son valores relativos.</p>
<div class="fila">
<button id="conectar">Conectar micro:bit</button>
<button id="rec" class="alt" disabled>Empezar a grabar</button>
</div>
<div id="estado" role="status">Sin conectar.</div>
<div id="ayuda"></div>
<div class="med">
<div class="m"><span>Temperatura</span><b id="vT">—</b><div class="barra"><i id="bT" style="background:var(--norte)"></i></div></div>
<div class="m"><span>Luz</span><b id="vL">—</b><div class="barra"><i id="bL" style="background:var(--oro)"></i></div></div>
<div class="m"><span>Ruido</span><b id="vR">—</b><div class="barra"><i id="bR" style="background:var(--slow)"></i></div></div>
</div>
<div id="aviso" aria-live="polite"></div>
<div class="graf">
<div class="seg" role="group" aria-label="Qué mostrar en la gráfica">
<button data-s="T" aria-pressed="true">Temperatura</button>
<button data-s="L" aria-pressed="false">Luz</button>
<button data-s="R" aria-pressed="false">Ruido</button>
</div>
<canvas id="graf" role="img" aria-label="Gráfica de las medidas"></canvas>
</div>
<div class="nota" id="npts"></div>
<div class="ajustes">
<label>Guardar un punto cada
<select id="inter">
<option value="1">1 segundo</option><option value="2">2 segundos</option>
<option value="5" selected>5 segundos</option><option value="10">10 segundos</option>
<option value="30">30 segundos</option><option value="60">1 minuto</option>
</select>
</label>
<div class="dos">
<label>Marcar un momento
<select id="marca">
<option>Inicio del eclipse</option><option>Inicio de la totalidad</option>
<option>Fin de la totalidad</option><option>Fin del eclipse</option>
<option>Entramos al aula</option><option>Salimos al patio</option><option>Otro momento</option>
</select>
</label>
<button id="marcar" class="alt">Marcar</button>
</div>
</div>
<div class="fila">
<button id="csv">Descargar CSV</button>
<button id="borrar" class="alt">Borrar datos</button>
</div>
<details class="guia">
<summary>Guía de uso</summary>
<ol>
<li><b>Conecta</b> la micro:bit. Verás temperatura, luz y ruido en directo.</li>
<li>Pulsa <b>Empezar a grabar</b>. Se guarda un punto cada cierto tiempo (el que elijas) y se dibuja en la gráfica.</li>
<li>Con <b>Marcar</b> dejas una señal con un nombre en la gráfica y en el archivo.</li>
<li><b>Descargar CSV</b> te da un archivo para abrir en Excel o en una hoja de cálculo.</li>
</ol>
<ul>
<li>La luz de la micro:bit se <b>satura</b> a pleno sol. Tapa los LEDs con un papel blanco o un plástico translúcido.</li>
<li>La temperatura es la del chip: mejor en la sombra y sin tocarla.</li>
<li>Para grabar durante horas: móvil <b>enchufado</b>, con la pantalla encendida y la página abierta. Los datos se guardan solos en el móvil.</li>
<li>El CSV usa «;» y coma decimal, para que Excel en español lo abra bien.</li>
</ul>
</details>
</main>
<script>
const UART_SERVICE = "6e400001-b5a3-f393-e0a9-e50e24dcca9e";
const UART_TX = "6e400003-b5a3-f393-e0a9-e50e24dcca9e";
const KEY = "estacion-lince-v1";
const $ = id => document.getElementById(id);
const espera = ms => new Promise(r => setTimeout(r, ms));
let live = null, acc = { n: 0, T: 0, L: 0, R: 0 }, datos = [], marcas = [], serie = "T";
let grabando = false, ultimoPunto = 0, buffer = "", conectando = false, conectado = false, dispositivo = null, reconectando = false, wl = null;
try { const s = JSON.parse(localStorage.getItem(KEY) || "null"); if (s){ datos = s.datos || []; marcas = s.marcas || []; } } catch (_) {}
const guardar = () => { try { localStorage.setItem(KEY, JSON.stringify({ datos, marcas })); } catch (_) {} };
const hora = t => new Date(t).toLocaleTimeString("es-ES");
/* Medidores */
function pintarMedidores(){
if (!live) return;
const { T, L, R } = live, pL = Math.round(L * 100 / 255), pR = Math.round(R * 100 / 255);
$("vT").textContent = T + " °C"; $("vL").textContent = pL + " %"; $("vR").textContent = pR + " %";
$("bT").style.width = Math.max(0, Math.min(100, (T - 10) / 35 * 100)) + "%";
$("bL").style.width = pL + "%"; $("bR").style.width = pR + "%";
$("aviso").textContent = L >= 250 ? "La luz está saturada (al máximo). Tapa los LEDs con un papel blanco para ver los cambios."
: R >= 250 ? "El ruido está al máximo: la medida se ha saturado." : "";
}
function linea(texto){
const m = texto.match(/-?\d+/g);
if (!m || m.length < 3) return;
const [T, L, R] = m.map(Number);
live = { T, L, R }; pintarMedidores();
if (grabando){ acc.n++; acc.T += T; acc.L += L; acc.R = Math.max(acc.R, R); }
}
function recibir(ev){
buffer += new TextDecoder().decode(ev.target.value);
let i;
while ((i = buffer.indexOf("\n")) >= 0){ linea(buffer.slice(0, i).trim()); buffer = buffer.slice(i + 1); }
}
/* Grabación: promedio de temperatura y luz, máximo del ruido en cada intervalo */
setInterval(() => {
if (grabando && acc.n > 0 && Date.now() - ultimoPunto >= (+$("inter").value) * 1000){
datos.push({ t: Date.now(), T: +(acc.T / acc.n).toFixed(1), L: Math.round(acc.L / acc.n), R: acc.R });
acc = { n: 0, T: 0, L: 0, R: 0 }; ultimoPunto = Date.now();
if (datos.length % 6 === 0) guardar();
dibujar();
}
}, 250);
async function pedirWake(){ try { if ("wakeLock" in navigator) wl = await navigator.wakeLock.request("screen"); } catch (_) {} }
document.addEventListener("visibilitychange", () => { if (grabando && document.visibilityState === "visible") pedirWake(); });
$("rec").onclick = () => {
grabando = !grabando;
if (grabando){ ultimoPunto = Date.now(); acc = { n: 0, T: 0, L: 0, R: 0 }; pedirWake(); }
else { guardar(); try { wl && wl.release(); } catch (_) {} }
$("rec").textContent = grabando ? "Parar de grabar" : "Empezar a grabar";
dibujar();
};
$("marcar").onclick = () => { marcas.push({ t: Date.now(), n: $("marca").value }); guardar(); dibujar(); };
$("borrar").onclick = () => {
if (!datos.length && !marcas.length) return;
if (confirm("¿Borrar todos los datos guardados?")){ datos = []; marcas = []; guardar(); dibujar(); }
};
document.querySelectorAll(".seg button").forEach(b => b.onclick = () => {
serie = b.dataset.s;
document.querySelectorAll(".seg button").forEach(x => x.setAttribute("aria-pressed", x === b));
dibujar();
});
/* Gráfica */
function dibujar(){
const c = $("graf"), dpr = window.devicePixelRatio || 1, w = c.clientWidth, h = c.clientHeight;
if (!w) return;
c.width = w * dpr; c.height = h * dpr;
const g = c.getContext("2d"); g.scale(dpr, dpr);
const css = getComputedStyle(document.documentElement), v = n => css.getPropertyValue(n).trim();
const soft = v("--soft"), lin = v("--line"), col = v({ T: "--norte", L: "--oro", R: "--slow" }[serie]);
$("npts").textContent = datos.length ? datos.length + " puntos · desde las " + hora(datos[0].t) + (grabando ? " · grabando" : "") : (grabando ? "Grabando… esperando el primer punto" : "");
g.font = "11px system-ui,sans-serif"; g.fillStyle = soft; g.textAlign = "center";
if (datos.length < 2){ g.fillText("Pulsa «Empezar a grabar» para ver la gráfica", w / 2, h / 2); return; }
const val = d => serie === "T" ? d.T : d[serie] * 100 / 255;
let lo = 0, hi = 100;
if (serie === "T"){ lo = Math.min(...datos.map(val)); hi = Math.max(...datos.map(val)); if (hi - lo < 2){ lo -= 1; hi += 1; } lo = Math.floor(lo); hi = Math.ceil(hi); }
const x0 = 34, x1 = w - 8, y0 = 8, y1 = h - 20, t0 = datos[0].t, t1 = Math.max(datos[datos.length - 1].t, t0 + 60000);
const X = t => x0 + (t - t0) / (t1 - t0) * (x1 - x0), Y = y => y1 - (y - lo) / (hi - lo) * (y1 - y0);
g.strokeStyle = lin; g.lineWidth = 1; g.textAlign = "right";
for (let i = 0; i <= 2; i++){
const y = lo + (hi - lo) * i / 2; g.beginPath(); g.moveTo(x0, Y(y)); g.lineTo(x1, Y(y)); g.stroke();
g.fillText(Math.round(y * 10) / 10 + (serie === "T" ? "°" : "%"), x0 - 4, Y(y) + 4);
}
g.textAlign = "left"; g.fillText(hora(t0), x0, h - 5); g.textAlign = "right"; g.fillText(hora(datos[datos.length - 1].t), x1, h - 5);
g.strokeStyle = col; g.lineWidth = 2; g.lineJoin = "round"; g.beginPath();
datos.forEach((d, i) => i ? g.lineTo(X(d.t), Y(val(d))) : g.moveTo(X(d.t), Y(val(d)))); g.stroke();
g.setLineDash([4, 3]); g.lineWidth = 1; g.strokeStyle = soft; g.fillStyle = soft;
marcas.forEach((m, i) => {
if (m.t < t0 || m.t > t1) return;
const x = X(m.t); g.beginPath(); g.moveTo(x, y0); g.lineTo(x, y1); g.stroke();
g.textAlign = x > w * .6 ? "right" : "left"; g.fillText(m.n, x + (x > w * .6 ? -3 : 3), y0 + 9 + (i % 3) * 11);
});
g.setLineDash([]);
}
window.addEventListener("resize", dibujar);
/* Descarga CSV */
$("csv").onclick = () => {
if (!datos.length){ estado("Todavía no hay datos que descargar.", "Pulsa «Empezar a grabar» primero."); return; }
const t0 = datos[0].t, f = t => new Date(t).toLocaleString("sv-SE"), d1 = x => String(x).replace(".", ",");
const filas = datos.map(d => ({ t: d.t, v: [d1(d.T), d.L, d.R], n: "" }))
.concat(marcas.map(m => ({ t: m.t, v: ["", "", ""], n: m.n }))).sort((a, b) => a.t - b.t);
const csv = "\ufeffhora;segundos;temperatura_C;luz_0_255;ruido_0_255;nota\n" +
filas.map(r => [f(r.t), Math.round((r.t - t0) / 1000), ...r.v, r.n].join(";")).join("\n");
const a = document.createElement("a");
a.href = URL.createObjectURL(new Blob([csv], { type: "text/csv;charset=utf-8" }));
a.download = "estacion-lince-" + f(t0).replace(/[^0-9]/g, "").slice(0, 12) + ".csv";
document.body.appendChild(a); a.click(); a.remove();
};
/* Conexión Bluetooth */
let pasoCx = "", diag = "";
function estado(t, ayuda){ if (!/^Error/.test(t)) pasoCx = t; $("estado").textContent = t; $("ayuda").textContent = ayuda || ""; }
function explicar(e){
const nombre = e && e.name ? e.name : "Error", m = e && e.message ? e.message : String(e);
let a = "";
if (nombre === "NotFoundError" && /cancel/i.test(m)) a = "No has elegido ningún dispositivo. Pulsa Conectar y elige BBC micro:bit.";
else if (nombre === "NotFoundError") a = "La micro:bit no tiene el servicio UART. Revisa el bloque «bluetooth servicio uart» y copia el .hex nuevo.";
else if (nombre === "NotSupportedError") a = "No se pudo activar el envío de datos. Olvida la micro:bit en Ajustes → Bluetooth, borra la caché de la app «Bluetooth» del sistema y reinicia el móvil y la micro:bit.";
else if (nombre === "NetworkError") a = "No se pudo abrir la conexión. Comprueba «No se requiere emparejamiento» en MakeCode, que no haya otra app conectada y reinicia la micro:bit.";
else if (nombre === "SecurityError") a = "La página debe abrirse con https://.";
else if (nombre === "NotAllowedError") a = "Permiso denegado. Permite el Bluetooth y los dispositivos cercanos para el navegador.";
estado("Error (" + nombre + "): " + m, "Falló en el paso: «" + pasoCx + "». " + a + (diag ? " Características: " + diag : ""));
}
async function conectarGatt(dev){
let ultimoError;
for (let k = 1; k <= 4; k++){
try {
estado("Conectando… (intento " + k + " de 4)");
const srv = dev.gatt.connected ? dev.gatt : await dev.gatt.connect();
await espera(600);
estado("Buscando el servicio UART…");
return await srv.getPrimaryService(UART_SERVICE);
} catch (e){
ultimoError = e;
if (e.name === "NotFoundError" || e.name === "SecurityError") break;
try { if (dev.gatt.connected) dev.gatt.disconnect(); } catch (_){}
await espera(800);
}
}
throw ultimoError;
}
async function enlazar(dev){
const svc = await conectarGatt(dev);
buffer = ""; diag = "";
estado("Leyendo las características del servicio…");
const chars = await svc.getCharacteristics();
diag = chars.map(c => c.uuid.slice(0, 8) + " [" + Object.keys(c.properties).filter(k => c.properties[k]).join(", ") + "]").join(" · ");
const cand = chars.filter(c => c.properties.notify || c.properties.indicate)
.sort((a, b) => (b.uuid === UART_TX) - (a.uuid === UART_TX));
if (!cand.length) throw new Error("El servicio UART no tiene ninguna característica que envíe datos.");
let ch = null, ultimoErr;
for (const c of cand){
c.addEventListener("characteristicvaluechanged", recibir);
for (let i = 1; i <= 2 && !ch; i++){
try { estado("Activando notificaciones en " + c.uuid.slice(0, 8) + "… (intento " + i + ")"); await c.startNotifications(); ch = c; }
catch (e){ ultimoErr = e; await espera(1000); }
}
if (ch) break;
c.removeEventListener("characteristicvaluechanged", recibir);
}
if (!ch) throw ultimoErr;
conectado = true; $("rec").disabled = false;
estado("Conectado a " + (dev.name || "micro:bit") + ".");
}
async function reconectar(){
conectado = false;
if (reconectando) return;
reconectando = true;
for (let i = 1; i <= 20; i++){
estado("Conexión perdida. Reintentando… (" + i + " de 20)", "Mantén la micro:bit cerca y encendida. Los datos ya guardados no se pierden.");
await espera(3000);
try { await enlazar(dispositivo); reconectando = false; return; } catch (_) {}
}
reconectando = false;
estado("No se pudo reconectar.", "Pulsa Conectar para volver a empezar.");
}
$("conectar").onclick = async () => {
if (conectando || reconectando) return;
if (!navigator.bluetooth){ estado("Este navegador no permite Bluetooth.", "Usa Chrome o Edge (en ordenador o en Android)."); return; }
conectando = true; $("conectar").disabled = true;
try {
estado("Buscando micro:bit…");
const dev = await navigator.bluetooth.requestDevice({ acceptAllDevices: true, optionalServices: [UART_SERVICE] });
dispositivo = dev;
dev.addEventListener("gattserverdisconnected", reconectar);
await enlazar(dev);
} catch (e){ explicar(e); }
finally { conectando = false; $("conectar").disabled = false; }
};
dibujar();
</script>
</body>
</html>



