Arduino y ESP32

Hace unos años empecé a conocer el mundo arduino y a construir y programar mis primeros circuitos útiles (principalmente 2):

    • Un monitor de una instalación fotovoltaica aislada, que me enviaba por GPRS el estado de las baterías junto con información de temperatura, humedad, carga desde un pequeño molinillo,etc. Mediante SMSs podía también enviarle comandos (rearrancar el inversor, cortar el riego,…)
    • Un monitor doméstico para control de apertura de la puerta principal, de la puerta del garage,sensores de movimiento, temperatura,… enviando también mediante un ESP8266 información que recogía en una BD.

Las principales ventajas de arduino para mí han sido siempre su bajo coste, la disponibilidad de accesorios, sensores, actuadores,…, el gran número de pines de I/O (siempre he utilizado una placa Mega, generalmente con una pantalla), la facilidad de programación,etc

El principal problema que me he encontrado con arduino ha sido la iteración con las placas de comunicaciones. Tanto la comunicación con la placa GPRS como con el ESP8266 era a través de comandos AT, que no dejaban de dar problemas. En algún momento intenté también algo con una placa bluetooth, pero tras varios fracasos acabé desistiendo.

Al poco de enterarme de que el ESP8266 se podía programar y usar como microcontrolador (que ignorante antes, eh?) conocí la existencia del ESP32, y ahí acabó para mi la relación con las placas arduino.

El ESP32 es más potente que las placas arduino, tiene más velocidad, más memoria, 2 cores de procesamiento, incorpora wifi y bluetooth y tiene librerias que te evitan el angorroso mundo AT. Su único inconveniente (al menos hasta ahora), es que dispones de menos pines de I/O, y eso se nota en algunas aplicaciones (pero afortunadamente no es problema en muchas otras).

En mi caso lo estoy utilizando para todas mis nuevas ocurrencias, y aún mantengo mi monitor de baterías sobre arduino, pero quien envía la información ahora es un ESP32 via wifi, y me he quitado la placa GPRS.

Me mantengo en el entorno IDE de arduino por comodidad, y he probado varias placas:

    • Placa de Heltec con pequeña pantalla incorporada
    • Placa DevKit v1
    • Placa de TTGO con pequeña pantalla a color
    • Placa DevKitC, con antena incorporada o antena externa

Pero me he encontrado problemas. El principal ha sido en una aplicación relativamente compleja (unas 3000 líneas de código, varios sensores y actuadores, envío de información a BD, control via wifi de los dispositivos desde una aplicacion en el móvil, e incorporando ahora control via bluetooth).

Los problemas:

    • Tiene menos pines que el arduino MEGA, pero además algunos de ellos tienen limitaciones (principalmente de cara al arranque, el 0, el 12, el 15).
    • Hice uso de los contactos touch que tiene, pero el umbral de disparo es variable y tenía demasiados falsos positivos a pesar de filtrar las lecturas. Al final decidí cambiarlos por pulsadores.
    • Es un dispositivo que internamente y en los pines I/O funciona con 3,3v, lo que implica revisar los sensores y usar adaptadores de nivel (p.e. en mi caso para los relés y algún led -con 3,3v hay que ser más esquisito con el voltaje de caída del led y la resistencia-), 1€ el shifter de 8 circuitos.
    • De vez en cuando rearrancaba al encender cosas. Es más sensible a los picos en la alimentación que el arduino. El problema se ha resuelto añadiendo un condensador entre Vcc y GND, y en algunos casos separando algunas  cargas altas a una 2ª fuente de alimentación. De los 3 posibles modos de alimentarlo [por el USB,  por el pin de 3,3v o por el pin de 5v] yo lo alimento por los pines 5v-GND.
    • Al cabo de varias horas o varios días de repente se colgaba. Por supuesto el primer sospechoso es el código, pero no encontré nada raro. A pesar de eso hice algunas mejoras que no resolvieron el problema:
      • Eliminación de la mayoría de usos del tipo String, dado que fragmenta la memoria.
      • Control del espacio libre de heap, stack y máximo bloque asignable.
      • Añadir un watchdog para loop().
      • Añadir en el Core-0 un control sobre el funcionamiento de loop (que corre en el Core-1)

Nada de esto funcionó, el watchdog tampoco, ni el control desde el Core-0. Seguía el hanging total del dispositivo, a pesar de que el programa corría sin problemas en un TTGO que no tenía nada conectado.

Esto y el hecho de que se colgaba siempre al desactivar un relé, me ayudo a encontrar al culpable: el pico de tensión que causaba el relé al desconectar la carga inductiva que había detrás (un transformador). Las cargas inductivas intentan mantener la corriente en el momento de desactivar el relé. Esto suele provocar una chispa entre los contactos del relé, pero lo que yo notaba era ese cuelgue en una de cada n desactivaciones.

La solución: un circuito snubber colocado en paralelo a la carga en cada uno de los relés que actúan cargas inductivas (en mi caso un transformador y unas electroválvulas), por 0,50€.

Autor: JdJ Adm

Administrador del jardindeljubilado.com

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

dos × 1 =