NodeMCU en español
NodeMCU - Juan Antonio Villalpando
-- Tutorial de NodeMCU en español --
Volver al índice del tutorial NodeMCU
____________________________
78.- NodeMCU. Modulación por anchura de pulso: PWM. Dos pulsadores para incrementar/decrementar la iluminación de un LED.
- En el tutorial de Arduino comenté qué es PWM: 6.- PWM con Arduino.
- La salida da un pulso siempre de la misma frecuencia (1 kHZ) y la misma altura, en este caso 3 V. Lo que cambia es la anchura del pulso.
- Hay un concepto llamado Duty Cycle.
- [NodeMCU tiene la posibilidad de cambiar la frecuencia, pero no lo veremos en este tutorial].
- Según el manual todos los terminales de datos D se pueden utilizar como PWM, menos el D0.
- En el Arduino el 100% del pulso se corresponde con el valor 255.
- En el NodeMCU el 100% del pulso se corresponde con el valor de 1023.
Arduino |
NodeMCU |
|
|
___________________________________________________
2.- Conexiones.
- Conectamos un LED al terminal D1 del NodeMCU, que se corresponde con el GPIO5 del ESP8266-E12.
_
__________________________________________________
3.- Código simple que envía cada segundo un Duty Cycle.
- Según la anchura del pulso así iluminará el LED.
Nodemcu_pwm.ino
|
// Juan A. Villalpando
// KIO4.COM
int LED5 = 5; // Es el terminal D1 del NodeMCU
void setup() {
pinMode(LED5, OUTPUT);
}
void loop() {
analogWrite(LED5, 0); // 0% en nivel 1
delay(1000);
analogWrite(LED5, 255); // 25% en nivel 1
delay(1000);
analogWrite(LED5, 512); // 50% en nivel 1
delay(1000);
analogWrite(LED5, 767); // 75% en nivel 1
delay(1000);
analogWrite(LED5, 1023); // 100% en nivel 1
delay(1000);
}
|
___________________________________________________
4.- Diente de sierra con PWM.
- El LED se irá iluminando poco a poco hasta llegar al máximo, luego se apagará y continuará el ciclo.
- Nota: este código se podría haber construido con otro algoritmo (bucle for, n =+5,...) pero lo he querido presentar de forma sencilla.
Nodemcu_pwm_lineal.ino
|
// Juan A. Villalpando
// KIO4.COM
int LED5 = 5; // Es el terminal D1 del NodeMCU
int n = 0;
void setup() {
pinMode(LED5, OUTPUT);
Serial.begin(9600);
}
void loop() {
n = n + 5;
if (n > 1023) {n = 0;}
Serial.println(n);
analogWrite(LED5, n);
delay(50);
}
|
- Consulta el Serial Plotter y verás este diente de sierra o barrido (sweep).
___________________________________________________
5.- Señal triangular con PWM.
- Es un código didáctico que puedes cambiar y mejorar. Observa el Serial Plotter.
Nodemcu_pwm_triangular.ino
|
// Juan A. Villalpando
// KIO4.COM
int LED5 = 5; // Es el terminal D1 del NodeMCU
int n = 0;
int sube = 5;
int baja = -20;
int incremento = 5;
void setup() {
pinMode(LED5, OUTPUT);
Serial.begin(9600);
}
void loop() {
n = n + incremento;
if (n > 1023) {incremento = baja;}
if (n < 0) {incremento = sube;}
Serial.println(n);
analogWrite(LED5, n);
delay(50);
}
|
___________________________________________________
6.- Tenemos dos pulsador y un LED, se iluminará con PWM.
- Cuando pulsemos un pulsador incrementará una variable en 5.
- Cuando pulsemos el otro pulsador decrementará la variable en -15.
- Esa variable es del Duty Cycle de un PWM que provocará más o menos iluminación en un LED.
- Si se pulsan los dos pulsadores a la vez mantiene en nivel que tenía.
- Consulta el Serial Plotter.
Nodemcu_pwm_dos_pulsadores.ino
|
// Juan A. Villalpando
// KIO4.COM
int LED5 = 5; // Es el terminal D1 del NodeMCU
int n = 0;
int sube = 5;
int baja = -15;
#define pulsa13 13 // Es el D8 del NodeMCU. Aquí irá un pulsador.
#define pulsa15 15 // Es el D7 del NodeMCU. Aquí irá un pulsador.
int valor13;
int valor15;
void setup() {
pinMode(LED5, OUTPUT);
pinMode(pulsa13, INPUT);
pinMode(pulsa15, INPUT);
Serial.begin(9600);
}
void loop() {
valor13 = digitalRead(pulsa13);
if (valor13 == HIGH && valor15 == LOW) { n = n + sube; }
valor15 = digitalRead(pulsa15);
if (valor15 == HIGH && valor13 == LOW) { n = n + baja; }
if (n > 1023) { n = 1023 ;}
if (n < 0) {n = 0; }
Serial.println(n);
analogWrite(LED5, n);
delay(50);
}
|
___________________________________________________
6.- Tenemos dos pulsador y un LED, se iluminará con PWM. Con pantalla LCD.
- Voy a añadir una pantalla LCD. En ella se verá el nivel de salida.
- Esta pantalla LCD está conectada a un bus I2C. Los terminales de este bus en el NodeMCU son: D1 (SCL) y D2 (SDA).
- Un pulsador aumenta la iluminación y el otro la disminuye.
- He tenido que cambiar el LED de posición con respecto al montaje del apartado anterior. Lo he puesto en D3 que corresponde al GPIO0.
Nodemcu_pwm_dos_pulsadores_lcd.ino
|
// Juan A. Villalpando
// KIO4.COM
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
int LED0 = 0; // Es el terminal D3 del NodeMCU
int n = 0;
int sube = 5;
int baja = -15;
#define pulsa13 13 // Es el D8 del NodeMCU. Aquí irá un pulsador.
#define pulsa15 15 // Es el D7 del NodeMCU. Aquí irá un pulsador.
int valor13;
int valor15;
void setup() {
pinMode(LED0, OUTPUT);
pinMode(pulsa13, INPUT);
pinMode(pulsa15, INPUT);
Serial.begin(9600);
lcd.begin(16,2); // Columnas y filas de LCD
}
void loop() {
valor13 = digitalRead(pulsa13);
if (valor13 == HIGH && valor15 == LOW) { n = n + sube; }
valor15 = digitalRead(pulsa15);
if (valor15 == HIGH && valor13 == LOW) { n = n + baja; }
if (n > 1023) { n = 1023 ;}
if (n < 0) {n = 0; }
Serial.println(n);
analogWrite(LED0, n);
delay(50);
// Pantalla LCD.
lcd.clear(); // Borra pantalla
lcd.setCursor(0,0); // Inicio del cursor
lcd.print("Nivel = ");
lcd.print(n);
}
|
___________________________________________________
7.- ¿Se podría enviar el Duty cycle por WiFi?
- Sí, pero sería lento, ya has visto en tutoriales anteriores que cada vez que se envía o recibe un dato por WiFi mediante una página web, ésta se debe actualizar.
________________________________
|