Pràctica IoT: NodeMCU i sensor BME280. Plataforma Thingspeak

De wikijoan
Salta a la navegació Salta a la cerca

Kit de desenvolupament NodeMCU

Introducció

  • NodeMcu V3 Lua ESP8266 ESP12E CH340 WiFi Wireless Module Development Board W013

La meva placa és del fabricant Lolin (Lolin / Wemos)

Significa que està basat en el SoC ESP8266, i incorpora el mòdul ESP12E (que té l'antena i la memòria flash).

  • BME280 (sensor de temperatura, humitat, pressió i altímetre)

Tutorial NodeMCU:

Jo tinc la v3 de la placa NodeMCU, que també utilitza el SoC ESP8266. El NodeMCU és un kit de desenvolupament (que facilita molt el desenvolupament de projectes), que incorpora un SoC (system on a chip). Dins del SoC (xip) hi ha el microcontrolador (MCU). En el cas del ESP8266 el MCU és un Tensilica L106 de 32-bit.

Una alternativa a NodeMCU seria Arduino MKR1000, que també és un kit de desenvolupament. El principal avantatge que tenen les plaques Arduino MKR1000 i NodeMCU és que incorporen el mòdul WiFi, i és en aquest sentit que són bones plataformes per a IoT (podem controlar els pins d'entrada i sortida de forma remota i inal·làmbrica).

Resum ESP8266:

  • MCU de 32-bit de baix consum (Tensilica L106)
  • Mòdul WiFi de 2.4 GHz
  • RAM d'uns 50 kB
  • 1 entrada analògica de 10-bit (ADC)
  • 17 pins d'entrada i soritda GPIO (propòsito general)


Datasheet del ESP8266EX (nom oficial):

Veiem que el ESP8266 no té memòria per gravar el programa, però precisament el NodeMCU sí que en té.

El ESP8266 s'utilitza juntament amb diferents mòduls. Per exemple, el mòdul ESP12 és el que té la meòria flash i l'antena wifi.

Principals característiques de NodeMCU:

  • Conversor Sèrie-USB per tal de poder programar i alimentar a través del USB
  • Fàcil accés als pins
  • Pines de I/O per a sensors i actuadors
  • LEDs per indicar estat
  • Botó de reset

Pins I/O

Els pins disponibles i l'ordre dels pins els tinc en les imatges que es publiquen al tutorial que segueixo del Luis del Valle:

En principi disposo d'aquests pins:

  • 13 pins digitals: D0-D12
  • 1 pin analògic (A0)
  • 3 pins de 3,3V
  • 1 pin de 5V (versió V3 2 pins 5V)
  • 4 pins GND (versió V3 5 pins GND)

En la v3 els pins RSV són els pins extra que no existeixen en la v2.

És recomanable no utilitzar els pins GPIO6, GPIO7, GPIO8, GPIO9 (D11), GPIO10 (D12) i GPIO11, doncs s'utilitzen en el NodeMCU per comunicar-se amb la memòria Flash integrada.

Dels pins restants és aconsellable no utilitzar tampoc els pins D9 i D10 que es corresponen al Rx i Tx.

Per tant, per minimitzar els problemes, ens queden els pins D0-D8, 9 pins digitals I/O.

El pin analògic A0 és 0-3,3V i té una resolució de 10-bit.

Alimentació de la NodeMCU

La tensió d'alimentació de la placa NodeMCU és de 3,3V i per tant, en principi no podríem alimentar cap component que necessiti 5V. Si alimentem la placa pelo port USB (5V), internament té un regulador de voltatge que treu 3,3V o 5V. Els 3,3V s'utilitzen per alimentar el NodeMCU i treure els 3,3V pels pins marcats amb aquest valor. Els 5V s'utilitzen per alimentar altres components dins la placa i treure-ls pels pin de 5V.

Sense USB, per qualsevol d'aquests pins podem subministrar el voltatge marcat (3,3V o 5V). Però si alimentem amb 3,3V en el pin de 5V no tindrem els 5V disponibles (com és lògic).

Tot això ho hem de tenir en compte si tenim sensors que funcionen a 5V.

LEDs i pulsadors integrats

El NodeMCU V2 (suposo que el v3 és igual) té dos LEDs integrats, associats als pins D0 (GPIO16) i D4 (GPIO2). Aquests LEDs tenen la polaritat invertida. Per encendre'ls els hem de posar a LOW.

NodeMCU i IDE d'Arduino

Per carregar els programes s'utilitza típicament el IDE d'Arduino. Quan connectem per USB el dispositiu hauria de detectar automàticament el dispositiu. (en el tutorial hi ha un vídeo que s'ha de mirar si hi ha algun problema)

Per configurar el Arduino IDE per treballar amb NodeMCU és fàcil, i hem de seguir algun tutorial:

Bàsicament hem de ficar a Fitxer > Preferences > URLs addicionals de gestors de plaques:

I aleshores quan anem a Eines > Tarja > Gestor de Targes (és clickable). I aleshores, a sota, on posa ESP8266, s'ha d'instal·lar. Quan quedi instal·lat, ja podrem seleccionar una bona colla de plaques ESP8266. A mi una de les que m'ha funcionat és NodeMCU 1.0 (ESP12-E Module), que deu ser bastant genèrica (de fet, el meu NodeMCU és versió 3).

Si tenim problemes amb el port USB, hem d'arrencar el IDE d'Arduino com a root (això ja m'havia passat alguna vegada).

Solució:

Linux users may have to change ownwership of the USB port to communicate with the /dev/ttyUSB0 as in 'sudo chown yourusername /dev/ttyUSB0' or what ever you selected as your port in setup:

$ sudo chown joan /dev/ttyUSB0

1a prova: fer blinking del led intern

void setup() {
  //ref: https://programarfacil.com/podcast/nodemcu-tutorial-paso-a-paso/
  //el pin digital 4 (D4) està associat al GPIO2 (segons es veu en la imatge de la referència), i per tant he d'utilitzar la nomenclatura '2'. Aquest led és del mòdul ESP12-E-
  //(Recuerda cuando decimos GPIO nos referimos a la nomenclatura de los pines del ESP8266 y no a los de NodeMCU)
  //Aquest pin està associat internament a un LED de la placa (el mateix LED que dóna informació de quan s'està enviant el programa des del IDE d'Arduino).
  //Aquests LEDs tenen la particularitat que tenen la polaritat invertida: LOW encén el LED, i HIGH l'apaga

  //en la referència es parla que hi ha un altre LED a D0 (GPIO16) (associat a la pròpia placa). Però això no és cert per la versió que jo tinc de NodeMCU (v3, Lolin):
  //https://arduino.stackexchange.com/questions/38477/does-the-node-mcu-v3-lolin-not-have-a-builtin-led
  
  pinMode(2, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(2, LOW);
  delay(1000);
  digitalWrite(2, HIGH);
  delay(1000);
}

Sensor BME280

(TBD)

Pràctica: NodeMCU i BME280

Thingspeak exemple.png

El que més s'assembla al que jo vull fer:

En aquest tutorial hi ha els detalls de com configurar el Arduino IDE per tal de comunicar-se amb la placa NodeMCU i de com instal.lar les llibreries per treballar amb el sensor BME280.

Els meus resultats estan visibles a:

Step 1: Create & Setup Your Thingspeak Channels

Primer de tot creem un usuari a Thingspeak:
joanqc@gmail.com. joanillo/Jqc********

1. Create a free Thingspeak account and new channel at https://thingspeak.com , Call the channel "ESP8266-NodeMCU-12E-BME280"

Nom del canal: joanillo ESP8266-NodeMCU-12E-BME280

2. The new channel should have 3 fields named Temperature Humidity Pressure in that specific order (Note First Letter capitalization).

3. Take note of your new "channel ID" XXXXXX under "Channel Settings"
Channel ID: 512446
Author: joanillo
Access: Public

4. Click the "API Keys" link and take note of your "API Write" and "Read API Keys" XXXXXXXXXXXXXXX. Also, make this a public channel under sharing.

Write API Key: DYE9K71QEJ1S9F5A
Read API Key: WVKI6A2UISTD7PMZ

5. Create a second Thingspeak channel that will hold the "Today" (since midnight) High Low data. Call it "BME280 Daily High Low Data"
Nom del canal: joanillo BME280 Daily High Low Data

    Channel ID: 512449
    Author: joanillo
    Access: Public

6. This new channel should have 6 fields named Tmax Tmin Hmax Hmin Pmax Pmin in that specific order (Note First Letter capitalization).

7. Take note of the "BME280 Daily High Low Data" "channel ID" , "Read" & "Write API keys" just like in the above steps.

Write API Key: TTDKCWUN9IODZI99
Read API Keys: 759OXDZLVRG609TJ

Step 2: Setup the Arduino IDE, Libraries and Configure the BME280

La configuració de l'Arduino IDE per treballar amb el NodeMCU ja ho tinc fet.

Ara falta instal·lar les llibreries per treballar amb el sensor BME280.

You will need the "Adafruit Unified Sensor Driver" library, install it in the "Library Manager" in Arduino IDE. Menu Sketch --> Include Library --> Manage Libraries do a search by Type = "Recommended" Topic = "Sensors" then put the words Adafruit Unified Sensor Driver in the search box. The one you want says "Adafruit Unified Sensor Driver by Adafruit"

11. In addition, you will also require the "Adafruit BME280 Library" install it in the "Library Manager" in Arduino IDE. Menu Sketch --> Include Library --> Manage Libraries do a search by Type = "Recommended" Topic = "Sensors" then put the words Adafruit BME280 Library in the search box. The one you want says "Adafruit BME280 Library by Adafruit"

12. Another library you need is Wire.h , install it in the "Library Manager" in Arduino IDE. Menu, Sketch --> Include Library --> Manage Libraries Do a search by Type = "Contributed" Topic = "Signal Input/Output" then put the word Wire in the search box. The one you want says "Wire Built-in by Arduino" Most likely at the bottom of the selection.

13. One more library, ESP8266WiFi , install it in the "Library Manager" in Arduino IDE. Menu, Sketch --> Include Library --> Manage Libraries Do a search by Type = "Contributed" Topic = "Communication" then put the word ESP8266wifi in the search box. The one you want says "ESP8266wifi Built-in by Ivan Grokhotkov"

14. The I2C address for BME280 is hardcoded in the Adafruit_BME280.h file (look for the line #define BME280_ADDRESS 0x77) inside the Adafruit_BME280_Library folder. Adafruit’s BME sensor modules are hard-wired to use the I2C address of 0x77. But the BME280 can have a slightly different I2C address (0x76) if its external SDO pin is grounded. If you are using the sensor modules from a third party, it is likely that it’s address would not match with the default value in the Adafruit library. For example, for most of the BME280 sensor modules available on eBay or Aliexpress have their I2C address to be 0x76. If you dont get a response from the sensor using the default address set in the Adafruit_BME280.h file, you might need to change it to 0x76. (important tenir en comtpe això)

BME280 & ESP8266 Connection Points (connexions):

  • ESP8266 3.3V to BME280 Vin
  • ESP8266 GND to BME280 GND
  • ESP8266 D4 to BME280 SCL
  • ESP8266 D3 to BME280 SDA. 15

Open the provided ESP8266-NodeMCU-12E-BME280.html file in a text editor and enter your "ESP8266-NodeMCU-12E-BME280" (The first channel you created) "Channel ID" & "Read API Key" for the variables key1 & chan1. Also enter the "Read API Key" and "Channel ID" for "BME280 Daily High Low Data" (The second channel you created) for key2 and chan2. In addition, enter your timezone offset from UTC. As in -5 for me. All the values must be inside the provided single quotes 'XXXXX'. Save and exit the text editor.

Plug in your ESP8266 with the USB cable to your computer then select your serial port to be the USB port.

Linux users may have to change ownwership of the USB port to communicate with the /dev/ttyUSB0 as in 'sudo chown yourusername /dev/ttyUSB0' or what ever you selected as your port in setup.

Step 3: Program the ESP8266 With the Arduino IDE

Ara ja puc pujar el script .ino al NodeMCU. Però abans he de posar en el codi el SSID i password de la connexió wifi que utilitzo (a casa o al local).

També he de posar la API write key del primer canal que hem creat, doncs aquest script es comunica amb api.thingspeak.com per tal d'enviar-li les dades que recullo. La capa de visualització de les dades se n'ocupa thingspeak.com.

En el serial monitor podem veure com es pinten les dades cada 5 minuts.

Step 4: Go Back to the Thingspeak to Do Some Data Tweaking

Un cop ja funciona tot el sistema i tenim dades per analitzar, a Thingspeak podem configurar per analitzar les dades. Fa servir Matlab per calcular valors mitjans, etc.

(TBD)

Step 5: Edit the Provided HTML File

El fitxer ESP8266-NodeMCU-12E-BME280.html que ens proporcionen s'ha d'editar per canviar pels nostres valors de les API keys i el id dels canals. És un fitxer per obrir-lo en el navegador local, i visita la AP de Thingspeak per tal de visualitzar en local les dades que estan emmagatzemades a Thingspeak.


creat per Joan Quintana Compte, juny 2018