Skip to content

ESP-32

El ESP32 (o en mi caso ESP-wroom-32) es un dispositivo SoC que posee características muy superiores a un Arduino UNO o un ESP826. Dentro de estas características, cuenta con la capacidad de comunicarse vía Wifi y Bluetooth. Su bajo costo y las prestaciones hace que sea muy demandado.

Una de las características que más me llamó la atención es que cuenta con 2 procesadores (CPU) que pueden controlarse individualmente con una frecuencia ajustable entre 80 y 240 MHz. Algo no menor, ya que tengo mi ESP32 con algunos sensores corriendo con un solo núcleo hace 5 meses y podría haber aprovechado mucho de ello en vez de estar realizando delays para enviar los datos vía MQTT.

El sistema operativo que posee se llama freeRTOS y posee una implementación de la pila TCP/IP propia llamada LWIP. En un artículo se mencionan las razones por las que se usa esta implementación y no otras.

Dejo a continuación una tabla de características del manual de Espressif.

Usando el sensor de efecto Hall

Con el ESP32 podemos detectar campos magnéticos mediante un sensor de efecto hall. A grandes rasgos este sensor puede determinar cuándo está expuesto a un campo magnético externo al detectar una diferencia de potencial a partir de la desviación de los flujos de electrones hacia el extremo de la placa que compone dicho sensor.

Para esto es tan simple como usar la función hallRead() en el IDE arduino para ESP32 y nos retorna el valor al acercar un imán en la parte superior del encapsulado metálico.

Ejemplo:

c
void loop() {
    Serial.println(hallRead());
    delay(25);
}
void loop() {
    Serial.println(hallRead());
    delay(25);
}

Sensor touch

Los ESP32 cuentan con 10 sensores táctiles capacitivos que son:

  • GPIO2 = Touch 2
  • GPIO4 = Touch 0,
  • GPIO12 = Touch 5,
  • GPIO13 = Touch 4,
  • GPIO14 = Touch 6,
  • GPIO15 = Touch 3,
  • GPIO27 = Touch 7,
  • GPIO32 = Touch 9,
  • GPIO33 = Touch 9,
  • GPIO0 -> Puede no estar disponible en versiones con 30 GPIOs = Touch 1,

Con la función touchRead(GPIO) podemos leer un sensor táctil. Un ejemplo sencillo para utilizar el touch 0 con GPIO4 sería:

c
Serial.println(touchRead(4));
delay(1000)
Serial.println(touchRead(4));
delay(1000)

Capacitive Touch Sensor - ESP32

Usando los dos núcleos en paralelo

Después de unos meses con mi sensor de temperatura y humedad favorito DHT22 enviando datos por MQTT para tenerla en HomeAssistant, me di cuenta de que el ESP32 tenía 2 núcleos para utilizar. con freeRTOS podemos aprovechar esto y ejecutar wifi en un núcleo y procesar los datos del sensor en el otro. Por defecto cuando utilizamos el ESP32 estamos ejecutando las tareas sobre le núcleo con índice 1.

En el siguiente ejemplo vemos un código que ejecuta en momentos diferentes, tareas de manera independiente.

c
TaskHandle_t Task0;

void setup() {
	Serial.begin(115200);
	xTaskCreatePinnedToCore(
		loop0, // Función a ejecutar
		"Task_0", // nombre de la tarea
		1000, // tamaño de memoria en bytes que será asignada a la tarea
		NULL, // parámetros usados para crear la tarea
		1, // prioridad de ejecución
		&Task0, // Manejador que referencia a la tarea que será creada
		0 // procesador a utilizar (num processors - 1)
	);
}

void loop() {
	Serial.println("Core: " + String(xPortGetCoreID()));
	delay(1000);
}

void loop0(void *parameter) {
	while(true) {
		Serial.println("\t\tCore: " + String(xPortGetCoreID()));
		delay(250);
	}
}
TaskHandle_t Task0;

void setup() {
	Serial.begin(115200);
	xTaskCreatePinnedToCore(
		loop0, // Función a ejecutar
		"Task_0", // nombre de la tarea
		1000, // tamaño de memoria en bytes que será asignada a la tarea
		NULL, // parámetros usados para crear la tarea
		1, // prioridad de ejecución
		&Task0, // Manejador que referencia a la tarea que será creada
		0 // procesador a utilizar (num processors - 1)
	);
}

void loop() {
	Serial.println("Core: " + String(xPortGetCoreID()));
	delay(1000);
}

void loop0(void *parameter) {
	while(true) {
		Serial.println("\t\tCore: " + String(xPortGetCoreID()));
		delay(250);
	}
}

En el monitor de salida se verá:

Más documentación sobre esto

Task API

Videos