AtomVM

AtomVM es una máquina virtual ligera que permite ejecutar bytecode de Erlang, Elixir y LFE (Lisp Flavored Erlang) en dispositivos incrustados con pocos recursos (como microcontroladores). Su objetivo es hacer posible usar lenguajes del ecosistema BEAM en hardware donde la máquina virtual de Erlang tradicional no puede correr por ser demasiado pesada.

Características principales

  • Permite usar lenguajes funcionales como Elixir en entornos de muy bajo nivel.

  • Consume muy poca memoria (menos de 500 KB en muchos casos).

  • Soporta concurrencia ligera y estructuras de datos funcionales.

  • Ideal para el desarrollo de sistemas incrustados inteligentes y compactos

Historia

AtomVM comenzó su desarrollo en el año 2018 por Pascal Gigler con el objetivo de llevar Elixir y Erlang a un hardware más pequeño. La comunidad fue creciendo, sumando desarrolladores que aportaron soporte para nuevos dispositivos y bibliotecas, llegando a poder realizarse proyectos industriales de IoT que necesitaban de un dispositivo con tolerancia a fallos, y concurrencia, las cuales tenia el dispositivo.

Ejemplo práctico: Medición ambiental con AtomVM y DHT11

Este ejemplo usa un sensor DHT11 conectado a un ESP32, leyendo temperatura y humedad usando Elixir sobre AtomVM.

Requisitos:

  • Microcontrolador ESP32 con AtomVM cargado.

  • Sensor DHT11 conectado al pin GPIO 4 (puedes cambiarlo).

  • Módulo nativo avm_dht disponible en el firmware de AtomVM.

Código fuente en Elixir
defmodule DHTReader do
  @dht_pin 4

  def start do
    IO.puts("Iniciando lectura del sensor DHT11...")

    loop()
  end

  defp loop do
    case :avm_dht.read(@dht_pin, :dht11) do
      {:ok, temperature, humidity} ->
        IO.puts("Temperatura: #{temperature} °C")
        IO.puts("Humedad: #{humidity} %")

      {:error, reason} ->
        IO.puts("Error al leer sensor: #{inspect(reason)}")
    end

    :timer.sleep(5000)  # Espera 5 segundos
    loop()
  end
end

DHTReader.start()

Conexiones del sensor DHT11 al ESP32

Sensor DHT11 ESP32

VCC

3.3V

DATA

GPIO 4

GND

GND

Instrucciones

  1. Compila el archivo con elixirc dht_reader.ex.

  2. Sube el archivo .beam al ESP32 con las herramientas de AtomVM.

  3. Asegúrate de incluir el módulo nativo avm_dht en tu firmware.

  4. El ESP32 imprimirá por consola la temperatura y humedad cada 5 segundos.

ESP32 sumado con Elixir Nerves permite crear sistemas más complejos, como sistemas de domotica, sistemas industriales, estaciones meteorológicas con panel, etc.

AtomVM logo

AtomVM y Elixir Nerves permiten unir el mundo del hardware incrustado con la programación funcional moderna. Usarlos en conjunto puede llevar a soluciones más robustas, escalables y fáciles de mantener. Además, estas tecnologías permiten desarrollar soluciones completas de IoT, automatización y monitoreo sin depender de lenguajes más difíciles como C o C++, y aprovechando todo el ecosistema de Elixir.