
Chismes del Lince 05: Vigilante del ruido
Categorías: AIDARAC – Ciencia Ciudadana · Los Chismes del Lince · Proyecto AIDARAC
El lince tiene un oído finísimo. Las orejas con pincel no son de adorno: le sirven para enterarse de todo lo que se mueve en el monte. Pero hay un sitio donde hasta un lince querría taparse las orejas: una clase a las once y media, cuando alguien ha tenido la brillante idea de que la mesa es un tambor.
Así que hoy el lince cambia de oficio. En vez de escuchar para cazar, escucha para medir. La idea es sencilla: que la clase pueda ver cuánto ruido hace, en directo, y que se entere sola cuando se pasa. Y como siempre en esta serie, con el móvil que llevas en el bolsillo.
Por qué este chisme
Los Chismes del Lince son las herramientas que lleva el lince en el zurrón para hacer sus misiones. Este conecta con dos de ellas:
- Misión 12 (ruido). Aquí está el sonómetro ciudadano: mide el nivel de ruido y lo enseña de forma que se entienda a la primera.
- Misión 09 (la relación H’ frente a sonido). Para cruzar el sonido con otros datos hace falta poder medirlo. Este chisme es el primer paso.
Y hay una regla que no se negocia: el audio no se graba ni se envía. El móvil oye, calcula un número y se olvida de lo que ha oído. Lo único que se ve (y lo único que existe) es el nivel.
Chisme 05: Vigilante del ruido
La página tiene tres partes:
- El medidor. Un número grande con una barra de colores que sube y baja en directo. El número cambia de color según lo cerca que esté del límite (verde, ámbar y rojo) y una marca en la barra te enseña dónde está ese límite.
- La gráfica de la clase. Un punto por segundo. La línea va creciendo poco a poco conforme pasa la clase, con el límite dibujado como una línea discontinua roja. Lo que queda por encima del límite se pinta de rojo, así que se ve a la primera cuándo se pasó y durante cuánto tiempo. Debajo, un resumen: máximo, media, porcentaje del tiempo sobre el límite y número de avisos.
- El aviso. Cuando el ruido pasa del límite, aparece un banner rojo parpadeante, el móvil vibra y suena un pitido. Sirve de aviso para toda la clase, sin que el profesor tenga que levantar la voz (que, curiosamente, sería más ruido).
Y dos botones para llevarse el resultado: guardar la gráfica como imagen (PNG) y descargar los datos (CSV).
Pruébalo en tu móvil: montesteam.org/app/chisme05ruido.html
El micrófono solo funciona si la página va con https, y el navegador te pedirá permiso la primera vez.
Qué está midiendo (y por qué los decibelios del móvil son relativos)
Un micrófono convierte el sonido en una señal eléctrica, y el móvil la convierte en números. La app coge muchos números seguidos, calcula su valor medio de intensidad (lo que se llama valor RMS) y lo pasa a decibelios con una fórmula logarítmica:
nivel ≈ 20 · log₁₀(RMS) + ajuste
Tres cosas para entender los decibelios:
- Es una escala logarítmica. Cada +3 dB es el doble de energía sonora. Cada +10 dB se percibe, más o menos, como el doble de fuerte. Por eso pasar de 60 a 70 se nota mucho más de lo que parece.
- El cero no es el silencio. El móvil mide respecto al máximo que puede registrar su micrófono. Esa medida sale negativa, y por eso se le suma un ajuste para que los valores queden en una escala cómoda (por defecto, 100).
- Cada móvil es un mundo. Distintos micrófonos, distintas fundas, distinta orientación… y muchos móviles aplican filtros de voz y de volumen automático. La app intenta desactivarlos, pero algunos móviles los ignoran.
Conclusión: los números no son decibelios calibrados, son decibelios relativos. Sirven para comparar un momento con otro con el mismo móvil en el mismo sitio, no para decir “esta clase tiene 72,3 dB reales”.
El aviso a prueba de listos
Si un aviso funciona con “ruido durante 3 segundos seguidos”, la clase aprende en un día a hacer ruidos de dos segundos. Cualquiera que haya dado clase lo sabe. Así que el Vigilante detecta de otra manera:
- Mira el ruido muchas veces por segundo, no una vez cada segundo.
- Cada instante por encima del límite suma a una especie de cubo. Cuando el cubo llega a un valor (por defecto, 0,3 segundos en total), salta el aviso.
- El cubo se vacía muy despacio, así que los golpes cortos repetidos también lo llenan. Hacer “ruiditos” cada pocos segundos no libra a nadie.
- Una vez que salta, el aviso dura al menos 3 segundos, y se alarga mientras siga el ruido.
Puedes cambiar la sensibilidad en los ajustes: muy alta (0,15 s), alta (0,3 s, la de por defecto), normal (0,6 s) o tolerante (1,5 s). Si con el ajuste alto salta por cada aplauso o cada golpe de mesa, sube un escalón.
Y como el pitido sale por el altavoz del móvil y el micrófono está al lado, la app se hace sorda durante unas décimas de segundo cuando pita, para que no se dispare a sí misma.
La gráfica, además, dibuja el pico de cada segundo y no la media. Así, un grito de medio segundo se ve como un pico rojo, y no desaparece en el promedio.
Cómo usarlo en clase
- Coloca el móvil en la mesa del profesor, o en un punto central, con la pantalla hacia arriba. No lo pegues a nada que golpee (teclados, mesas).
- Abre la página, pulsa Empezar y acepta el permiso. La pantalla se mantiene encendida mientras mide.
- Elegid el límite entre todos. Como los dB son relativos, no hay un número mágico. Una forma de hacerlo: con la clase trabajando en silencio normal, sube el límite hasta que deje de saltar, y déjalo unos 5–8 dB por encima. Es mucho más justo si el límite lo acuerda la clase que si lo impone el aparato.
- Deja que funcione. El pitido y el color hacen de aviso.
- Al terminar, guarda la gráfica. El PNG lleva el título, la fecha, la duración, el límite y el resumen. Se puede proyectar al día siguiente para comentarla.
Calibrar con el Arduino (opcional)
Si tienes el sonómetro del Arduino, puedes convertir el Vigilante en una actividad de ciencias:
- Pon el móvil junto al sonómetro del Arduino.
- Haz un ruido constante: una música, un zumbido, un altavoz con un tono.
- Escribe en la app lo que marca el Arduino y pulsa Calibrar.
La app cambia su ajuste para que su número coincida con el del Arduino en ese momento, y lo recuerda en ese móvil. Prueba después con otro ruido más fuerte y otro más flojo: si los dos aparatos siguen coincidiendo, la calibración es buena. Si se separan, has descubierto por qué medir de verdad es más difícil de lo que parece.
Mini-retos para clase
- El límite justo: buscad entre todos el límite con el que la clase trabaja bien sin que salte el aviso. ¿Es el mismo en Lengua que en Tecnología?
- La hora del ruido: guardad la gráfica de una clase por la mañana y otra después del recreo. ¿Cuándo hay más pasado del límite?
- Móvil frente a Arduino: calibrad y comprobad con tres ruidos distintos. ¿Cuánto se separan?
- El mapa de la clase: medid con el móvil en la primera fila y en la última. ¿Se parece la gráfica?
- Baja el porcentaje: anotad el % sobre el límite de una clase y proponed una estrategia para bajarlo. Repetid a la semana siguiente.
Cómo se monta todo, paso a paso
(Este chisme no necesita servidor ni Worker. Es un solo archivo.)
Paso 1: sube la página
Copia el archivo completo, llámalo chisme05ruido.html y súbelo a tu carpeta app, como en los chismes anteriores. Si lo incrustas dentro de otra página con un iframe, añade allow="microphone", o el navegador no dejará usar el micrófono.
<!DOCTYPE html>
<html lang="es"><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Vigilante del ruido · Misiones del Lince</title>
<style>
:root{--bg:#f3f1e4;--card:#fffdf5;--ink:#26301f;--mut:#65705c;--line:#dcdbc6;--g:#2f6b3f;--am:#b39200;--red:#c0392b;--b:#1f7aa8;--sunbg:#f8edc9}
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--ink);font:16px/1.5 system-ui,-apple-system,'Segoe UI',sans-serif}
.w{max-width:720px;margin:0 auto;padding:16px 14px 40px}
h1{font:700 1.6rem/1.15 Georgia,serif;margin:.2em 0}
h2{font:700 1.1rem Georgia,serif;margin:0 0 6px}
.pill{font-size:13px;font-weight:600;background:var(--sunbg);color:#7a5200;padding:2px 10px;border-radius:99px}
section{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:14px;margin-top:14px}
.mut{color:var(--mut);font-size:14px}
button{font:600 15px system-ui,sans-serif;min-height:40px;padding:0 14px;border-radius:10px;border:1px solid var(--line);background:var(--card);color:var(--ink);cursor:pointer}
button.p{background:var(--g);color:#fff;border-color:var(--g)}
:focus-visible{outline:3px solid var(--b);outline-offset:2px}
.row{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:8px 0}
.big{font:700 3.6rem/1 system-ui,sans-serif}
.chip{display:inline-block;color:#fff;font-weight:600;font-size:13px;padding:1px 10px;border-radius:99px}
.bar{position:relative;height:26px;border-radius:13px;overflow:hidden;background:linear-gradient(90deg,#3a9d4a 0%,#3a9d4a 30%,#d4b400 45%,#e07b00 62%,#c0392b 78%)}
.bar .cv{position:absolute;top:0;right:0;bottom:0;background:#e6e4d2;transition:width .08s}
.bar .lm{position:absolute;top:0;bottom:0;width:3px;background:var(--ink)}
.sc{display:flex;justify-content:space-between;font-size:12px;color:var(--mut);margin-top:2px}
.alarm{display:none;margin-top:12px;padding:12px;border-radius:12px;background:var(--red);color:#fff;font:700 1.3rem Georgia,serif;text-align:center;animation:pl .7s infinite alternate}
.on .alarm{display:block}.on section.m{border-color:var(--red);box-shadow:0 0 0 3px #c0392b55}
@keyframes pl{to{opacity:.55}}
.st{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-top:10px;text-align:center}
.st b{display:block;font-size:1.3rem}.st span{font-size:12px;color:var(--mut)}
input[type=range]{width:100%}input[type=number]{width:80px;font:inherit;padding:6px;border:1px solid var(--line);border-radius:8px}
svg{display:block;width:100%;height:auto}
summary{cursor:pointer;font-weight:700}
.warn{border-left:5px solid var(--g);background:#e9f2e6;padding:8px 12px;border-radius:8px;font-size:14px;margin-top:14px}
</style></head><body><div class="w" id="app">
<span class="pill">Las Misiones del Lince · Vigilante del ruido</span>
<h1>¿Cuánto ruido hay en clase?</h1>
<p class="mut">Mide el nivel de sonido en directo y avisa cuando se pasa del límite. <b>No se graba ni se envía audio</b>: solo se calcula un número.</p>
<section class="m" aria-label="Medidor">
<div class="row" style="justify-content:space-between"><span class="big" id="num">–</span><span><span class="chip" id="chip" style="background:#888">Parado</span><br><span class="mut" id="unit">dB relativos (no calibrados)</span></span></div>
<div class="bar" aria-hidden="true"><div class="cv" id="cv" style="width:100%"></div><div class="lm" id="lm"></div></div>
<div class="sc"><span>30</span><span>60</span><span>90</span><span>120</span></div>
<div class="alarm" role="alert" id="al">🔴 ¡Demasiado ruido! Bajad el volumen</div>
<div class="row"><button class="p" id="go">🎤 Empezar</button><button id="rs">Reiniciar gráfica</button></div>
<p class="mut" id="msg">Pulsa Empezar y acepta el permiso del micrófono.</p>
</section>
<section aria-label="Gráfica">
<h2>Ruido a lo largo de la clase</h2>
<svg id="ch" viewBox="0 0 700 240" role="img" aria-label="Gráfica del nivel de ruido en el tiempo"></svg>
<p class="mut">Un punto por segundo, con el pico de ese segundo (así se ven los ruidos cortos). La parte roja supera el límite.</p>
<div class="row"><button id="xp">📷 Guardar gráfica (PNG)</button><button id="xc">📄 Datos (CSV)</button></div>
<div class="st"><div><b id="s1">–</b><span>Máximo</span></div><div><b id="s2">–</b><span>Media</span></div><div><b id="s3">–</b><span>% sobre límite</span></div><div><b id="s4">0</b><span>Avisos</span></div></div>
</section>
<section aria-label="Ajustes">
<h2>Ajustes</h2>
<label>Límite: <b id="lv">65</b> dB<input type="range" id="lim" min="40" max="120" value="65"></label>
<div class="row"><label>Sensibilidad <select id="hd"><option value="0.15">Muy alta (0,15 s)</option><option value="0.3" selected>Alta (0,3 s)</option><option value="0.6">Normal (0,6 s)</option><option value="1.5">Tolerante (1,5 s)</option></select></label>
<label>Ventana <select id="wn"><option value="120">2 min</option><option value="300" selected>5 min</option><option value="900">15 min</option><option value="3600">1 hora</option></select></label></div>
<label class="row"><input type="checkbox" id="bp" checked> Pitido de aviso <span class="mut">(sube el volumen del móvil)</span></label>
<details style="margin-top:8px"><summary>Calibrar con el sonómetro del Arduino</summary>
<p class="mut">Pon el móvil junto al sonómetro, haz un ruido constante (una música o un zumbido) y escribe lo que marca el Arduino. La app ajusta su escala para coincidir.</p>
<div class="row"><input type="number" id="ref" placeholder="dB" min="30" max="110"><button id="cal">Calibrar</button><span class="mut" id="ofs"></span></div></details>
</section>
<div class="warn"><b>Ojo:</b> los decibelios del móvil son <b>relativos</b>: sirven para comparar momentos de la misma clase, no para medir con precisión. Cada móvil tiene un micrófono distinto.</div>
</div>
<script>
const $=s=>document.querySelector(s),MIN=30,MAX=120;
let off=100,lim=65,sens=.3,win=300,eq=[],bucket=0,until=0,lb=0,mute=0,pt=0,pk=0,ctx,an,buf,stream,run=false,lvl=0,acc=0,n=0,last=0,data=[],over=0,alerts=0,alarm=false,wl=null;
try{off=+localStorage.getItem('lince_off')||100}catch(e){}
const col=v=>v>lim?'#c0392b':v>lim-8?'#b39200':'#2f6b3f';
const txt=v=>v>lim?'Demasiado ruido':v>lim-8?'Ojo, sube':'Tranquilo';
const pct=v=>Math.max(0,Math.min(1,(v-MIN)/(MAX-MIN)));
function ui(){$('#lm').style.left=(pct(lim)*100)+'%';$('#lv').textContent=lim;$('#ofs').textContent='Ajuste: '+(off-100>=0?'+':'')+(off-100).toFixed(0)+' dB'}
function beep(){try{const o=ctx.createOscillator(),g=ctx.createGain();o.frequency.value=880;g.gain.value=.15;o.connect(g).connect(ctx.destination);o.start();o.stop(ctx.currentTime+.25)}catch(e){}}
function frame(t){if(!run)return;an.getFloatTimeDomainData(buf);let s=0;for(const x of buf)s+=x*x;
const rel=20*Math.log10(Math.sqrt(s/buf.length)||1e-5)+off;lvl+=(rel-lvl)*(rel>lvl?.5:.12);
acc+=Math.pow(10,rel/10);n++;pk=Math.max(pk,lvl);
const dt=Math.min(.1,(t-pt)/1000);pt=t;
if(t>mute){if(lvl>lim)bucket+=dt;else bucket=Math.max(0,bucket-dt*.1)}
if(bucket>=sens){bucket=sens;if(lvl>lim)until=t+3000;if(!alarm){alarm=true;alerts++;$('#app').classList.add('on');try{navigator.vibrate&&navigator.vibrate([200,100,200])}catch(e){}until=t+3000;lb=0}}
if(alarm){if($('#bp').checked&&t-lb>2000){lb=t;mute=t+450;beep()}if(t>until&&lvl<=lim){alarm=false;$('#app').classList.remove('on')}}
$('#num').textContent=Math.round(lvl);$('#num').style.color=col(lvl);$('#cv').style.width=(100-pct(lvl)*100)+'%';
const c=$('#chip');c.textContent=txt(lvl);c.style.background=col(lvl);
if(t-last>=1000){last=t;eq.push(10*Math.log10(acc/n));data.push(pk);if(pk>lim)over++;acc=0;n=0;pk=0;stats();draw()}
requestAnimationFrame(frame)}
function stats(){if(!data.length)return;const m=Math.max(...data),a=10*Math.log10(eq.reduce((x,v)=>x+Math.pow(10,v/10),0)/eq.length);
$('#s1').textContent=m.toFixed(0);$('#s2').textContent=a.toFixed(0);$('#s3').textContent=Math.round(over/data.length*100)+'%';$('#s4').textContent=alerts}
function draw(N=win,ret){const W=700,L=34,B=205,T=10,st=Math.max(0,data.length-N),v=data.slice(st),
x=i=>L+i/(N-1)*(W-L-8),y=q=>B-pct(q)*(B-T),pts=v.map((q,i)=>x(i)+','+y(q)).join(' ');
let s=`<defs><clipPath id="c"><rect x="0" y="0" width="${W}" height="${y(lim)}"/></clipPath></defs>`;
for(let g=MIN;g<=MAX;g+=10)s+=`<line x1="${L}" x2="${W-8}" y1="${y(g)}" y2="${y(g)}" stroke="var(--line)"/><text x="${L-5}" y="${y(g)+4}" text-anchor="end" font-size="12" fill="var(--mut)">${g}</text>`;
const step=N/5;for(let k=0;k<=5;k++){const sec=st+k*step;s+=`<text x="${x(k*step)}" y="${B+20}" text-anchor="middle" font-size="12" fill="var(--mut)">${(sec/60).toFixed(sec%60?1:0).replace('.',',')} min</text>`}
if(v.length>1)s+=`<polyline points="${pts}" fill="none" stroke="#1f7aa8" stroke-width="2.5" stroke-linejoin="round"/><polyline points="${pts}" fill="none" stroke="#c0392b" stroke-width="3.5" stroke-linejoin="round" clip-path="url(#c)"/>`;
s+=`<line x1="${L}" x2="${W-8}" y1="${y(lim)}" y2="${y(lim)}" stroke="#c0392b" stroke-dasharray="6 4" stroke-width="2"/><text x="${W-10}" y="${y(lim)-5}" text-anchor="end" font-size="12" font-weight="700" fill="#c0392b">límite ${lim}</text>`;
if(ret)return s;$('#ch').innerHTML=s}
async function start(){try{stream=await navigator.mediaDevices.getUserMedia({audio:{echoCancellation:false,noiseSuppression:false,autoGainControl:false}});
ctx=new(window.AudioContext||window.webkitAudioContext)();an=ctx.createAnalyser();an.fftSize=2048;buf=new Float32Array(an.fftSize);ctx.createMediaStreamSource(stream).connect(an);
run=true;last=pt=performance.now();bucket=0;$('#go').textContent='⏹ Parar';$('#msg').textContent='Midiendo en directo. El audio no sale de tu dispositivo.';
try{wl=await navigator.wakeLock.request('screen')}catch(e){}
requestAnimationFrame(frame)}catch(e){$('#msg').textContent='No he podido usar el micrófono. Comprueba el permiso y que la página va con https.'}}
function stop(){run=false;try{stream.getTracks().forEach(t=>t.stop());ctx.close();wl&&wl.release()}catch(e){}
$('#go').textContent='🎤 Empezar';$('#chip').textContent='Parado';$('#chip').style.background='#888';$('#app').classList.remove('on');alarm=false;$('#msg').textContent='Parado.'}
$('#go').onclick=()=>run?stop():start();
$('#rs').onclick=()=>{data=[];eq=[];over=0;alerts=0;bucket=0;['#s1','#s2','#s3'].forEach(q=>$(q).textContent='–');$('#s4').textContent=0;draw()};
$('#lim').oninput=e=>{lim=+e.target.value;ui();draw()};
$('#hd').onchange=e=>sens=+e.target.value;$('#wn').onchange=e=>{win=+e.target.value;draw()};
$('#cal').onclick=()=>{const r=+$('#ref').value;if(!r||!data.length){$('#msg').textContent='Para calibrar, pon la app a medir unos segundos y escribe los dB del Arduino.';return}
const rec=data.slice(-5),d=r-rec.reduce((a,b)=>a+b,0)/rec.length;off+=d;data=data.map(q=>q+d);eq=eq.map(q=>q+d);lvl+=d;try{localStorage.setItem('lince_off',off)}catch(e){}ui();draw();$('#msg').textContent='Calibrado con '+r+' dB.'};
function dl(b,name){const a=document.createElement('a');a.href=URL.createObjectURL(b);a.download=name;document.body.appendChild(a);a.click();a.remove()}
const stamp=()=>new Date().toISOString().slice(0,16).replace(/[:T]/g,'-');
$('#xp').onclick=()=>{if(!data.length){$('#msg').textContent='Aún no hay datos: mide unos segundos primero.';return}
const sv=draw(Math.max(60,data.length),1).replace(/var\(--line\)/g,'#dcdbc6').replace(/var\(--mut\)/g,'#65705c'),
svg=`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 700 240" width="1400" height="480" font-family="system-ui,sans-serif">${sv}</svg>`,img=new Image();
img.onload=()=>{const c=document.createElement('canvas');c.width=1400;c.height=630;const g=c.getContext('2d');g.fillStyle='#fffdf5';g.fillRect(0,0,1400,630);
g.fillStyle='#26301f';g.font='bold 34px Georgia,serif';g.fillText('Ruido en clase · Vigilante del ruido',30,50);
g.font='22px system-ui,sans-serif';g.fillStyle='#65705c';const m=data.length;
g.fillText(new Date().toLocaleString('es-ES')+' · duración '+Math.floor(m/60)+' min '+(m%60)+' s · límite '+lim+' dB (relativos)',30,84);
g.drawImage(img,0,105,1400,480);g.fillStyle='#26301f';
g.fillText(`Máximo ${$('#s1').textContent} dB · Media ${$('#s2').textContent} dB · Sobre el límite ${$('#s3').textContent} · Avisos ${$('#s4').textContent}`,30,612);
c.toBlob(b=>dl(b,'ruido-clase-'+stamp()+'.png'))};
img.src='data:image/svg+xml;charset=utf-8,'+encodeURIComponent(svg)};
$('#xc').onclick=()=>{if(!data.length){$('#msg').textContent='Aún no hay datos: mide unos segundos primero.';return}
const t=['segundo,pico_dB,media_dB,limite_dB'];data.forEach((v,i)=>t.push([i+1,v.toFixed(1),eq[i].toFixed(1),lim].join(',')));
dl(new Blob(['\ufeff'+t.join('\n')],{type:'text/csv'}),'ruido-clase-'+stamp()+'.csv')};
ui();draw();
</script></body></html>
Ábrela desde el móvil con https, pulsa Empezar y acepta el permiso del micrófono. Con esto ya puedes usarla en clase.
Ojo con los límites del chisme
- Los decibelios son relativos, no calibrados. Sirven para comparar, no para medir con precisión ni para cumplir ninguna normativa.
- Los teclados y las mesas engañan. Un golpe seco y corto cerca del micrófono puede disparar el aviso con la sensibilidad alta.
- Por encima de unos 100 el medidor no llega sin calibrar, porque es el máximo que puede registrar el micrófono. El límite se puede subir hasta 120, pero solo tiene sentido después de calibrar.
- Algunos móviles filtran el sonido aunque la página les pida que no lo hagan, y eso cambia las medidas.
- El pitido se cuela un poco en el micrófono. La app lo tiene en cuenta, pero no es perfecto.
Y ahora, ¿qué?
El siguiente paso es cruzar este chisme con el resto de misiones: comparar el sonómetro del móvil con el del Arduino a lo largo de una semana, y llevarlo a la Misión 12 con un mapa de ruido del instituto. También queremos probar un modo pantalla completa, para proyectarlo en la pizarra como un semáforo, y un contador de avisos por minuto para retos entre grupos.
Todos los chismes estarán en El Zurrón del Lince: montesteam.org/app
Conclusión
⚠️ ANTES DE USARLO, LEE ESTO
NO SE GRABA AUDIO
La página procesa el sonido en el momento y solo guarda un número por segundo, en la memoria del propio móvil. No envía nada a ningún sitio. Aun así, cuéntaselo a la clase (y a las familias, si hace falta) antes de usarla: que sepan qué se mide, qué no y por qué.
ES UN MEDIDOR RELATIVO, NO UN APARATO DE MEDIDA
Los números de esta app no son decibelios calibrados. Sirven para comparar momentos de una misma clase con el mismo móvil, no para medir con precisión. Si necesitas medidas fiables, usa un sonómetro homologado.
MIDE A LA CLASE, NO A LAS PERSONAS
El Vigilante enseña el ruido del grupo. No está hecho para señalar a nadie ni para poner notas, y no funciona bien para eso. Úsalo como un espejo para la clase, no como un castigo.
CUIDA TUS OÍDOS
Un ruido muy alto y continuo daña el oído. Si el medidor te enseña una clase que grita, la solución es bajar el ruido, no subir el límite.
ESTO ES UN EXPERIMENTO EDUCATIVO
Lo hemos montado para aprender cómo un sensor del móvil, un poco de matemáticas y una idea sencilla pueden convertirse en una herramienta. Puede fallar, puede equivocarse y puede saltar cuando no toca. Fórmate el hábito de contrastar cualquier dato, el nuestro incluido.



