# 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.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://udea-iot.gitbook.io/introduccion-al-iot/interaccion-con-el-mundo-fisico/ejemplos/esp32/ejemplo-8.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
