> 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-8.md).

# Ejemplo 8

## Uso del Rotary encoder...

### Descripción&#x20;

Este ejemplo en construcción ...

### Componentes

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

<table><thead><tr><th width="252.33333333333331">Componentes</th><th width="107">Cantidad</th><th>Observaciones</th></tr></thead><tbody><tr><td>ESP32</td><td>1</td><td></td></tr><tr><td>KY-021 MINI SWITCH</td><td>1</td><td>Disponible en el <strong>37 sensor Kit</strong>. Para mas información sobre este puede consultar la pagina <strong>KY-021 MINI MAGNETIC REED SWITCH MODULE</strong> (<a href="https://arduinomodules.info/ky-021-mini-magnetic-reed-switch-module/">link</a>)</td></tr></tbody></table>

### Conexión

La conexión entre el sensor de ultrasonido se muestra en la siguiente tabla:

| ESP32  | DS1307 |
| ------ | ------ |
| GND    | GND    |
| 5V     | VCC    |
| GPIO21 | SDA    |
| GPIO22 | SCL    |

#### Esquematico

A continuación se muestra el esquematico del circuito:

<figure><img src="/files/8lPS92AoSFbGTvBYwdzb" alt=""><figcaption></figcaption></figure>

#### Conexión

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

<figure><img src="/files/mCiSpiWlXJCtgypDxOqs" alt=""><figcaption></figcaption></figure>

#### Archivo Fritzing

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

### Pasos previos si se usa platformio

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="199">Parametro</th><th>Valor</th></tr></thead><tbody><tr><td><strong>Name</strong></td><td>Nombre del proyecto (ESP32-DS1307)</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>

2. Agregue las librerias necesarias: En este caso se instalo la libreria **RTClib** de adafruit

<figure><img src="/files/6po169ePNqE903JpCCjL" alt=""><figcaption></figcaption></figure>

Al final el archivo **platformio.ini** quedo configurado de la siguiente manera:

```ini
[env:nodemcu-32s]
platform = espressif32
board = nodemcu-32s
framework = arduino
```

### Programa (implementado en el IDE de Arduino)

A continuación se muestra el programa que se ejecuta en el ESP32. Si este se hubiese implementado en platformio adicionalmente el **main.cpp** tendria incluida la libreria al principio:

```arduino
#include <Arduino.h>
```

En nuestro ejemplo como la implementación se hizo en el IDE de Arduino no se incluye esta libreria de modo que queda como se muestra a continuación.

```arduino
#include <Arduino.h>

/* ---- Pines I/O ---- */

// Rotary encoder Encoder (I)
#define ENCODER_CLK 14
#define ENCODER_DT  12
#define ENCODER_SW  13
#define DEBUG 1


// Constantes
const char MAX_PUSH_TIME = 100;

// Variables aplicacion
unsigned char counter = 0;       // Brillo led integrado
int lastClk = HIGH;              // Valor anterior señal CLK
long int resetLastChanged = 0;   // cambio reset

/* ---- Inicialización ---- */
void setup() {
  // Inicializacion serial
  Serial.begin(115200);

  // Inicializacion I/O
  pinMode(LED_BUILTIN,OUTPUT);   
  pinMode(ENCODER_CLK, INPUT);
  pinMode(ENCODER_DT, INPUT);
  pinMode(ENCODER_SW, INPUT_PULLUP);

  // Impresion en el monitor serial
  #if DEBUG
    Serial.print("Counter: ");
    Serial.println(counter);      
  #endif

}

/* ---- Loop infinito ---- */
void loop() {
  // Chequeo del reset presionado por un tiempo mayor de MAX_PUSH_TIME 
  if (digitalRead(ENCODER_SW) == LOW && millis() - resetLastChanged > MAX_PUSH_TIME) {
    resetLastChanged = millis();
    counter = 0;
    #if DEBUG
      Serial.print("Counter [Reset]: ");
      Serial.println(counter);   
    #endif
    analogWrite(LED_BUILTIN,counter);   
  }

  // Actualizancion del brillo
  int newClk = digitalRead(ENCODER_CLK);
  if (newClk != lastClk) {
    // There was a change on the CLK pin
    lastClk = newClk;
    int dtValue = digitalRead(ENCODER_DT);    
    if (newClk == LOW && dtValue == HIGH) {
      // Aumento brillo
      counter++;
      #if DEBUG
        Serial.print("Counter [Up]: ");
        Serial.println(counter);
      #endif
    }
    if (newClk == LOW && dtValue == LOW) {
      // Disminución brillo
      counter--;
      #if DEBUG
        Serial.print("Counter [Down]: ");
        Serial.println(counter);
      #endif
    }
    analogWrite(LED_BUILTIN,counter);   
  }
}
```

### Prueba de funcionamiento

La siguiente figura muestra la salida en el monitor serial cuando el programa es ejecutado:

<figure><img src="/files/CWtp17ddjcAVM32nX8BQ" alt=""><figcaption></figcaption></figure>

### Componentes importados

... Componente del rotator se invoco del siguiente link: <https://forum.fritzing.org/t/ky-040-rotary-encoder-breakout-board-part/11073>

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

... Simulación en el siguiente enlace: <https://wokwi.com/projects/367656993429289985>

### Referencias

1. <https://wiki.dfrobot.com/EC11_Rotary_Encoder_Module_SKU__SEN0235>
2. <https://wiki.seeedstudio.com/Grove-Encoder/>
3. <https://www.adafruit.com/product/377>
4. <https://learn.adafruit.com/adafruit-i2c-qt-rotary-encoder/overview>
5. <http://www.eran.io/rotary-encoder-based-cooking-timer/>
6. <https://howtomechatronics.com/tutorials/arduino/rotary-encoder-works-use-arduino/>
7. <https://circuitdigest.com/microcontroller-projects/rotary-encoder-module-interfacing-with-arduino>
8. <https://www.upesy.com/blogs/tutorials/rotary-encoder-esp32-with-arduino-code>
9. <https://electricdiylab.com/how-to-connect-optical-encoder-with-esp32/>
10. <https://randomnerdtutorials.com/21-arduino-modules-you-can-buy-for-less-than-2/>
11.
