2022/03/19

Ejemplo de ESP8266 con lectura de DHT11

Hace ya un tiempo exploré como lidiar con el entorno de desarrollo de ESP8266. Mientras incorporaba esa arquitectura a un proyecto educativo que consiste en leer un sensor de temperatura DHT11 y transmitirlo por HTTP-POST, me encontré con que las instrucciones que tenía quizás ya no son vigentes.

El proceso es similar a cómo se hace con ESP32 y acá lo mostraré adaptado. 

 

No tomes este camino

Si no tenés curiosidad por mis desgracias, andá directo al Plan B más abajo.

Si lo tomás, tené en cuenta que te rompe la instalación de esp-idf.

 

Plan A

La estructura de archivos que es esta:

~/esp/
     /esp-idf
     /esp-idf-lib
     /ESP8266_RTOS_SDK
     /ceiot/
           /esp32
           /esp32c3
           /esp32s2
           /esp8266

Resaltado lo que vamos a agregar.

esp-idf es la SDK para ESP32, esp-idf-lib son componentes de un tal RusLand.

Vamos a suponer que al haber instalado previamente todo lo necesario para esp-idf, si siguieras los siguientes pasos en una máquina limpia quizás no alcanzaría.


$ git clone https://github.com/espressif/ESP8266_RTOS_SDK.git
$ cd ESP8266_RTOS_SDK.git
$ git checkout origin/release/v3.4
$ sudo apt install python3-pip python-setuptools libncurses5-dev
$ /usr/bin/python3 -m pip install --user -r requirements.txt
$ ./install.sh
$ . export.sh



Mirando por encima requirements.txt, que es lo que consume install.sh apreciarás que hay poca superposición.

 
export.sh te genera un entorno para que funcionen los make posteriores y se debe ejecutar en cada terminal que abrás. Si te falla por que no encuentra python, la primera tentación es ponerse a modificar las referencias a python por python2 o python3 en mi caso, primero en export.sh y luego en otras partes. Mala idea, lo mejor, recordando que tengo armada una virtual sólo para esto, es:
 

sudo ln -s /usr/bin/python3 /usr/bin/python

El problema de hacer esto es que te rompe luego lo que tengas para ESP32.

Así que tenés que estar alternando con:

sudo rm /usr/bin/python

Como no pienso hacer mucho es ESP8266, alternaré. Si luego se me ocurre algo mejor o alguien lo tiene, me lo pasa y lo pongo.
 
Si prestaste atención a cómo se hace en ESP32, habrás notado que acá no existe el paso para determinar que chip usas:
 
idf.py set-target esp8266

Esto es porque hay múltiples ESP32, como ESP32, ESP32c3, ESPs2 para mencionar algunos y sólo hay un ESP8266.

Listo para el build. Pero antes, incorporemos el proyecto, lo que hay uno tiene la tentación de hacer es (no hacer):
 
 
mkdir esp8266
cd esp32
cp CMakeLists.txt -r main/ Makefile ../esp8266
cd ../esp8266
 
 
Pero no, equivocado, lo que hay que hacer es:
 
cp -r ../ESP8266_RTOS_SDK/examples/wifi/getting_started/station .
mv station esp8266
# modificar el programa tal como con ESP32
 
 
Para la configuración de los componente, en este caso credenciales de WiFi:
 
make menuconfig

 
No te olvides de borrarlas al versionar .

Finalmente, para que funcione la parte del DHT11, hay que tocar el Makefile:

EXTRA_COMPONENT_DIRS += $(IDF_PATH)/../esp-idf-lib/components


Y ahora si

make 
make flash
make monitor


No tan fácil...

Habían varios errores simultáneos que me confundieron. Algunos relacionados con la inclusión de archivos, otros quizás relativos a los branches de cada repositorio, en una conversación en embebidos quedó registrado parte de esto, no aporta que lo repita acá.
 
Lo más significativo de esa conversación es que si hubiera leido el manual quizás hubiera detectado que hay componentes no soportados de esp-idf-lib en ESP8266 y que hay que excluirlos del proceso de compilación.

La receta resultante es, por ahora:
 
Usar los tags v3.4 y v0.8.2 (esp-idf y esp-idf-lib respectivamente)
 
En el Makefile, para que incluya esp-idf-lib:
 
EXTRA_COMPONENT_DIRS += $(IDF_PATH)/../esp-idf-lib/components
 
para que excluya los componentes no soportados:

EXCLUDE_COMPONENTS := max7219 mcp23x17 led_strip max31865 ls7366r hts221
 
 
Aún así, aunque compila no funciona:
 
 
...a ver...


Reconectando...
Reconectando...


 
Mmmh, fijate que intenta conectar a como dé lugar, habría que agregar un mensajito de log tal como he resaltado:

static void on_wifi_disconnect(void *arg, 
                        esp_event_base_t event_base,
                        int32_t event_id,
                        void *event_data){
  system_event_sta_disconnected_t *event =
     (system_event_sta_disconnected_t *)event_data;
 
  ESP_LOGI(TAG, 
            "Wi-Fi disconnected reason %d\n\r",
            event->reason);   

  ESP_LOGI(TAG,"Wi-Fi disconnected, trying to reconnect...");
  if (event->reason == WIFI_REASON_BASIC_RATE_NOT_SUPPORT){
      /*Switch to 802.11 bgn mode */

      esp_wifi_set_protocol(
         ESP_IF_WIFI_STA,
         WIFI_PROTOCOL_11B | 
         WIFI_PROTOCOL_11G |
         WIFI_PROTOCOL_11N);
  }
  ESP_ERROR_CHECK(esp_wifi_connect());
}


Si querés ver que hace esp_wifi_connect, no existe, me parece que está implementado en ROM o similar en el chip.

Ahora dice:

phy_version: 1163.0, 665d56c, Jun 24 2020, 10:00:08, RTOS new
I (415) phy_init: phy ver: 1163_0
I (426) example_connect: Connecting to thebox...
I (3217) wifi:state: 0 -> 2 (b0)
I (4217) wifi:state: 2 -> 0 (200)
I (4218) example_connect: Wi-Fi disconnected reason 2

I (4220) example_connect: Wi-Fi disconnected, trying to reconnect...
I (6286) example_connect: Wi-Fi disconnected reason 205




Las event-reasons están en components/esp8266/include/esp_wifi_types.h, son un montón y se llaman wifi_err_reason_t.

WIFI_REASON_AUTH_EXPIRE       = 2
WIFI_REASON_CONNECTION_FAIL   = 205 

 
¿Qué si probé con reiniciar el router? ¡Claro! antes de usar linux usaba windows...

Probé con
 
make menuconfig -> 
   Component config  --->
    Wi-Fi  --->
[*] Enable WiFi debug log (ESP8266_WIFI_DEBUG_LOG_ENABLE)
 
 
Pero no hallé como acceder o interactuar con ese log.
 

 
Me pasé al ejemplo más básico, station, para reducir variables, probé todo lo que sigue:
 
  • ESP8266_PHY_MAX_WIFI_TX_POWER, ya está en 20, pasé a 21Cambié de canal en el AP, del 11 al 1 y al 6 
  • Puse modo B only
  • Puse modo G only
  • Puse modo N only
  • AES en lugar de TKIP + AES
  • a 30 centímetros del AP
  • Branches v3.3 y v3.3-rc1
  • Cambié de router
  • Probé con 20 y 40 MHz de ancho

 
No encuentro más recursos, sólo esta pista:

WiFi.hostname("ESP-host"); before WiFi.begin(ssid, password);

Pero eso es con ArduinoIDE.

Me quedaría armar un Access Point para diagnosticar desde ese lado o buscar como hacer sniffing, quedará para otra vez.



No hay comentarios:

Publicar un comentario