Para mostrar datos al usuario he usado una matriz de leds 8x8, en concreto esta de Amazon SainSmart MAX7219 Red LED Dot Matrix Display que cuenta con un controlador MAX7219 para la muestra de datos. La conexión entre la pantalla y el módulo ESP32 se realiza mediante el protocolo SPI.
El protocolo SPI es un protocolo serie maestro-esclavo, en nuestro caso ESP32-pantalla. La comunicación se realiza mediante 3 cables dado que solo usamos un único dispositivo y que éste no devuelve información al dispositivo:
MOSI es el bus de datos que van desde el maestro hasta el esclavo, CLK el reloj del bus y CS es una linea que permite seleccionar el dispositivo. En la imagen inferior podemos ver un esquema más complejo de SPI donde se ve como se usa otra linea más llamada MISO por la que los esclavos envian información al maestro. También podemos ver como son necesarias más lineas de selección de dispositivo CS (o en la imagen SSn). En el proyecto solo hacen falta usar las tres comentadas previamente.
Para la implementación de la comunicación con la pantalla también se ha hecho uso de las utilidades extraidas de nkolban https://github.com/nkolban/esp32-snippets y que se explican en la sección Bluetooth BLE. La biblioteca MAX7219.h nos permite interactuar con la pantalla tanto modificando el estado individual de los leds de la matrix como modificando columnas o filas enteras usando un valor de 8bits.
A la hora de mostrar los datos tenemos dos tipos, números para la velocidad y distancia, y puntos individuales para mostrar la orientación. Para mostrar los números los he codificado como un array de valores (imagen inferior). Para cada número tenemos la cantidad de columnas que ocupa, el tamaño que ocupa en cada columna, y los valores en binario de cada led de cada comlumna. Para acceder a cada valor basta con hacer el cálculo número*5, para obtener el índice de inicio de cada dato. Por cada columna afectada llamamos a matrix->setColumn(numeroColumna, NUMBERS[indice]); para establecer los leds encendidos.
Para mostrar la orientación hacemos el proceso a mano revisando intervalos de 45˚ de orientación para establecer una línea de 3 puntos. En la imagen inferior vemos como quedaría si nos estuvieramos dirigiendo al noreste.
En el siguiente código se muestra como se dibujaría la orientación norte, encendiendo primero el led central y luego los correspondientes a esa orientación.