Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| iot:esp:esp32-ide [2025/11/19 14:48] – [Instalación en Arduino IDE] rab | iot:esp:esp32-ide [2025/11/19 15:11] (actual) – rab | ||
|---|---|---|---|
| Línea 110: | Línea 110: | ||
| === Instalando la Biblioteca === | === Instalando la Biblioteca === | ||
| - | La novedad aquí es que **Expressif**, | + | La novedad aquí es que **Expressif**, |
| Abra la Terminal y ejecute el siguiente comando (copiar-> | Abra la Terminal y ejecute el siguiente comando (copiar-> | ||
| Línea 172: | Línea 172: | ||
| - | + | Hay varios tarjetas diferentes con diferentes mapas de pin en el mercado. El diagrama de arriba muestra la placa que estoy usando. Puede encontrarlo aquí: | |
| - | Hay varios tarjetas diferentes con diferentes mapas de pin en el mercado. El diagrama de arriba muestra la placa que estoy usando. Puede encontrarlo aquí: [https:// | + | |
| ¡Perfecto! Por lo tanto, *digitalWrite()* funciona perfectamente, | ¡Perfecto! Por lo tanto, *digitalWrite()* funciona perfectamente, | ||
| Línea 200: | Línea 199: | ||
| Por ejemplo, para leer el sensor táctil 0 (T0), debe hacer algo como: | Por ejemplo, para leer el sensor táctil 0 (T0), debe hacer algo como: | ||
| - | ``` | + | |
| - | int value = touchRead(4); | + | int value = touchRead(4); |
| - | ``` | + | |
| Vamos a crear un código, donde si tocamos el sensor T0 (GPIO4), el LED se encenderá. | Vamos a crear un código, donde si tocamos el sensor T0 (GPIO4), el LED se encenderá. | ||
| Línea 210: | Línea 209: | ||
| Debajo del código completo: | Debajo del código completo: | ||
| - | ``` | ||
| - | / | ||
| - | * ESP32 Touch Test and LED Ctrl | ||
| - | * Touch pin ==> Touch0 is T0 which is on GPIO 4 (D4). | ||
| - | * LED pin | ||
| - | * | ||
| - | * MJRoBot.org 6Sept17 | ||
| - | *****************************************************/ | ||
| - | #define TOUTCH_PIN T0 // ESP32 Pin GPIO4 o D4 | ||
| - | #define LED_PIN 2 | ||
| - | int touch_value = 100; | + | / |
| - | + | * ESP32 Touch Test and LED Ctrl | |
| - | // | + | * Touch pin ==> Touch0 is T0 which is on GPIO 4 (D4). |
| - | void setup(){ | + | * LED pin |
| - | Serial.begin(115200); | + | * |
| + | * MJRoBot.org 6Sept17 | ||
| + | *****************************************************/ | ||
| + | #define TOUTCH_PIN T0 // ESP32 Pin GPIO4 o D4 | ||
| + | #define LED_PIN 2 | ||
| + | |||
| + | | ||
| + | |||
| + | // | ||
| + | void setup(){ | ||
| + | Serial.begin(115200); | ||
| while(!Serial){; | while(!Serial){; | ||
| - | | + | |
| - | pinMode(LED_PIN, | + | pinMode(LED_PIN, |
| - | digitalWrite (LED_PIN, LOW); | + | digitalWrite (LED_PIN, LOW); |
| - | } | + | } |
| - | + | ||
| - | // | + | |
| - | void loop(){ | + | |
| - | touch_value = touchRead(TOUTCH_PIN); | + | |
| | | ||
| - | | + | |
| + | void loop(){ | ||
| + | | ||
| | | ||
| - | | + | Serial.println(touch_value); |
| - | digitalWrite(LED_PIN, | + | |
| - | | + | |
| - | else{ | + | digitalWrite(LED_PIN, |
| - | digitalWrite(LED_PIN, | + | |
| + | else{ | ||
| + | digitalWrite(LED_PIN, | ||
| } | } | ||
| - | | + | |
| - | } | + | } |
| - | ``` | + | |
| - | ; | ||
| - | ``` | ||
| - | Es muy importante tener en cuenta que los ADC del ESP32 tienen 12bits de resolución | + | int analog_value = analogRead(36); |
| - | Para la entrada, usemos un potenciómetro de 10K ohm, conectándolo entre 3.3V y GND. Usemos su salida variable del potenciometro para la entrada para los pines ESP32 ADC. El diagrama de arriba muestra el potenciómetro conectado a GPIO36 que es el ADC1 canal 0. Pruebe también otras entradas en su tarjeta. | ||
| + | Es muy importante tener en cuenta que los ADC del ESP32 tienen 12bits de resolución (frente a 10bits en ESP8266 y Arduino), por lo que el rango total de lectura de ADC va a 4.095 (en vez de 1.027 en Arduinos y ESP8266) cuando se aplica un máximo de 3.3V a sus entradas. | ||
| - | ``` | + | Para la entrada, usemos un potenciometro de 10K ohm, conectándolo entre 3.3V y GND. Usemos su salida variable del potenciometro para la entrada para los pines ESP32 ADC. El diagrama de arriba muestra el potenciometro conectado a GPIO36 que es el ADC1 canal 0. Pruebe también otras entradas en su tarjeta. |
| - | #define ANALOG_PIN_0 | + | |
| - | int analog_value = 0; | ||
| - | // | + | #define ANALOG_PIN_0 |
| - | void setup(){ | + | |
| - | Serial.begin(115200); | + | int analog_value = 0; |
| - | while (!Serial) {;} | + | |
| + | | ||
| + | void setup(){ | ||
| + | Serial.begin(115200); | ||
| + | while (!Serial) {;} | ||
| | | ||
| - | | + | |
| - | } | + | } |
| - | + | ||
| - | // | + | |
| - | void loop(){ | + | |
| - | analog_value = analogRead(ANALOG_PIN_0); | + | |
| - | + | ||
| - | float voltage = (analog_value * (3.3 / 4095)); | + | |
| | | ||
| - | Serial.print(" | + | |
| - | Serial.print(", | + | void loop(){ |
| - | delay(500); | + | analog_value = analogRead(ANALOG_PIN_0); |
| - | } | + | |
| - | ``` | + | float voltage = (analog_value * (3.3 / 4095)); |
| + | |||
| + | | ||
| + | Serial.print(", | ||
| + | delay(500); | ||
| + | } | ||
| Gire su potenciómetro y observe en la salida del Serial Monitor del IDE Arduino, las mediciones que van de 0 a 4095. | Gire su potenciómetro y observe en la salida del Serial Monitor del IDE Arduino, las mediciones que van de 0 a 4095. | ||
| - | ## Salida Análoga usando PWM (dimmer digital) | + | === Salida Análoga usando PWM (dimmer digital) |
| Si queremos *Atenuar un LED* en ESP8266 o Arduino, podemos simplemente usar un comando como *analogWrite()*, | Si queremos *Atenuar un LED* en ESP8266 o Arduino, podemos simplemente usar un comando como *analogWrite()*, | ||
| Línea 322: | Línea 318: | ||
| Entonces, programemos uno de esos GPIO con una señal de salida PWM. | Entonces, programemos uno de esos GPIO con una señal de salida PWM. | ||
| - | Puede encontrar un muy buen tutorial en detalles sobre cómo funciona PWM en este enlace: [esp32-arduino-led-pwm-fading](https:// | + | Puede encontrar un muy buen tutorial en detalles sobre cómo funciona PWM en este enlace: [[https:// |
| Lo primero que hay que pensar sobre la generación de una señal PWM es su frecuencia. Utilizaremos un valor de 5000 Hz, que funciona bien con el LED. También debemos especificar el canal LED PWM y la resolución del ciclo de trabajo PWM, en bits. Podemos elegir un canal de 0 a 15 y una resolución entre 1 y 16 bits. Usaremos el canal 0 y una resolución de 8 bits. | Lo primero que hay que pensar sobre la generación de una señal PWM es su frecuencia. Utilizaremos un valor de 5000 Hz, que funciona bien con el LED. También debemos especificar el canal LED PWM y la resolución del ciclo de trabajo PWM, en bits. Podemos elegir un canal de 0 a 15 y una resolución entre 1 y 16 bits. Usaremos el canal 0 y una resolución de 8 bits. | ||
| - | ``` | + | |
| - | int freq = 5000; | + | |
| - | int ledChannel = 0; | + | |
| - | int resolution = 8; | + | |
| - | ``` | + | |
| Usemos GPIO2, donde tenemos nuestro LED externo conectado (y el interno) o podemos usar el GPIO0 para un led externo. | Usemos GPIO2, donde tenemos nuestro LED externo conectado (y el interno) o podemos usar el GPIO0 para un led externo. | ||
| - | ``` | + | |
| - | #define LED_PIN 0 | + | #define LED_PIN 0 |
| - | ``` | + | |
| Estos parámetros deben ser definidos en la etapa del *setup()*, usando las siguientes funciones: | Estos parámetros deben ser definidos en la etapa del *setup()*, usando las siguientes funciones: | ||
| - | ``` | + | |
| - | void setup(){ | + | void setup(){ |
| - | ledcSetup( ledChannel, freq, resolution ); | + | ledcSetup( ledChannel, freq, resolution ); |
| - | ledcAttachPin( LED_PIN, ledChannel ); | + | ledcAttachPin( LED_PIN, ledChannel ); |
| - | } | + | } |
| - | ``` | + | |
| Para encender el LED con un brillo específico, | Para encender el LED con un brillo específico, | ||
| Línea 351: | Línea 347: | ||
| Por ejemplo, para apagar el LED, el ciclo de trabajo debe ser cero y la función ledcWrite (ledChannel, | Por ejemplo, para apagar el LED, el ciclo de trabajo debe ser cero y la función ledcWrite (ledChannel, | ||
| - | ``` | ||
| - | int dutyCycle = 0; | ||
| - | ledcWrite( ledChannel, dutyCycle ); | + | int dutyCycle = 0; |
| - | ``` | + | |
| Los diferentes valores de la variable *dutyCycle* encenderán el LED con diferente brillo. Esta variable, *dutyCycle*, | Los diferentes valores de la variable *dutyCycle* encenderán el LED con diferente brillo. Esta variable, *dutyCycle*, | ||
| Línea 361: | Línea 356: | ||
| Podemos usar el potenciómetro (conectado a la variable *analog_value*) para configurar manualmente la variable *dutyCycle*, | Podemos usar el potenciómetro (conectado a la variable *analog_value*) para configurar manualmente la variable *dutyCycle*, | ||
| - | ``` | ||
| - | dutyCycle = map( analog_value, | ||
| - | ``` | ||
| - | Ahora veremos el código completo: | + | dutyCycle = map( analog_value, |
| - | ``` | ||
| - | / | ||
| - | * ESP32 Analog Input/ | ||
| - | * Analog Input: ADC_1_0 pin ==> GPIO36 (VP). | ||
| - | * PWM LED pin | ||
| - | * | ||
| - | * MJRoBot.org 6Sept17 | ||
| - | *****************************************************/ | ||
| - | //Analog Input | ||
| - | #define ANALOG_PIN_0 | ||
| - | // PMW LED | + | Ahora veremos el código completo: |
| - | #define LED_PIN | + | |
| - | int freq = 3000; // Periodo de PWM | ||
| - | int ledChannel = 0; | ||
| - | int resolution = 8; | ||
| - | int dutyCycle = 0; | ||
| - | int analog_value = 0; | + | / |
| - | // | + | * ESP32 Analog Input/Output Test |
| - | void setup(){ | + | * Analog Input: ADC_1_0 pin ==> GPIO36 |
| - | | + | |
| - | while(!Serial){; | + | |
| - | + | | |
| - | | + | *****************************************************/ |
| + | //Analog Input | ||
| + | #define ANALOG_PIN_0 | ||
| | | ||
| - | | + | // PMW LED |
| - | ledcAttachPin(LED_PIN, | + | |
| - | ledcWrite(ledChannel, | + | |
| - | } | + | |
| - | + | ||
| - | //------------------------------------------------------- | + | |
| - | void loop(){ | + | |
| - | | + | |
| - | Serial.println(analog_value); | + | |
| | | ||
| - | dutyCycle = map(analog_value, | + | |
| - | ledcWrite(ledChannel, | + | int ledChannel = 0; |
| - | delay(500); | + | int resolution = 8; |
| - | } | + | int dutyCycle = 0; |
| - | ``` | + | |
| - | + | int analog_value = 0; | |
| - | { | ||
| + | Serial.begin(115200); | ||
| + | while(!Serial){; | ||
| + | |||
| + | Serial.println(" | ||
| + | |||
| + | ledcSetup(ledChannel, | ||
| + | ledcAttachPin(LED_PIN, | ||
| + | ledcWrite(ledChannel, | ||
| + | } | ||
| + | |||
| + | // | ||
| + | void loop(){ | ||
| + | analog_value = analogRead(ANALOG_PIN_0); | ||
| + | Serial.println(analog_value); | ||
| + | |||
| + | | ||
| + | ledcWrite(ledChannel, | ||
| + | delay(500); | ||
| + | } | ||
| - | ## Control de Motor Servo | + | === Control de Motor Servo === |
| Controlemos un Motor Servo usando la capacidad PWM de nuestro ESP32. | Controlemos un Motor Servo usando la capacidad PWM de nuestro ESP32. | ||
| Línea 420: | Línea 412: | ||
| En primer lugar, es importante recordar que la frecuencia para trabajar con un Micro Servo es de 50Hz, por lo que debemos cambiar el parámetro de frecuencia a 50 (en lugar de 5000 con LED). También debemos especificar el canal LED PWM y la resolución del ciclo de trabajo PWM, en bits. Usaremos nuevamente el canal 0 y una resolución de 8 bits. | En primer lugar, es importante recordar que la frecuencia para trabajar con un Micro Servo es de 50Hz, por lo que debemos cambiar el parámetro de frecuencia a 50 (en lugar de 5000 con LED). También debemos especificar el canal LED PWM y la resolución del ciclo de trabajo PWM, en bits. Usaremos nuevamente el canal 0 y una resolución de 8 bits. | ||
| - | ``` | + | |
| - | int freq = 50; | + | |
| - | int channel = 0; | + | |
| - | int resolution = 8; | + | int channel = 0; |
| - | ``` | + | int resolution = 8; |
| La salida hacia el Motor Servo, se conectará a la salida GPIO5. | La salida hacia el Motor Servo, se conectará a la salida GPIO5. | ||
| - | ``` | + | |
| - | #define SERVO_PIN 5 | + | #define SERVO_PIN 5 |
| - | ``` | + | |
| Al igual que con el LED, esos parámetros se deben definir durante la fase de *setup()*, utilizando las siguientes funciones: | Al igual que con el LED, esos parámetros se deben definir durante la fase de *setup()*, utilizando las siguientes funciones: | ||
| - | ``` | + | |
| - | void setup(){ | + | void setup(){ |
| ledcSetup( channel, freq, resolution ); | ledcSetup( channel, freq, resolution ); | ||
| ledcAttachPin( SERVO_PIN, channel ); | ledcAttachPin( SERVO_PIN, channel ); | ||
| - | } | + | |
| - | ``` | + | |
| Para colocar el servo en un ángulo específico, | Para colocar el servo en un ángulo específico, | ||
| Línea 445: | Línea 438: | ||
| Por ejemplo, para colocar el servo alrededor de 90 grados, el ciclo de trabajo debe estar alrededor de 21 y la función *ledcWrite(ledChannel, | Por ejemplo, para colocar el servo alrededor de 90 grados, el ciclo de trabajo debe estar alrededor de 21 y la función *ledcWrite(ledChannel, | ||
| - | ``` | ||
| - | int dutyCycle = 21; | ||
| - | ledcWrite( channel, dutyCycle ); | + | |
| - | ``` | + | int dutyCycle = 21; |
| + | |||
| + | | ||
| Diferentes valores de la variable *dutyCycle* posicionarán el servo con diferentes ángulos. Esta variable, *dutyCycle*, | Diferentes valores de la variable *dutyCycle* posicionarán el servo con diferentes ángulos. Esta variable, *dutyCycle*, | ||
| Línea 455: | Línea 449: | ||
| Al igual que con el LED, el potenciómetro (conectado a la variable de valor analógico) se puede utilizar para configurar manualmente la variable dutyCycle y así cambiar la posición del servo. Una vez que sus rangos de valores son diferentes, utilicemos una función de mapa para que coincida con la entrada y la salida: | Al igual que con el LED, el potenciómetro (conectado a la variable de valor analógico) se puede utilizar para configurar manualmente la variable dutyCycle y así cambiar la posición del servo. Una vez que sus rangos de valores son diferentes, utilicemos una función de mapa para que coincida con la entrada y la salida: | ||
| - | ``` | ||
| - | dutyCycle = map( analog_value, | ||
| - | ``` | ||
| - | Ahora veremos el código completo: | + | dutyCycle = map( analog_value, |
| - | ``` | ||
| - | / | ||
| - | * ESP32 Servo Control | ||
| - | * Analog Input: ADC_1_0 pin ==> GPIO36 (VP). | ||
| - | * PWM SERVO pin | ||
| - | * | ||
| - | * MJRoBot.org 6Sept17 | ||
| - | *****************************************************/ | ||
| - | //Analog Input | + | Ahora veremos el código completo: |
| - | #define ANALOG_PIN_0 36 | + | |
| - | int analog_value = 0; | ||
| - | // PMW SERVO | ||
| - | #define SERVO_PIN 5 | ||
| - | int freq = 50; | + | / |
| - | int channel = 0; | + | * ESP32 Servo Control |
| - | int resolution = 8; | + | * Analog Input: ADC_1_0 pin ==> GPIO36 (VP). |
| - | int dutyCycle = 21; | + | * PWM SERVO pin |
| - | + | * | |
| - | // | + | * MJRoBot.org 6Sept17 |
| - | void setup(){ | + | *****************************************************/ |
| - | Serial.begin(115200); | + | |
| + | //Analog Input | ||
| + | #define ANALOG_PIN_0 36 | ||
| + | |||
| + | int analog_value = 0; | ||
| + | |||
| + | // PMW SERVO | ||
| + | #define SERVO_PIN 5 | ||
| + | |||
| + | | ||
| + | int channel = 0; | ||
| + | int resolution = 8; | ||
| + | int dutyCycle = 21; | ||
| + | |||
| + | // | ||
| + | void setup(){ | ||
| + | Serial.begin(115200); | ||
| while(!Serial){; | while(!Serial){; | ||
| | | ||
| - | | + | |
| | | ||
| - | | + | |
| - | ledcAttachPin(SERVO_PIN, | + | ledcAttachPin(SERVO_PIN, |
| - | ledcWrite(channel, | + | ledcWrite(channel, |
| - | } | + | } |
| - | + | ||
| - | // | + | |
| - | void loop(){ | + | |
| - | analog_value = analogRead(ANALOG_PIN_0); | + | |
| | | ||
| - | | + | |
| - | | + | |
| - | | + | |
| | | ||
| - | | + | Serial.print(analog_value); |
| - | ledcWrite(channel, | + | Serial.print(" |
| - | delay(50); | + | Serial.println(dutyCycle); |
| - | } | + | |
| - | ``` | + | |
| + | ledcWrite(channel, | ||
| + | delay(50); | ||
| + | } | ||
| Ahora podemos trabajar con el sensor ultrasónico en la parte superior del servo y construir un *Radar IoT!*. ¡Pero este será otro tutorial! | Ahora podemos trabajar con el sensor ultrasónico en la parte superior del servo y construir un *Radar IoT!*. ¡Pero este será otro tutorial! | ||
| - | { | ||
| + | Serial.begin(115200); | ||
| + | timeClient.begin(); | ||
| + | } | ||
| - | void setup(){ | ||
| - | Serial.begin(115200); | ||
| - | timeClient.begin(); | ||
| - | } | ||
| - | ``` | ||
| - | ## Simple Servidor WiFi | + | === Simple Servidor WiFi === |
| Probemos ahora nuestro ESP32 como un servidor WiFi simple. | Probemos ahora nuestro ESP32 como un servidor WiFi simple. | ||
| Línea 560: | Línea 553: | ||
| * Creado para el Arduino el 25/11/2012 por Tom Igeo. | * Creado para el Arduino el 25/11/2012 por Tom Igeo. | ||
| * Portada para Sparkfun ESP32 31.01.2017 por Joan Hendrik Berlin. | * Portada para Sparkfun ESP32 31.01.2017 por Joan Hendrik Berlin. | ||
| + | |||
| Un servidor web simple que le permite parpadear un LED a través de la web. Este programa imprimirá la dirección IP de su red WiFi ESP32 en el monitor serie. Desde allí, puede abrir esa dirección en un navegador web para encender y apagar el LED en el pin 5. | Un servidor web simple que le permite parpadear un LED a través de la web. Este programa imprimirá la dirección IP de su red WiFi ESP32 en el monitor serie. Desde allí, puede abrir esa dirección en un navegador web para encender y apagar el LED en el pin 5. | ||
| Línea 567: | Línea 561: | ||
| * http:// | * http:// | ||
| * http:// | * http:// | ||
| + | |||
| Este ejemplo está escrito para una red que utiliza el cifrado WPA. Para WEP o WPA, cambie la llamada adecuadamente de *Wifi.begin()*. | Este ejemplo está escrito para una red que utiliza el cifrado WPA. Para WEP o WPA, cambie la llamada adecuadamente de *Wifi.begin()*. | ||
| - | Circuito: LED conectado al pin 5 | + | |
| Entonces, usemos el programa sin modificaciones significativas. Cambiar el pin del LED externo a GPIO5. | Entonces, usemos el programa sin modificaciones significativas. Cambiar el pin del LED externo a GPIO5. | ||
| Línea 578: | Línea 573: | ||
| Primero ingrese sus credenciales de la red WiFi: | Primero ingrese sus credenciales de la red WiFi: | ||
| - | ``` | + | |
| - | const char * ssid = " | + | const char * ssid = " |
| - | const char * password = " | + | const char * password = " |
| - | ``` | + | |
| Y cargue el programa en su ESP32. | Y cargue el programa en su ESP32. | ||