ESP32 Basic Starter Kit for dummys: Proyecto - 2 Entrada / Salida con GPIO

En este segundo proyecto va a "caharrear" además de programar, dado que va a aprender cómo utilizar los 36 GPIO (General Purpose Input/Output o Conectores de Entrada/Salida genéricos) de la placa ESP32 DEVKIT V1  mediante:

  • la definición pinMode(GPIO, MODE)donde GPIO es el numero del PIN (Para salida y entrada no se pueden usar los GPIO del  6 al 11, y pasara salida tampoco  los 34, 35, 36 y  39) y MODE el uso que se le va a dar, y los MODE básicos son: INPUT (entrada) y OUTPUT (salida)
  • el comando digitalWrite(GPIO, STATE)para la salida HIGH (5V) y LOW (0V) 
  • el comando digitalRead(GPIO), para la entrada que devolverá al programa los valores HIGH para 5V de entrada y LOW para 0V


Asignación de los PINES de la ESP32 DEVKIT V1- DOIT


Esquema visual de montaje. 
Del LED recuerde que la conexión larga es la (+) y la corta (-), si lo conecta al revés no funcionará.
Sobre la placa de montaje debe saber que las dos filas superiores y las dos inferiores están conectadas  cada una de ellas de forma continua en toda su longitud (azul que se usa por convención para la alimentación - y la roja para la alimentación +). Las 10 filas centrales por el contrario están conectadas por columnas y se interrumpen en el centro por esa especie de valle o rio que les separan
Esquema electrónico realizado con circuit-diagram
Conviene que se acostumbre a interpretar los esquemas que es la forma convencional de documentar los circuitos eléctricos y electrónicos (Más sobre las herramientas para el diseño de circuitos)

Otra información con la que deberá familiarizarse es con los códigos de colores de las resistencias. 
La primera banda es el primer dígito, la segunda el segundo, el tercero el tercero  y el cuarto el multiplicador (tambien se emplean solamente  3 bandas), y la última la tolerancia. 10K es marrón (1)- negro (0)- negro(0) - rojo (100) = 10.000Ω
Otro parámetro importante es la potencia que admite, pero eso es otro tema que ahora no tiene importancia y por ultimo su composición que tampoco nos influye por el momento

El programa es el siguiente:

// Inicializa constantes
const int buttonPin = 4; // Boton GPIO 4
const int ledPin = 5;    // LED GPIO 5
// Inicializa variable
int buttonState = 0;
void setup() {
Serial.begin(115200);
pinMode(buttonPin, INPUT); // GPIO 4 Entrada BOTON
pinMode(ledPin, OUTPUT);   // GPIO 5 Salida LED
} void loop() {
// Lee el estado del botón GPIO 4
buttonState = digitalRead(buttonPin);
Serial.println(buttonState); 
// Si está HIGH entonces ... sino ... 
if (buttonState == HIGH) {
// Enciende LED ON
digitalWrite(ledPin, HIGH);
Serial.println("ON"); 
} else {
// Apaga LED OFF
digitalWrite(ledPin, LOW); 
Serial.println("ON");  
}}

El montaje real no es tan ideal como el del dibujo del tutorial

Si el circuito no va, revise que todo está montado como el esquema, y que los componentes están bien enchufados.

NOTA:A mí se me queda el LED en ON pese a soltar el pulsador ¿?, seguramente está relacionado con que  el pin esté leyendo estados indeseados cuando el botón no está presionado. La resistencia de 10kΩ entre el pin 4 y GND o resistencia Pull-Down deberia evitar este problema. (sobre PullUp y Pulldown).

Si le ha gustado podría pensar sin tocar el circuito hacer que el LED esté intermitente

// Inicializa constantes
const int ledPin = 5;      // LED   GPIO 5
void setup() {
pinMode(ledPin, OUTPUT);   // GPIO 5 Salida LED
void loop() {
      digitalWrite(ledPin, HIGH); //enciende el LED
      delay(1000);                //espera un segundo       
      digitalWrite(ledPin, LOW);  //apaga el LED
      delay(1000);           
}

Esquema del intermitente


y si prefiere una sirena como las de las ambulancias, pues modifica un poco el circuito para incluir un segundo LED en el GPIO 18

// Inicializa constantes
const int ledPinI = 5;    // LED   GPIO 5
const int ledPinD = 18;    // LED   GPIO 18
void setup() {
pinMode(ledPinI, OUTPUT);   // GPIO 5 Salida LED
pinMode(ledPinD, OUTPUT);   // GPIO 18 Salida LED
void loop() {
      digitalWrite(ledPinI, HIGH); 
      digitalWrite(ledPinD, LOW); 
      delay(1000);            
      digitalWrite(ledPinI, LOW); 
      digitalWrite(ledPinD, HIGH); 
      delay(1000);           
}

Esquema de la sirena con dos LEDs

También puede hacer un semáforo que pase de verde, a naranja o ambar (intermitente) y de este a rojo para pasar de nuevo a verde (Programa basado en este otro).

// Define los GPIO 
int red = 12;
int yellow = 13;
int green = 14;
 
// Define el modo e trabajo de los GPIO 
void setup(){
  pinMode(red, OUTPUT);
  pinMode(yellow, OUTPUT);
  pinMode(green,  OUTPUT);
}
 
//Bucle de la secuencia del semaforo  
void loop(){
// ROJO 15s
digitalWrite(red, HIGH);
 delay(15000);
digitalWrite(red,  LOW);  
// VERDE 20s
digitalWrite(green, HIGH);
delay(20000);
digitalWrite(green,  LOW);
//  AMARILLO 7,5s
digitalWrite(yellow, HIGH);
delay(1000);
  digitalWrite(yellow,  LOW);
delay(500);
  digitalWrite(yellow, HIGH);
delay(1000);
  digitalWrite(yellow,  LOW);
delay(500);
  digitalWrite(yellow, HIGH);
delay(1000);  
  digitalWrite(yellow, LOW);
delay(500);
  digitalWrite(yellow, HIGH);
delay(1000);
  digitalWrite(yellow, LOW);
delay(500);
  digitalWrite(yellow, HIGH);
delay(1000);
  digitalWrite(yellow, LOW);
delay(500);
 
Vamos a mejorar el programa y aprenderemos cómo evitar escribir una y otra vez las mismas instrucciones, gracias  al comando FOR. Dentro   del paréntesis () y separados por ; encontramos el indice que llamaremos i con su valor inicial que es 0 "i=0", el bucle se ejecutará mientras se cumpla la condición de que el índice sea menor que 5 "i < 5", y el incremento i++ significa que cada vez que se ejecuta el bucle el indice i se incrementa en una unidad)

// Define los GPIO  
int red = 12;
int yellow = 13;
int green = 14;
 
// Define el modo e trabajo de los GPIO 
void setup(){

  pinMode(red, OUTPUT);
  pinMode(yellow, OUTPUT);
  pinMode(green,  OUTPUT);
  
}
 
//Bucle de la secuencia del semáforo   
void loop(){
  // ROJO
digitalWrite(red, HIGH);
 delay(15000);
digitalWrite(red,  LOW);
 // VERDE
digitalWrite(green, HIGH);
delay(20000);
digitalWrite(green,  LOW);
//  AMARILLO
for(int i = 0; i < 5; i++)
  { 
  digitalWrite(yellow, HIGH);
  delay(1000);
  digitalWrite(yellow,  LOW);
  delay(500);
  }

Esquema del circuito del semaforo

 

Si es amante de las maquetas puede adquirir los tres leds en forma de semaforo

Cuando  comience a programar verá que es útil incluir mensajes mediante la instrucción que ya hemos visto Serial.println() que no aportan nada al programa pero que le permitirá ver por consola por donde va el flujo, terminadas las pruebas puede borrar estas líneas o comentarlas.

Una herramienta web que puede probar es wokwi que permite simular el comportamiento de un programa ESP31 ( Ver: ESP32 Basic Starter Kit for dummys:  WORKI)

Por experiencia le puedo decir que resulta mucho mas fácil manejar los GIO en un arduino que en una Raspberry ( GPIO de Raspberry), o dicho de otra manera si va a interactuar con periféricos hardware mejor usar un Arduino que una Raspberry





Prohibida la reproducción parcial o total de este artículo sin permiso previo del autor

Comentarios

Entradas populares de este blog

SDR - Software Defined Radio - IIIb: Receptores RSP o MSI (MSI3001: MSI2500 + MSI001)

Amplificadores LNA compactos

ESP32 LoRa for dummys - Inicio