|     Inicio    |   |         |  |   FOROS      |  |      |      
   Elastix - VoIP B4A (Basic4Android) App inventor 2 PHP - MySQL
  Estación meteorológica B4J (Basic4Java) ADB Shell - Android Arduino
  AutoIt (Programación) Visual Basic Script (VBS) FireBase (BD autoactualizable) NodeMCU como Arduino
  Teleco - Emisora de A.M. Visual Basic Cosas de Windows Webs interesantes
T Búsqueda en este sitio:


.

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.

________________________________

 

- Mi correo:
juana1991@yahoo.com
- KIO4.COM - Política de cookies. Textos e imágenes propiedad del autor:
© Juan A. Villalpando
No se permite la copia de información ni imágenes.
Usamos cookies propias y de terceros que entre otras cosas recogen datos sobre sus hábitos de navegación y realizan análisis de uso de nuestro sitio.
Si continúa navegando consideramos que acepta su uso. Acepto    Más información