> For the complete documentation index, see [llms.txt](https://udea-iot.gitbook.io/introduccion-al-iot/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://udea-iot.gitbook.io/introduccion-al-iot/interaccion-con-el-mundo-fisico/ejemplos/esp32/ejemplo-3.md).

# Ejemplo 3

## Medición de temperatura usando el sensor DS18B20 en el ESP32

### Descripción&#x20;

En el siguiente ejemplo se hace uso del sensor de temperatura DS18B20 para medir la temperatura en grados centigrados. El valor obtenido se imprime usando el monitor serial.

### Componentes

La siguiente tabla muestra los componentes principales del circuito a montar:

<table><thead><tr><th width="237.33333333333331">Componentes</th><th>Cantidad</th><th>Observaciones</th></tr></thead><tbody><tr><td>ESP32</td><td>1</td><td></td></tr><tr><td>KY-001 Temperature Sensor Module (Landzo)</td><td>1</td><td>Para mas información sobre este modulo consulte el siguiente <a href="https://arduinomodules.info/ky-001-temperature-sensor-module/">link</a></td></tr></tbody></table>

### Conexión

La conexión entre el sensor de temperatura y el ESP32 se muestra en la siguiente tabla:

<table><thead><tr><th width="226">ESP32</th><th>KY-001 Temperature Sensor Module (DS18B20)</th></tr></thead><tbody><tr><td>GND</td><td>S </td></tr><tr><td>3.3</td><td>Vin </td></tr><tr><td>GPIO2</td><td>GND (-)</td></tr></tbody></table>

#### Esquematico

La siguiente figura muestra el esquematico:

<figure><img src="https://4115294714-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxugokskCzICXfnqSP3ui%2Fuploads%2F9nzQxqTCfFfhZz9cvKB7%2FESP32-DS18B20_temperature_sensor_module_esquem%C3%A1tico.png?alt=media&amp;token=248137ad-c594-45f4-9b84-8033969d6ea3" alt=""><figcaption></figcaption></figure>

#### Conexión

A continuación se muestra la conexión entre los componentes:

<figure><img src="https://4115294714-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxugokskCzICXfnqSP3ui%2Fuploads%2FVSyGyZ5CRDUcG8fLZYP2%2FESP32-DS18B20_temperature_sensor_module_bb.png?alt=media&amp;token=8b333fd6-efae-4b82-afea-60f8eed21e85" alt=""><figcaption></figcaption></figure>

#### Archivo Fritzing

{% file src="/files/exMxTOISelcUSz986ZUd" %}

### Pasos previos

1. Configurar en Platformio la plataforma a emplear eligiendo como dispositivo el **ESP32** tal y como se resume en la siguiente tabla:

<table><thead><tr><th width="234">Parametro</th><th>Valor</th></tr></thead><tbody><tr><td><strong>Name</strong></td><td>Nombre del proyecto (ESP32_Temp-DS18B20 para este ejemplo)</td></tr><tr><td><strong>Board</strong></td><td>NodeMCU-32S (Board disponible en el laboratorio)</td></tr><tr><td><strong>Framework</strong></td><td>Arduino (Es el que hemos manejado)</td></tr></tbody></table>

La siguiente figura muestra el resultado al realizar la configuración en platformio:

<figure><img src="https://4115294714-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxugokskCzICXfnqSP3ui%2Fuploads%2FSSQnjchyCTO2wLOKrCof%2Fnew_config_esp32.png?alt=media&amp;token=1213b377-f540-4f92-ba6e-1c1b2db4886f" alt=""><figcaption></figcaption></figure>

2. Agregue las librerias necesarias: En nuestro caso estamos empleando el sensor **DS18B20 single-bus digital temperature sensor** ([datasheet](https://www.analog.com/media/en/technical-documentation/data-sheets/ds18b20.pdf)) por lo que es necesario agregar la libreria **DallasTemperature**. En la siguiente figura se muestra cuando se esta en la busqueda de la libreria:

<figure><img src="https://4115294714-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxugokskCzICXfnqSP3ui%2Fuploads%2FIJO4fHnis26wSqwdnwQm%2Flibrerias.png?alt=media&amp;token=23f7d741-d151-4883-a18c-e4894a6e8a0e" alt=""><figcaption></figcaption></figure>

Una vez que se encuentra la libreria se procede a instalarla (**Add project dependency**).&#x20;

<figure><img src="https://4115294714-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxugokskCzICXfnqSP3ui%2Fuploads%2FYERGsuPpm0GjVdmVR9Na%2Fadd_library.png?alt=media&amp;token=a9deb41c-7a76-4ab3-af13-cf1b03aebde8" alt=""><figcaption></figcaption></figure>

Finalmente una vez hecho lo anterior, si todo esta bien, el archivo **platform.ini** se vera de la siguiente forma:

```ini
; PlatformIO Project Configuration File
;
;   Build options: build flags, source filter
;   Upload options: custom upload port, speed and extra flags
;   Library options: dependencies, extra library storages
;   Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html

[env:nodemcu-32s]
platform = espressif32
board = nodemcu-32s
framework = arduino
lib_deps = milesburton/DallasTemperature@^3.11.0
```

3. Configurar el monitor serial: Conecte el ESP32 a uno de los puertos USB de su maquina y verifique el nombre que el sistema operativo le asigno, en el caso de Windows puede hacer la consulta por el administrador de dispositivos tal y como se muestra en la siguiente figura:

<figure><img src="https://4115294714-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxugokskCzICXfnqSP3ui%2Fuploads%2F8fABY2FAqtad3VlZEiU0%2FpuertoESP32_com.png?alt=media&amp;token=f3bab25e-1cc1-462c-8b4a-cae336aeabe8" alt=""><figcaption></figcaption></figure>

Una vez hecho esto proceda a realizar la configuración del puerto serial en el platformio teniendo en cuenta este nombre de puerto (**COM7**) en nuestro caso y la velocidad a la cual desea establecer la comunicación entre el PC y el ESP32. La siguiente figura muestra esto:

<figure><img src="https://4115294714-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxugokskCzICXfnqSP3ui%2Fuploads%2F72qxUqOJ0jit1tnedzON%2Fserial_monitor_plafotmio.png?alt=media&amp;token=5655ea0e-d58b-4052-a7d3-95f875f66f90" alt=""><figcaption></figcaption></figure>

El proximo paso consistira en codificar el programa que se descargara en el ESP32 en el archivo **main.cpp** (automaticamente generado al crear el proyecto). La siguiente figura muestra esto:

<figure><img src="https://4115294714-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxugokskCzICXfnqSP3ui%2Fuploads%2FGLdFYBEQbjEy653JNN2a%2Fmain_source.png?alt=media&amp;token=9d1f1d9d-3cc2-4f34-b9e6-c98352370b0d" alt=""><figcaption></figcaption></figure>

### Programa

A continuación se muestra el programa que se ejecuta en el ESP32, el cual basicamente es el mismo programa implementado para el Arduino UNO pero empleando otros pines:

```arduino
/* Librerias*/
#include <Arduino.h>
#include <OneWire.h>
#include <DallasTemperature.h>

/* Constantes */
#define SERIAL_SPEED 9600

/* Comunicacion */
// Data wire is plugged into pin 2 on the ESP32
#define ONE_WIRE_BUS 2

/* Entradas */

/* Salidas */
const int ledPin =  LED_BUILTIN; //(GPIO2 - D2)

/* Variables de la aplicacion */

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensor_DS18B20(&oneWire);

/* Funcion setup: Configuracion */
void setup(void) {
  // start serial port
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo");
  // Start up the library
  sensor_DS18B20.begin(); // IC Default 9 bit. If you have troubles consider 
                          // upping it 12. Ups the delay giving the IC more time 
                          // to process the temperature measurement
}


/* Funcion loop: Logica del programa */
void loop(void) { 
  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  Serial.print("Requesting temperatures... ");
  sensor_DS18B20.requestTemperatures(); // Send the command to get temperatures
  float T = sensor_DS18B20.getTempCByIndex(0);
  Serial.print("DONE ");

  Serial.print("Temperature for Device is: ");
  Serial.println(T); // Why "byIndex"? You can have more than one IC on the same bus. 
                     // 0 refers to the first IC on the wire
  delay(500);
}
```

La documentación de la libreria empleada puede ser consultada en el suguiente repositorio ([link](https://github.com/milesburton/Arduino-Temperature-Control-Library)).

### Prueba de funcionamiento

Una vez que la aplicación ha sido correctamente compilada y descargada a la ESP32 se puede proceder a verificar su correcto funcionamiento. En nuestro caso, si todo esta bien, la salida que se mostrara en el monitor serial tendra la siguiente forma:

<figure><img src="https://4115294714-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxugokskCzICXfnqSP3ui%2Fuploads%2FNUIWsSHJ4RIhHxdulZjc%2Fserial_monitoring.png?alt=media&amp;token=642eaacd-cf2f-4039-9b74-886fd6075175" alt=""><figcaption></figcaption></figure>

### Simulación

Para comprender el funcionamiento del programa, puede seguir el siguiente [link](https://wokwi.com/projects/367389483028836353) donde hay una simulación del programa.

{% hint style="warning" %}
**Importante**: La simulación <mark style="color:red;">**no dió como se esperaba**</mark>.
{% endhint %}

<figure><img src="https://4115294714-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxugokskCzICXfnqSP3ui%2Fuploads%2FvbciZ9ymXfHPhdraP5sA%2Fsimulacion_sensor_temperatura.png?alt=media&amp;token=8902d6eb-d6cd-4e5a-a527-59f78bf84b09" alt=""><figcaption></figcaption></figure>

## Para ir mas lejos

Si desea aún ir mas lejos, puede replicar el ejemplo disponible en la pagina de Random Nerd Tutorials: **ESP32 DS18B20 Temperature Sensor with Arduino IDE (Single, Multiple, Web Server)** ([link](https://randomnerdtutorials.com/esp32-ds18b20-temperature-arduino-ide/))

<br>
