Saltar al contenido

Lección 7 de 20 · Lectura y práctica

Integrar sensores del dispositivo con Expo Sensors

Concepto claveLos sensores del dispositivo son componentes hardware que capturan datos del entorno físico, como aceleración, orientación, luz o proximidad. En desarrollo móvil, acceder a estos sensores permite crear experiencias.

Del concepto a la práctica

Taller de esta lección

Los sensores producen eventos continuos, así que el problema concreto es controlar frecuencia y ciclo de vida. Para una pantalla que inclina una tarjeta no hace falta guardar cada muestra; basta con actualizar a intervalos razonables y retirar la suscripción al salir.

Ejemplo resuelto

Se reciben tres lecturas del acelerómetro: {x:0.1,y:0.2,z:0.9}, {x:0.2,y:0.2,z:0.9} y {x:0.4,y:0.3,z:0.8}. La interfaz conserva solo la última lectura y muestra x=0.4, y=0.3, z=0.8. Al desmontar la pantalla se llama una vez a remove().

Pruébalo

  1. Define el intervalo de actualización de tu pantalla.

  2. Registra tres muestras con la misma unidad.

  3. Actualiza una sola referencia visible con la última muestra.

  4. Verifica que desmontar cancela la suscripción.

Error frecuente: crear un listener en cada render. Corrígelo registrándolo dentro de un efecto con dependencias estables y limpiándolo en su retorno.

Comprueba tu resultado

Las lecturas del acelerómetro se expresan en unidades g; conserva esa unidad y comprueba disponibilidad en el dispositivo antes de registrar listeners. El registro debe contener tres entradas, la interfaz debe mostrar solo la tercera y el contador de suscripciones activas debe volver a cero después del desmontaje.

Diagrama de decisión con ramas Sí y No y un bucle que procesa cada elemento de una lista.
CursaloMapa de práctica
Cómo avanza un programa

Una condición decide qué camino ejecuta el programa. Un bucle repite una operación mientras queden elementos, y termina cuando la lista se agota. Separar ambas ideas ayuda a seguir el flujo y comprobar casos límite.

Ver la infografía en tamaño completo ↗

Concepto clave

Los sensores del dispositivo son componentes hardware que capturan datos del entorno físico, como aceleración, orientación, luz o proximidad. En desarrollo móvil, acceder a estos sensores permite crear experiencias inmersivas y contextuales. Expo Sensors proporciona una capa unificada para interactuar con estos sensores sin necesidad de código nativo, simplificando el desarrollo multiplataforma.

Imagina que estás construyendo una aplicación de fitness que usa el acelerómetro para contar pasos, o un juego que utiliza el giroscopio para controlar movimientos. Sin Expo Sensors, tendrías que escribir código específico para iOS y Android, aumentando la complejidad. Con Expo Sensors, usas una API JavaScript consistente, similar a cómo un control remoto universal opera diferentes marcas de televisores con los mismos botones.

Cómo funciona en la práctica

Expo Sensors funciona mediante módulos que exponen métodos para suscribirse a actualizaciones de sensores. Primero, instalas el paquete correspondiente (por ejemplo, expo-sensors). Luego, importas el sensor específico y usas sus métodos para iniciar la escucha. Los datos llegan como objetos JavaScript con propiedades como x, y, z para movimiento, o brightness para luz.

Paso a paso: 1) Importa el sensor desde expo-sensors. 2) Usa useEffect en React para manejar el ciclo de vida. 3) Llama a Sensor.addListener para suscribirte a actualizaciones. 4) Procesa los datos en una función callback. 5) Limpia el listener al desmontar el componente para evitar fugas de memoria. Esto asegura que la aplicación responda en tiempo real a cambios del sensor.

Codigo en accion

Aquí un ejemplo funcional que usa el acelerómetro para mostrar datos de movimiento en una app Expo:

import React, { useState, useEffect } from 'react';
import { Text, View, StyleSheet } from 'react-native';
import { Accelerometer } from 'expo-sensors';

export default function App() {
  const [data, setData] = useState({ x: 0, y: 0, z: 0 });

  useEffect(() => {
    const subscription = Accelerometer.addListener(accelerometerData => {
      setData(accelerometerData);
    });
    Accelerometer.setUpdateInterval(100); // Actualiza cada 100ms

    return () => subscription.remove();
  }, []);

  return (
    
      
        x: {data.x.toFixed(2)}\ny: {data.y.toFixed(2)}\nz: {data.z.toFixed(2)}
      
    
  );
}

const styles = StyleSheet.create({
  container: { flex: 1, justifyContent: 'center', alignItems: 'center' },
  text: { fontSize: 18 }
});

Antes de optimizar, podrías olvidar limpiar el listener, causando fugas. Después, con el return en useEffect, garantizas que se remueva al desmontar. Para mejorar, podrías agregar un umbral para filtrar datos mínimos y ahorrar batería:

// Mejora: Filtrar datos menores a 0.1
useEffect(() => {
  const subscription = Accelerometer.addListener(accelerometerData => {
    if (Math.abs(accelerometerData.x) > 0.1 || Math.abs(accelerometerData.y) > 0.1 || Math.abs(accelerometerData.z) > 0.1) {
      setData(accelerometerData);
    }
  });
  Accelerometer.setUpdateInterval(100);
  return () => subscription.remove();
}, []);

Errores comunes

  • No limpiar listeners: Olvidar remover suscripciones en useEffect causa fugas de memoria y errores en actualizaciones. Siempre usa un return para limpiar.
  • Intervalos de actualización muy rápidos: Configurar intervalos menores a 16ms (60fps) puede saturar el hilo principal y drenar batería. Usa valores como 100-500ms según la necesidad.
  • Asumir disponibilidad del sensor: No todos los dispositivos tienen todos los sensores. Verifica con Sensor.isAvailableAsync() antes de usarlos.
  • Ignorar permisos: Algunos sensores requieren permisos en tiempo de ejecución. Usa expo-permissions o APIs modernas para solicitarlos.
  • Procesar datos en el hilo principal: Operaciones complejas con datos de sensores pueden bloquear la UI. Mueve el procesamiento a un Web Worker si es intensivo.

Checklist de dominio

  • Instalar y configurar Expo Sensors en un proyecto Expo.
  • Implementar al menos dos sensores diferentes (ej., acelerómetro y giroscopio) con suscripciones.
  • Manejar correctamente el ciclo de vida de listeners con useEffect y cleanup.
  • Optimizar el intervalo de actualización para balancear rendimiento y precisión.
  • Verificar disponibilidad del sensor y permisos antes de usarlo.
  • Probar la app en dispositivos reales para validar el comportamiento del sensor.
  • Documentar el uso de sensores en el código para mantenibilidad.

Crear una brújula digital con Expo Sensors

Desarrolla una aplicación que muestre una brújula digital usando el magnetómetro de Expo Sensors. Sigue estos pasos:

  1. Crea un nuevo proyecto Expo con npx create-expo-app compass-app.
  2. Instala Expo Sensors: npx expo install expo-sensors.
  3. En App.js, importa Magnetometer de expo-sensors y componentes de React Native.
  4. Usa useState para almacenar el ángulo de orientación y useEffect para suscribirte al magnetómetro.
  5. Calcula el ángulo en grados desde los datos del magnetómetro (x, y) usando Math.atan2(y, x) * (180 / Math.PI).
  6. Muestra el ángulo en una pantalla con un texto y una imagen que rote según la orientación.
  7. Agrega un botón para calibrar el sensor reiniciando los datos.
  8. Prueba la app en un dispositivo físico moviéndolo para ver cambios en tiempo real.
Pistas
  • Usa Magnetometer.setUpdateInterval(100) para actualizaciones suaves.
  • Normaliza el ángulo a 0-360 grados con (angle + 360) % 360 para evitar valores negativos.
  • Para la rotación de imagen, aplica un estilo transform: [{ rotate: `${angle}deg` }].

Evalua tu comprension

Completa el quiz interactivo de arriba para ganar XP.

Sigue con Desarrollo Avanzado de Aplicaciones con Expo: De Concepto a Producción

Esta lección forma parte de un curso de Cursalo. Revisa su programa y elige entre la compra individual o el acceso a toda la escuela.

Si ya tenías acceso a este curso, entra con tu cuenta: tus derechos y tu progreso se conservan. No necesitas comprarlo de nuevo.

01 / ELEGIR UNA RUTA

El próximo paso

Aprende IA mientras construyes algo que sí necesitas.

Empieza por el curso inicial o explora el catálogo para encontrar una práctica alineada con tu trabajo.