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
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.





0 Comentarios