![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Guide program for display oled I2C 128x64
Dependencies: mbed Adafruit_GFX
Diff: funsiones_pantalla_oled.cpp
- Revision:
- 15:bbac8ecd8bd7
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/funsiones_pantalla_oled.cpp Fri Jul 09 01:44:09 2021 +0000 @@ -0,0 +1,611 @@ + + +/********************************************************************** +Nota: + +este progra es realizado por julian camilo portela gonzalez de la universidad distrital +fransisco jose de caldas de bogota colombia. identificado con codigo estudiantil 20192573046 + +en este proyecto procurare hacer uso de todas las funsiones de una pantalla oled monocromatica +usando la libreria Adafruit_GFX y Adafruit_SSD1306_I2C para la pantalla de oled de direccion 0x78 con conexion I2C con dimensiones 128 de largo y 64 de ancho +este trabajo sera una contribucion para la comunidad de MBED y su uso libre. +solo hare uso de las funsiones para dar una brebe explicacion de estas. + +para el uso de esta pantalla se uso el micro controlador STM32F411 Nucleo-64 +**************************************************************************/ + +// inclujsion de librerias +#include "mbed.h" +#include "Adafruit_GFX.h" +#include "Adafruit_GFX_Config.h" +#include "Adafruit_SSD1306.h" +#include "imagen.h" +#include "time.h" + + + +DigitalOut myled_R(LED3); //led de HMC + +I2C i2c(D14,D15); // puerto de source data y puerto source cloke para el formato de coneccion I2C + +Adafruit_SSD1306_I2c myOled(i2c,NC,0x78,64,128); // puertos I2C, reset, nombre de la pantalla en este caso puede ser 0x78 o 0x7A, alto y ancho + + + +/* Nota: +* el tamaño de la letra 1 da para 8 pixeles por caracter +* el tamaño de la letra 2 da para 16 pixeles por caracter +*/ + +/*********************** + nota: siempre que halla un virtual void es necesario hacer la declaracion de + #ifdef GFX_WANT_ABSTRACTS esto en caso de ser sizetext es decir tamaño de texto + #define GFX_SIZEABLE_TEXT + #end if + + + #ifdef GFX_WANT_ABSTRACTS + #define GFX_WANT_ABSTRACTS en la malloria de funsiones esta es la declaracion indicada + #define BLACK 0 + #define WHITE 1 + #endif +****************/ + +// nota: para la explicacion del bitmap ubicarse en el archivo imagen + + + +int main() +{ + +// variables que se imprimen en la pantalla no necesitan convertirse a 16+ bits. + uint16_t x=0; + uint16_t z=0; + uint16_t RAN=0; + + uint8_t pos=60; //variable para localizacion de una caracter especifico que nosotros declaremos + + bool af=true; //variable buleana para el uso de while + bool tx=true; // variable buleana para el uso del texto + int y=0; // varuiable de cambio para los if + int w=1; // tiempo de espera general + int w1=1; // tiempo de espera para imagenes + + + // estas variables usan la funsion rand para obtener un numero alaetoreo + + srand (time(NULL)); // inicializa la velociadad del conteo + + + int v1= (rand() % 100)/10; // v1 esta en un rango de 0 to 99 y si se divide en 10 esat a un rango de 0 a 9 + int v2= (rand() % 100)/10; + int v3= (rand() % 100)/10; + int v4= v1+v2+v3; // un numero emntre 0 y 27 + + char C; // variable usada para dibujar una letra u numero + + //vector con las contantes CHAR para la funsion de DrawChar + char L[26]={'A', 'B', 'C', 'D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'}; + + myOled.begin(); // inicializo la pantalla oled + myOled.setTextCursor (0,1); //ubicar el cursor para los textos + + #ifdef GFX_WANT_ABSTRACTS + #define GFX_SIZEABLE_TEXT + myOled.setTextSize(2);//establece el tamaño del texto. nota explicativa al comienzo + + + //imprime %u para el ancho (width) y el segundo imprime %u alto (height) + myOled.printf("%u %u \ncuenta by julian\r\n", myOled.width(), myOled.height()); + + myOled.display(); //dibuja en la pantalla todas las ordenes que le hallamos otorgado + wait(0.8); // funcion de espera o retraso + #endif + myOled.clearDisplay(); /// limpia la pantalla + + + #ifdef GFX_WANT_ABSTRACTS + #define GFX_SIZEABLE_TEXT + + myOled.setTextSize(1); + + #endif + + while(af) + { + + + //inicia el ciclo de tiempos para trabajar + x=0; + RAN = v4; + + myOled.writeChar(pos); // se uso para indicar una posicion especifica de la pantalla oled y escribir algo concreto + myOled.printf(" \r :3 \r"); + myOled.display(); + + for(int i=0; i<20; i++){ //cantidad de veces q cuenta antes de hacer alguna accion + + myled_R = !myled_R; //led de la placa ST + myOled.setTextWrap(tx); // establece el modo de texto como verdadero o falso + myOled.setTextCursor (54,20);//alinea el texto + myOled.printf("%u\r",x);//imprime el conteo + myOled.setTextCursor (2,2); + myOled.setTextColor(0,1);// se usa para resaltar el texto y sus componentes son color del texto y fondo repectivamente + // myOled.setTextColor(0); se usa para dar un color especifico al texto 1 blanco, 0 negro el cual puede confundirse tanto el texto como el fondo con este comando + myOled.printf(" \n el numero aleatoreo es: %u\r",RAN);// imprime el numero random que carga anteriormente + myOled.display();//imprime todas las intrucciones de la pantalla + x = x + 1; // variable para la cuenta en pantalla + wait(0.001); + myOled.setTextColor(1,0); + + + + + if(x==5){ + myOled.clearDisplay(); + myOled.setTextCursor (0,1); // indicamos a la pantalla donde iniciar a dibujar + myOled.printf(" \nla cuenta es %u\r",z); //inicia una cuenta de ciclos + myOled.display(); + z=z+1; // variable q se suma en pantalla cada vez que la cuanta alcanza el numero 5 + x=0; // reinicia la varible de la cuenta a 0 + y=y+1; + } + if(y==3){ + + // dibuja un pixel en el centro + myOled.clearDisplay(); + myOled.drawPixel(myOled.width()/2, myOled.height()/2,1); + myOled.display(); + wait(w); // tiempo de espera antes de acabar la accion + myOled.clearDisplay(); + + //dibuja una rectangulo con el tamaño que yo quiero + + #ifdef GFX_WANT_ABSTRACTS //inicia la declaracion del objeto + #define GFX_WANT_ABSTRACTS // defino que clase de objeto es + #define BLACK 0 //defino objetos con variable definida + #define WHITE 1 + int a,l; + a=20; + l=20; + myOled.drawRect((myOled.width()-a)/2, (myOled.height()-l)/2,a,l,WHITE); //punto en x, punto en y, ancho, largo y color + myOled.display(); + #endif // termino la declaracion + wait(w); + // rellena el rectangulo de la forma que yo quiera + #ifdef GFX_WANT_ABSTRACTS + #define GFX_WANT_ABSTRACTS + #define BLACK 0 + #define WHITE 1 + a=20; + l=20; + myOled.fillRect((myOled.width()-a)/2, (myOled.height()-l)/2,a,l, WHITE); //punto en x, punto en y, ancho, largo y color + myOled.display(); + #endif + wait(w); + myOled.clearDisplay(); + + //dibuja la ciecunferencia de un circulo ubicado donde yo quiera del radio que yo quiera + + #ifdef GFX_WANT_ABSTRACTS + #define GFX_WANT_ABSTRACTS + #define BLACK 0 + #define WHITE 1 + myOled.drawCircle(myOled.width()/2, myOled.height()/2, 10, WHITE); + myOled.display(); + #endif + wait(w); + + // rellena el circulo de la forma que yo quiera + #ifdef GFX_WANT_ABSTRACTS + #define GFX_WANT_ABSTRACTS + #define BLACK 0 + #define WHITE 1 + myOled.fillCircle(myOled.width()/2, myOled.height()/2, 10, WHITE); + myOled.display(); + #endif + wait(w); + myOled.clearDisplay(); + + //dibuja el perimetro de un triangulo ubicado donde yo quiera del tamaño que yo quiera + #ifdef GFX_WANT_ABSTRACTS + #define GFX_WANT_ABSTRACTS + #define BLACK 0 + #define WHITE 1 + myOled.drawTriangle(myOled.width()/2, 1, myOled.width()/4, 20,(myOled.width()*3)/4, 20, WHITE);// se agrupa por cordenada(x,y)p1, cordenada (x1,y1)p2, y cordenada (x2,y2)p3 + myOled.display(); + #endif + wait(w); + // rellena el triangulo de la forma que yo quiera + #ifdef GFX_WANT_ABSTRACTS + #define GFX_WANT_ABSTRACTS + #define BLACK 0 + #define WHITE 1 + myOled.fillTriangle((myOled.width()*3)/4,20,myOled.width()/4,20,(myOled.width())/2,1,WHITE);// para rellenar se ubica al reves los puntos cordenada (x2,y2)p3, cordenada (x1,y1)p2 y el cordenada (x,y)p1 + myOled.display(); + #endif + wait(w); + myOled.clearDisplay(); + + //dibuja la circunferencia de un circulo ubicado en un espacio que yo quiera del tamaño que yo quiera + #ifdef GFX_WANT_ABSTRACTS + #define GFX_WANT_ABSTRACTS + #define BLACK 0 + #define WHITE 1 + myOled.drawRoundRect(1,1, 40, 40, 30, WHITE);// + myOled.display(); + #endif + wait(w); + // rellena el circulo dentro del espacio del radio que yo quiera y la forma que yo quiera + #ifdef GFX_WANT_ABSTRACTS + #define GFX_WANT_ABSTRACTS + #define BLACK 0 + #define WHITE 1 + myOled.fillRoundRect(1,1,40,40,20,WHITE);// para rellenar se ubica al reves los puntos cordenada (x2,y2)p3, cordenada (x1,y1)p2 y el cordenada (x,y)p1 + myOled.display(); + #endif + wait(w); + myOled.clearDisplay(); + + //dibuja una linea con la inclinacion que yo indique + + #ifdef GFX_WANT_ABSTRACTS + #define GFX_WANT_ABSTRACTS + #define BLACK 0 + #define WHITE 1 + myOled.drawLine(5,5,30,10,WHITE); + + myOled.display(); + #endif + wait(w); + myOled.clearDisplay(); + + //dibuja una linea recta horizontal dede donde le indique + + #ifdef GFX_WANT_ABSTRACTS + #define GFX_WANT_ABSTRACTS + #define BLACK 0 + #define WHITE 1 + myOled.drawFastHLine(5,5,50,WHITE); + + myOled.display(); + #endif + wait(w); + myOled.clearDisplay(); + + //dibuja una linea recta horizontal dede donde le indique + + #ifdef GFX_WANT_ABSTRACTS + #define GFX_WANT_ABSTRACTS + #define BLACK 0 + #define WHITE 1 + myOled.drawFastVLine(5,5,50,WHITE); + + myOled.display(); + #endif + wait(w); + myOled.clearDisplay(); + + //rellena la pantalla con el color que quiero + + #ifdef GFX_WANT_ABSTRACTS + #define GFX_WANT_ABSTRACTS + #define BLACK 0 + #define WHITE 1 + myOled.fillScreen(WHITE); + myOled.display(); + #endif + wait(w); + + #ifdef GFX_WANT_ABSTRACTS + #define GFX_WANT_ABSTRACTS + #define BLACK 0 + #define WHITE 1 + myOled.fillScreen(BLACK); + myOled.display(); + #endif + wait(w); + myOled.clearDisplay(); + + //dibuja una letra en la ubicacion que pongamos + + #ifdef GFX_WANT_ABSTRACTS + #define GFX_WANT_ABSTRACTS + #define BLACK 0 + #define WHITE 1 + + C= L[v4]; + + myOled.drawChar(5, 5,C,WHITE,BLACK,5); + myOled.display(); + #endif + wait(w); + myOled.clearDisplay(); + + //dibuja una imagen deacuerdo a un mapa en numeros hexdecimales + + #ifdef GFX_WANT_ABSTRACTS + #define GFX_WANT_ABSTRACTS + #define BLACK 0 + #define WHITE 1 + /** + se compone de ubicacion en x y ubicacion en y para comensar el trasado, + el nombre del bitmap a dibujar previamente diseñado o llamado desde otra funcion de extencion .h, + se otorga el alto y el ancho, luego especificamos el color de la imagen + + en lo posible definir el tamaño de la imagen ingresada en el archivo de la imagen y + colocar el mismo tamaño en la funsion de drawbitmap + **/ + myOled.drawBitmap(0,0,myBitmap1,128,64,WHITE); + + myOled.display(); + #endif + wait(w1); + myOled.clearDisplay(); + + //-------------------------------// + + #ifdef GFX_WANT_ABSTRACTS + #define GFX_WANT_ABSTRACTS + #define BLACK 0 + #define WHITE 1 + + myOled.drawBitmap(0,0,myBitmap2,128,64,WHITE); + + myOled.display(); + #endif + wait(w1); + myOled.clearDisplay(); + + //----------------// + + #ifdef GFX_WANT_ABSTRACTS + #define GFX_WANT_ABSTRACTS + #define BLACK 0 + #define WHITE 1 + + myOled.drawBitmap(0,0,myBitmap3,128,64,WHITE); + + myOled.display(); + #endif + wait(w1); + myOled.clearDisplay(); + + //----------------// + + #ifdef GFX_WANT_ABSTRACTS + #define GFX_WANT_ABSTRACTS + #define BLACK 0 + #define WHITE 1 + + myOled.drawBitmap(0,0,myBitmap4,128,64,WHITE); + + myOled.display(); + #endif + wait(w1); + myOled.clearDisplay(); + + + //-------------------------------// + + #ifdef GFX_WANT_ABSTRACTS + #define GFX_WANT_ABSTRACTS + #define BLACK 0 + #define WHITE 1 + + myOled.drawBitmap(0,0,myBitmap6,128,64,WHITE); + + myOled.display(); + #endif + wait(w1); + myOled.clearDisplay(); + + //----------------// + + #ifdef GFX_WANT_ABSTRACTS + #define GFX_WANT_ABSTRACTS + #define BLACK 0 + #define WHITE 1 + + myOled.drawBitmap(0,0,myBitmap5,124,64,WHITE); + + myOled.display(); + #endif + wait(w1); + myOled.clearDisplay(); + + /******************************** + + uint8_t getRotation(void); + esta funsion lee la rotacion de una imagen q hallamos puesto y podemos ponerlo en pantalla + ***************************************/ + uint8_t ro; + + #ifdef GFX_WANT_ABSTRACTS + #define GFX_WANT_ABSTRACTS + #define BLACK 0 + #define WHITE 1 + + myOled.drawBitmap(0,0,myBitmap5,124,64,WHITE); + + myOled.display(); + #endif + ro = myOled.getRotation(); + x=ro; + wait(w1); + myOled.clearDisplay(); + + myOled.setTextCursor (0,1); + myOled.printf(" \nla rotacion es %u\r",x); + myOled.display(); + x=0; + + wait(w); + myOled.clearDisplay(); + + //funcion de rotacion de una imagen o instruccion de la pantalla + /***************************************** + + para usar la funsion setRotation se usan los valores de un enum + los cuales son 1,2,3,4 los cuales equivalen a los grados de rotacion de la pantalla + usare esta imagen para mostrar como se hace usare el 2 + + + ************************************/ + uint8_t an=1; //90° + myOled.setRotation(an); + wait(w); + + + #ifdef GFX_WANT_ABSTRACTS + #define GFX_WANT_ABSTRACTS + #define BLACK 0 + #define WHITE 1 + + myOled.drawBitmap(0,0,myBitmap5,124,64,WHITE); + + myOled.display(); + #endif + ro = myOled.getRotation(); + x=ro; + wait(w1); + myOled.clearDisplay(); + + myOled.setTextCursor (0,1); + myOled.printf(" \nla rotacion es %u\r",x); + myOled.display(); + x=0; + wait(w); + myOled.clearDisplay(); + + //**************// + an=2; //180° + myOled.setRotation(an); + wait(w); + + #ifdef GFX_WANT_ABSTRACTS + #define GFX_WANT_ABSTRACTS + #define BLACK 0 + #define WHITE 1 + + myOled.drawBitmap(0,0,myBitmap5,124,64,WHITE); + + myOled.display(); + #endif + ro = myOled.getRotation(); + x=ro; + wait(w1); + myOled.clearDisplay(); + + myOled.setTextCursor (0,1); + myOled.printf(" \nla rotacion es %u\r",x); + myOled.display(); + x=0; + wait(w); + myOled.clearDisplay(); + + + //**************// + an=3; //270° + myOled.setRotation(an); + wait(w); + + #ifdef GFX_WANT_ABSTRACTS + #define GFX_WANT_ABSTRACTS + #define BLACK 0 + #define WHITE 1 + + myOled.drawBitmap(0,0,myBitmap5,124,64,WHITE); + + myOled.display(); + #endif + ro = myOled.getRotation(); + x=ro; + wait(w1); + myOled.clearDisplay(); + + myOled.setTextCursor (0,1); + myOled.printf(" \nla rotacion es %u\r",x); + myOled.display(); + x=0; + wait(w); + myOled.clearDisplay(); + + //**************// + an=4; //360° + myOled.setRotation(an); + wait(w); + + #ifdef GFX_WANT_ABSTRACTS + #define GFX_WANT_ABSTRACTS + #define BLACK 0 + #define WHITE 1 + + myOled.drawBitmap(0,0,myBitmap5,124,64,WHITE); + + myOled.display(); + #endif + ro = myOled.getRotation(); + x=ro; + wait(w1); + myOled.clearDisplay(); + + myOled.setTextCursor (0,1); + myOled.printf(" \nla rotacion es %u\r",x); + myOled.display(); + x=0; + wait(w); + myOled.clearDisplay(); + + tx=false; + + + myOled.clearDisplay(); + myOled.setTextWrap(tx); + myOled.setTextCursor (0,1); + myOled.printf(" \nla cuenta es %u\r",z); + myOled.display(); + wait(0.5); + y=y+1; + z=z+1; + x=0; + + + + } + + if((y==5)){ + + #ifdef GFX_WANT_ABSTRACTS + #define GFX_WANT_ABSTRACTS + #define BLACK 0 + #define WHITE 1 + myOled.fillScreen(WHITE); + myOled.display(); + #endif + wait(w); + myOled.clearDisplay(); + + myOled.printf(" \n fin"); + myOled.display(); + wait(w); + y=y+1; + myOled.clearDisplay(); + + #ifdef GFX_WANT_ABSTRACTS + #define GFX_WANT_ABSTRACTS + #define BLACK 0 + #define WHITE 1 + myOled.fillScreen(BLACK); + myOled.display(); + #endif + wait(w); + myOled.clearDisplay(); + af=false; + } + + } + + } + } +