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