Guide program for display oled I2C 128x64

Dependencies:   mbed Adafruit_GFX

funsiones_pantalla_oled.cpp

Committer:
jportela
Date:
2021-07-09
Revision:
15:bbac8ecd8bd7

File content as of revision 15:bbac8ecd8bd7:


 
/**********************************************************************
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;
    }
    
   } 
    
   }
   }