Cómo hacer un contador (Pulsador + Arduino UNO + OLED display)



Hola amigos les traigo un vídeo en donde aprenderemos a desplegar gráficos en la pantalla OLED SSD1306 usar las fuentes de la librería y leer un pulsador de la manera fácil y rápida sin errores o sobresaltos. Es un ejemplo o muestra de lo que se puede hacer con el nuevo display de 0.96" con comunicación I2C y bajo consumo de energía. Un simple contador de eventos muy practico.

Leer entradas digitales es algo muy común en los proyectos de Arduino y aquí les presento una idea para practicar. En este caso se usa la resistencia interna del microcontrolador ATMEGA 328P para hacer muy simple el circuito.

Recuerden que pueden hacer lo que quieran con el código, comen tenme sus ideas... DESCARGA LA CARPETA CON EL CÓDIGO Y TODOS LOS ARCHIVOS DEL PROYECTO: http://eunsetee.com/ftfM Si no sabes como instalar las librerias te invito a que veas el siguiente video: https://youtu.be/yUEjELvq9ME MATERIALES
Arduino UNO Display OLED Cables Pulsador Fuente de poder (puerto USB o conector 9-12v) Protoboard

Aquí les dejo el código principal .ino:
/*
Ejemplo basico contador de eventos digital pulsador + pantalla OLED 128x64 I2C con el driver SSD1306.

Este ejemplo es de dominio publico hagan lo que quieran con el :D
Autor: Sergio A. Yañez M.
Año: 2019
Tutorial para el canal AQUILES VAESA 
youtube.com/aqulesvaesa

***** CONEXIONES *****

DISPLAY - ARDUINO
    GND = GND
    VCC = 5V ó 3.3V
    SCL = A5
    SDA = A4

Importante!!! necesitas instalar estas librerias:
https://github.com/adafruit/Adafruit-GFX-Library
https://github.com/adafruit/Adafruit_SSD1306

*/
#include "imagenes.h"
#include <Adafruit_SSD1306.h>  // incluye la libreria de adafruit para el driver del display OLED
#include <Adafruit_GFX.h>  // incluye la libreria de adafruit para gestionar los efectos graficos de manera facil
#include <Fonts/FreeSerifBold24pt7b.h> // incluye una fuente disponible en el paquete de la libreria adafruit
#include <Fonts/FreeSansBold12pt7b.h> // incluye una fuente disponible en el paquete de la libreria adafruit
Adafruit_SSD1306 display(128, 64);  // declara la resolucion del display

int cont=-1; // valor inicial -1 para inicializar antes de contar
int pulsador=8; // pin en donde se conecta el pulsador
bool estPulActual=1; // variable donde se guarda el estado logico actual del pulsador
bool estPulAnterior=1; // variable donde se guarda el estado logico anterior del pulsador

void setup(){                
  
  pinMode(pulsador, INPUT_PULLUP); //el pin pulsador es asignado como entrada
  delay(100);  // se da una espera de 100ms para que el display inicie correctamente
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // inicia la comunicacion I2C con el display que tiene la direccion 0x3C
  display.setRotation(0);  // se escoje la orientacion del display puede ser 0, 1, 2 o 3
  display.setTextColor(WHITE);  // se le dice a la pantalla que el texto que se va a desplegar es en color blanco 
  display.dim(false); //dejamos el brillo en maximo
 
  //animacion inicial
  for(int i=0;i<3;i++){
    display.clearDisplay();  // limpia el buffer del display
    display.drawBitmap(0,0,imagen, 128, 64, 1); // despliega imagen
    display.display(); // muestra la informacion del buffer en la pantalla 
    delay(800); //pausa 
    display.fillRect(0, 0, 128, 64, 1);
    display.drawBitmap(0,0,imagen, 128, 64, 0); // despliega imagen 
    display.display(); // muestra la informacion del buffer en la pantalla 
    delay(800); //pausa 
  }

} 

void loop(){

  estPulActual=digitalRead(pulsador); //se lee el valor logico del pin de entraday se guarda en la variable estPulActual
  if((estPulAnterior==1 && estPulActual==0)|| cont==-1){ //valida si el pulsador ha cambiado de 1 a 0 ó si el contador esta en -1
    cont++; // suma 1 al valor de la variable contador
    if(cont>9999){ // si el contador supera 9999 
      cont=0; // devuelve el contador a 0
      }
    display.clearDisplay(); //limpia el buffer del display
    display.setFont(&FreeSansBold12pt7b); // selecciona la fuente basica por defecto 
    display.setTextSize(1);  // ajusta el tamaño de texto en el minimo valor
    display.setCursor(0, 18); //(x,y) ubica en la posicion (0,10) el cursor del display 
    display.print("Contador :"); //escribe "Contador:" en buffer del display    
    //display.display(); // muestra la informacion del buffer en la pantalla 
    display.setFont(&FreeSerifBold24pt7b); // cambia la fuente por la que incluimos al inicio del codigo 
    display.setTextSize(1); // ajusta el tamaño de texto de la fuente a 2
    display.setCursor(14, 60); //(x,y) ubica en la posicion (0,50) el cursor del display 
    display.print(cont); //escribe el valor en numeros de la variable contador en buffer del display    
    display.display(); // muestra la informacion del buffer en la pantalla 
    }
  delay(20); //pausa de 20 milisegundos
  estPulAnterior=estPulActual; //el valor booleano actual del contador ya fue procesado asi que se guarda en la variable estPulAnterior
}  // final de la funcion principal, salta al inicio del "void loop"

y aquí les va imagenes.h:

// aqui ponemos las imagenes codificadas 
// asi es mas facil trabajar

static const unsigned char PROGMEM imagen[] ={
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00,
0x00, 0xC3, 0x0F, 0x0C, 0x33, 0xEC, 0x33, 0x70, 0x3C, 0x00, 0x78, 0x1E, 0x1B, 0x9C, 0x20, 0x00,
0x00, 0xC3, 0x1F, 0x8C, 0x33, 0xEC, 0x33, 0xF8, 0x7E, 0x00, 0xFC, 0x3F, 0x1F, 0xFE, 0x60, 0x00,
0x00, 0x66, 0x39, 0xCC, 0x31, 0x8C, 0x33, 0x9C, 0xC3, 0x01, 0xC6, 0x73, 0x98, 0xC6, 0x60, 0x00,
0x00, 0x66, 0x30, 0xCC, 0x31, 0x8C, 0x33, 0x0C, 0xFF, 0x01, 0x80, 0x61, 0x98, 0xC6, 0x60, 0x00,
0x00, 0x26, 0x30, 0xCC, 0x31, 0x8C, 0x33, 0x0C, 0xC0, 0x01, 0x80, 0x61, 0x98, 0xC6, 0x40, 0x00,
0x00, 0x3C, 0x39, 0xCC, 0x71, 0x8C, 0x73, 0x9C, 0xE3, 0x01, 0xC6, 0x73, 0x98, 0xC6, 0xC0, 0x00,
0x00, 0x3C, 0x1F, 0x8F, 0xF1, 0xEF, 0xF3, 0xF8, 0x7E, 0x18, 0xFC, 0x3F, 0x18, 0xC6, 0xC0, 0x00,
0x00, 0x18, 0x0F, 0x07, 0xB0, 0xE7, 0xB3, 0x70, 0x3C, 0x18, 0x78, 0x1E, 0x18, 0xC6, 0xC0, 0x00,
0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x3E, 0x07, 0x66, 0x19, 0x98, 0x78, 0x3C, 0x61, 0x8F, 0x81, 0xE0, 0xF0, 0x7C, 0x00, 0x00,
0x00, 0x7F, 0x0F, 0xE6, 0x19, 0x98, 0xFC, 0x7E, 0x61, 0x9F, 0xC3, 0xF1, 0xF8, 0xFE, 0x00, 0x00,
0x00, 0x07, 0x1C, 0xE6, 0x19, 0x99, 0x86, 0x63, 0x33, 0x01, 0xC6, 0x19, 0x8C, 0x0E, 0x00, 0x00,
0x00, 0x3F, 0x18, 0x66, 0x19, 0x99, 0xFE, 0x3C, 0x33, 0x0F, 0xC7, 0xF8, 0xF0, 0x7E, 0x00, 0x00,
0x00, 0x73, 0x18, 0x66, 0x19, 0x99, 0x80, 0x0F, 0x12, 0x1C, 0xC6, 0x00, 0x3C, 0xE6, 0x00, 0x00,
0x00, 0x63, 0x1C, 0xE6, 0x39, 0x99, 0xC6, 0x63, 0x1E, 0x18, 0xC7, 0x19, 0x8C, 0xC6, 0x00, 0x00,
0x00, 0x7F, 0x0F, 0xE7, 0xF9, 0x98, 0xFC, 0x7F, 0x1E, 0x1F, 0xC3, 0xF1, 0xFC, 0xFE, 0x00, 0x00,
0x00, 0x39, 0x07, 0x63, 0xD9, 0x98, 0x78, 0x3E, 0x0C, 0x0E, 0x41, 0xE0, 0xF8, 0x72, 0x00, 0x00,
0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xE0, 0x00, 0x00, 0x07, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x40, 0x00, 0x00, 0x01, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x07, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xC0, 0x07, 0xC0, 0x01, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x07, 0xE0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x40, 0x07, 0xF8, 0x01, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x07, 0xFC, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xC0, 0x07, 0xF8, 0x01, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x07, 0xE0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x40, 0x07, 0xC0, 0x01, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x07, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xC0, 0x00, 0x00, 0x03, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x7F, 0xFF, 0xFF, 0xFD, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};


Un suscriptor del canal aquiles vaesa pregunta ¿Cómo incrementar el contador en un valor diferente a 1?, les dejo la solución general a continuación, ustedes pueden cambiar el incremento por el numero que deseen, para el ejemplo cuenta de 10 en 10:
#include <Adafruit_SSD1306.h>  // incluye la libreria de adafruit para el driver del display OLED
#include <Adafruit_GFX.h>  // incluye la libreria de adafruit para gestionar los efectos graficos de manera facil
#include <Fonts/FreeSerifBold24pt7b.h> // incluye una fuente disponible en el paquete de la libreria adafruit
#include <Fonts/FreeSansBold12pt7b.h> // incluye una fuente disponible en el paquete de la libreria adafruit
Adafruit_SSD1306 display(128, 64);  // declara la resolucion del display

int incremento=10; // valor del incremento en el contador
int limite=9990; // el valor limite del contador para no desbordar la pantalla
int cont=-1*incremento; // valor inicial -el incremento para inicializar antes de contar
int pulsador=8; // pin en donde se conecta el pulsador
bool estPulActual=1; // variable donde se guarda el estado logico actual del pulsador
bool estPulAnterior=1; // variable donde se guarda el estado logico anterior del pulsador

void setup(){                
  
  pinMode(pulsador, INPUT_PULLUP); //el pin pulsador es asignado como entrada
  delay(100);  // se da una espera de 100ms para que el display inicie correctamente
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // inicia la comunicacion I2C con el display que tiene la direccion 0x3C
  display.setRotation(0);  // se escoje la orientacion del display puede ser 0, 1, 2 o 3
  display.setTextColor(WHITE);  // se le dice a la pantalla que el texto que se va a desplegar es en color blanco 
  display.dim(false); //dejamos el brillo en maximo

} 

void loop(){

  estPulActual=digitalRead(pulsador); //se lee el valor logico del pin de entraday se guarda en la variable estPulActual
  if((estPulAnterior==1 && estPulActual==0)|| cont==-1*incremento){ //valida si el pulsador ha cambiado de 1 a 0 ó si el contador esta en -1
    cont=cont+incremento; // suma 1 al valor de la variable contador
    if(cont>limite){ // si el contador supera el limite 
      cont=0; // devuelve el contador a 0
      }
    display.clearDisplay(); //limpia el buffer del display
    display.setFont(&FreeSansBold12pt7b); // selecciona la fuente basica por defecto 
    display.setTextSize(1);  // ajusta el tamaño de texto en el minimo valor
    display.setCursor(0, 18); //(x,y) ubica en la posicion (0,10) el cursor del display 
    display.print("Contador :"); //escribe "Contador:" en buffer del display    
    //display.display(); // muestra la informacion del buffer en la pantalla 
    display.setFont(&FreeSerifBold24pt7b); // cambia la fuente por la que incluimos al inicio del codigo 
    display.setTextSize(1); // ajusta el tamaño de texto de la fuente a 2
    display.setCursor(14, 60); //(x,y) ubica en la posicion (0,50) el cursor del display 
    display.print(cont); //escribe el valor en numeros de la variable contador en buffer del display    
    display.display(); // muestra la informacion del buffer en la pantalla 
    }
  delay(20); //pausa de 20 milisegundos
  estPulAnterior=estPulActual; //el valor booleano actual del contador ya fue procesado asi que se guarda en la variable estPulAnterior
}  // final de la funcion principal, salta al inicio del "void loop"


Si deseas llevar este proyecto al siguiente nivel, puedes diseñar una placa de circuito profesional y hacerla realidad gracias a los servicios de empresas como PCBWay que por un bajo costo te fabrican tu circuito y lo envían a cualquier parte del mundo. Yo estoy en Colombia y uso PCBWay para fabricar mis placas de 2 caras.

Te recomiendo que le eches un vistazo a su web PCBWay que está en español para que nos sea mucho  mas fácil hacer el pedido. La promo de 10 placas por 5 dolares esta genial.

Publicar un comentario

0 Comentarios