Interfaz estándar de Arduino SPI e I2C
Las interfaces SPI e I2C están disponibles en la ranura de expansión. La interfaz SPI también se utiliza para LoRa, la interfaz I2C ya se utiliza para el reloj (RTC) y para el sensor externo de temperatura/humedad. Tenga en cuenta que las interfaces SPI o I2C no deben ser utilizadas simultáneamente por el software RadioShuttle y sus propias aplicaciones.
I2C se puede utilizar dentro del bucle (“loop”), ya que RadioShuttle no accede a él al mismo tiempo.
Con SPI solamente tiene sentido utilizar SPI si LoRa no está activo. Con la función UpdateNodeStartup(RS_Node_Offline)
, también se puede desactivar temporalmente el LoRa. Alternativamente, las interrupciones pueden ser desactivadas durante el propio acceso SPI.
La tarjeta Eagle: asignación de pines e interrupciones
Conector de antena U.FL
Un conector U.FL ya está soldado. Por favor, tenga en cuenta que el conector U.FL sólo está diseñado para unas pocas conexiones.
Precisión del convertidor analógico-digital (ADC) ESP32
Para aumentar significativamente la precisión de las mediciones de ADC en la tarjeta Eagle, la referencia del voltaje interna del procesador ESP32 se mide durante la producción de las tarjetas Eagle y se guarda internamente en la memoria eFuse. La función GetProperty(prop.ADC_VREF, 1100);
permite recuperar el valor en milivoltios para realizar un cálculo preciso de las mediciones ADC. Dado que casi todos los módulos del ESP32 tienen una desviación en su voltaje de referencia interno (1,100 voltios), la calibración de las tarjetas Eagle para mediciones de ADC más precisas es una gran ventaja.
El voltaje de referencia analógica interna del ESP es de aprox. 1,100 voltios (ajuste “Attenuation ADC_0db”), otros voltajes de referencia (p. ej. 6 dB = aprox. 2,2 voltios) sólo se derivan de la referencia interna de 1,100 voltios (0 dB). Por lo tanto, para las mediciones de ADC se recomienda utilizar el voltaje de referencia de 1,100 voltios (“ADC_0db”) de inmediato, ya que fue medido y, por lo tanto, calibrado durante la producción de la tarjeta Eagle.
El ADC ofrece una precisión de hasta 12 bits (12 bits = 4.096 gradaciones) en un rango de voltaje de 0-1.100 voltios (voltaje de referencia aprox. 1,100 voltios). Desafortunadamente, estas 4.096 gradaciones del ADC interno del ESP32 no son lineales, lo que afecta a la precisión de las mediciones del ADC. Para lograr mediciones ADC más precisas es necesario que ambos convertidores internos, ADC0 y ADC1, creen y utilicen sus propias tablas de consulta (“lookup tables”) para la linealización.
Como ya se ha mencionado anteriormente, las mediciones precisas de ADC sólo son limitadas, o sólo son posibles con un mayor esfuerzo de calibración. Un tema en el que el fabricante, Espressif Systems, debe seguir trabajando.
ESP32 “deepsleep” y despertar
Los siguientes pines soportan la función de despertador en el modo “deepsleep”:
IO 0
IO 2
IO 4
IO 12-15
IO 25-27
IO 32-34
IO 36-39
Además, la MCU se activa brevemente cada 10 segundos y hace que el led blanco parpadee brevemente como indicador de actividad. Sin embargo, esto se hace sin poner en marcha la MCU completamente. Cada minuto (definible) la MCU se inicia completamente para permitir que los programas comprueben periódicamente si hay alguna tarea que hacer – esto ahorra energía. Las siguientes funciones afectan al tiempo de reposo y al número de pasadas:
Función | Estándar | Min … Max |
---|---|---|
ESP32SetDeepSleepDuration(int ms) | 10 000 ms | 200 … 1 200 000 ms |
ESP32SetDeepSleepBlinkDuration(int µs) | 100 µs | Se recomienda un máximo de 10 000, para evitar un aumento significativo del consumo de energía |
ESP32SetDeepSleepWakeupInterval(int count) | 6 ejecuciones | Una vez que se han completado las ejecuciones, se produce un despertar (tiempo total = ejecuciones x duración) |
ESP32 “sleep” y despertar
La función sleep()
simple se utiliza cuando ya no quedan tareas por hacer. Permite que la CPU actual se duerma y espere por eventos como interrupciones, temporizador, etc. La memoria completa se conserva y el periférico sigue funcionando. Por lo general, una interrupción del sistema se produce 1 000 veces por segundo, por lo que el led 1 (verde) parpadea ligeramente. La función “sleep” también ahorra energía, evitando que la CPU se caliente. Sin embargo, “sleep” todavía se necesita una corriente de aprox. 55 mA, con “deepsleep” es de aprox. 800 µA.
La función sleep()
se ejecuta dentro de la función loop()
tan pronto como ya no hay tareas por hacer. Un bucle infinito dentro del bucle (“polling”) no es recomendable y debe ser evitado. La programación limpia debe estar basada en eventos y no en encuestas. Esto se aplica no sólo al ESP32 sino a todos los programas, también bajo Windows, Linux, Mac, y en particular en aplicaciones integradas (“embedded applications”).