devicescript-entradas-analogicas-adc

Entradas analógicas y ADC en DeviceScript

  • 4 min

Una entrada analógica permite convertir un voltaje variable en un valor que el programa puede procesar. Para ello usamos el ADC (conversor analógico-digital) del microcontrolador.

Para leer sensores de temperatura, de luz (LDR) o simplemente la posición de una perilla giratoria, necesitamos usar las Entradas Analógicas y el ADC (Analog-to-Digital Converter) de nuestro microcontrolador.

En Arduino, analogRead() devuelve un entero cuyo rango depende de la resolución configurada y del microcontrolador. A menudo tenemos que convertirlo a un porcentaje u otra unidad útil.

DeviceScript puede exponer la lectura normalizada entre 0 y 1, de modo que la lógica no dependa de la resolución concreta del ADC.

El servicio Potentiometer

Aunque podríamos intentar leer el voltaje crudo, DeviceScript nos anima a usar Servicios. Para cualquier entrada analógica genérica (como un potenciómetro, un sensor de humedad de suelo analógico o un LDR), solemos utilizar el servicio Potentiometer.

Este servicio tiene una característica maravillosa: Nos devuelve el valor normalizado entre 0.0 y 1.0.

  • 0.0: Voltaje mínimo (GND).
  • 1.0: Voltaje máximo (3.3V normalmente).
  • 0.5: Mitad del recorrido.

Esta normalización hace que tu código sea portable. Si escribes un programa para un ESP32 (ADC de 12 bits) y lo pasas a un microcontrolador con ADC de 10 bits, tu código sigue funcionando igual porque siempre trabajas entre 0 y 1. ¡Adiós a recalcular rangos!

Conectar el potenciómetro

Para este ejemplo, vamos a conectar un potenciómetro clásico:

  1. Pata izquierda: GND.
  2. Pata derecha: 3,3 V. No apliques 5 V a una entrada que no sea tolerante.
  3. Pata central (Wiper): A un pin compatible con ADC.

No todos los GPIO admiten ADC y la asignación depende de la placa y del chip. Consulta el pinout de tu modelo antes de elegir el pin; además, recuerda que algunos ESP32 comparten recursos del ADC con la radio WiFi.

Leer el valor

Vamos a escribir un script que lea la posición del potenciómetro y la muestre por consola.

import { delay } from "@devicescript/core"
import { startPotentiometer } from "@devicescript/servers"
import { pins } from "@dsboard/esp32_c3_devkit_m" // O tu placa

// Iniciamos el servicio en el pin adecuado
const miPotenciometro = startPotentiometer({
    pin: pins.GPIO4 // Ajusta a tu pin ADC
})

console.log("Leyendo potenciómetro...")

setInterval(async () => {
    // Leemos la lectura actual (de 0 a 1)
    const valor = await miPotenciometro.reading.read()
    
    // Mostramos formateado con 2 decimales
    console.log(`Valor: ${valor.toFixed(2)}`)
    
}, 500) // Leemos cada medio segundo
Copied!

Al ejecutar el ejemplo en el simulador aparecerá un deslizador. Muévelo con el ratón y la consola mostrará valores como 0.15 o 0.89.

Ejemplo: regular el brillo de un LED

Aquí es donde la filosofía de DeviceScript brilla.

Queremos que el brillo de un LED sea proporcional al giro del potenciómetro.

  • En Arduino: analogWrite(led, map(analogRead(pot), 0, 4095, 0, 255)) -> Un lío de rangos.
  • En DeviceScript: Como el LED (LightBulb) espera intensidad de 0 a 1, y el Potenciómetro da 0 a 1… ¡Conectamos los valores directamente!
import { startPotentiometer, startLightBulb } from "@devicescript/servers"
import { pins } from "@dsboard/esp32_c3_devkit_m" 

// 1. Definimos Hardware
const pot = startPotentiometer({ pin: pins.GPIO4 })
const led = startLightBulb({ pin: pins.GPIO2 })

// 2. Lógica reactiva
// Nos suscribimos a cambios en la lectura
pot.reading.subscribe(async (valorActual) => {
    // Escribimos el valor directamente al LED
    await led.intensity.write(valorActual)
})
Copied!

Pruébalo en el simulador: al mover el deslizador cambiará el brillo de la bombilla. Ambos servicios utilizan el mismo rango normalizado.

Leer otros sensores analógicos

¿Qué pasa si no tengo un potenciómetro, sino un LDR (Fotorresistencia) o un sensor de humedad de suelo capacitivo?

El principio es el mismo. Físicamente, estos sensores suelen montarse en un divisor de tensión para entregar un voltaje variable. Para DeviceScript, siguen siendo una señal analógica.

Podemos seguir usando startPotentiometer (aunque el nombre no sea semánticamente perfecto) o buscar drivers específicos si existen. Al final, recibiremos un valor 0..1 proporcional al voltaje.

Nota sobre el ESP32: El ADC no es perfectamente lineal, especialmente cerca de los extremos. Si necesitas precisión, calibra el conjunto de placa, atenuación y sensor.