funcionando

Dependencies:   EPD_GDE021A1 mbed reScale

Fork of DISCO-L053C8_ePD_demo by ST

main.cpp

Committer:
Marcelocostanzo
Date:
2018-09-05
Revision:
4:38ce0cfb14e2
Parent:
3:9229fd269ed0
Child:
5:03c1a5788923

File content as of revision 4:38ce0cfb14e2:

/*Código escrito por Marcelo Costanzo Miranda
*Projeto feito conforme pedido do professor Silvio Szafir 
*
*1. IHM com placa ST discovery com display ePaper
*
*   1.1) funções pré-definidas para escrita na tela, de 1 até 5 linhas, 
*            reconfiguráveis e atualizaveis uma-a-uma; 
*    1.2) funcionamento através de conexão serial;
*    1.3) conexão serial permite pelo menos três funções: 
*           A) escolha da fonte e número de linhas; 
*           B) limpar a tela; 
*           C) imprimir (escrever) na linha/posição escolhida o texto enviado via comando ASCII serial;
*
*           Sugerir outras funções relevantes e experimentar a possibilidade de "animação" gráfica, 
*           como p.ex.: "simbologia de ventilação", ou "motor girando"
*
*2. Placa ST ESCEVAL funcionando com potenciometro externo 
*     para controle velocidade de 0% até 100% da velocidade máxima, no motor BLDC.
*
*3. IHM com placa ST discovery (botões e sliders) para controle de placa ST ESCEVAL para motor BLDC 
*
*   3.1) Possibilidade de IHM com placa ST discovery utilizando o recurso "slider" da placa, 
*           para o ajuste da velocidade do motor BLDC entre 0% até 100% da velocidade máxima.
* 
*   3.2) Possibilidade de IHM com placa ST discovery utilizando botão do usuário para ligar/desligar motor
*   3.3) Possibilidade de IHM com placa ST discovery utilizando botões extras 
*           para reversão do sentido da rotação
*
*4. Documentação "open source" com descritivo do código IHM e ESCEVAL, 
*     contendo programação mbed e detalhamento das funções implementadas 
*     e sua forma de configuração / funcionamento.
*
*   São Paulo, SP
*    30 de agosto de 2018
*
*/

#include "mbed.h"
#include "EPD_GDE021A1.h"
#include"reScale.h"


#define OFF       0.05

#define EPD_CS       PA_15
#define EPD_DC       PB_11
#define EPD_RESET    PB_2
#define EPD_BUSY     PA_8
#define EPD_POWER    PB_10
#define EPD_SPI_MOSI PB_5
#define EPD_SPI_MISO PB_4
#define EPD_SPI_SCK  PB_3

EPD_GDE021A1 epd(EPD_CS, EPD_DC, EPD_RESET, EPD_BUSY, EPD_POWER, EPD_SPI_MOSI, EPD_SPI_MISO, EPD_SPI_SCK);

DigitalOut led1(LED1);
DigitalIn button(PA_0);
Ticker flipper;
PwmOut myservo(D10);
AnalogIn CONTROL(PA_1);
reScale _scale(0,1,0.05,0.1); 
Serial pc(USBTX, USBRX); // tx, rx

//width 48
//height 26

static uint8_t Battery_img[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0xfe, 0xff, 0xff, 0xff, 0xff, 0x0f, 
0xfe, 0xff, 0xff, 0x3f, 0x00, 0x0c, 
0xfe, 0xff, 0xff, 0x3f, 0x00, 0x08, 
0xfe, 0xff, 0xff, 0x3f, 0x00, 0x08, 
0xfe, 0xff, 0xff, 0x3f, 0x00, 0x08, 
0xfe, 0xff, 0xff, 0x3f, 0x00, 0x08, 
0xfe, 0xff, 0xff, 0x3f, 0x00, 0x18, 
0xfe, 0xff, 0xff, 0x3f, 0x10, 0x38, 
0xfe, 0xff, 0xff, 0x3f, 0x10, 0x38, 
0xfe, 0xff, 0xff, 0x3f, 0x10, 0x38, 
0xfe, 0xff, 0xff, 0x3f, 0xff, 0x39, 
0xfe, 0xff, 0xff, 0x3f, 0x10, 0x38, 
0xfe, 0xff, 0xff, 0x3f, 0x10, 0x38, 
0xfe, 0xff, 0xff, 0x3f, 0x10, 0x38, 
0xfe, 0xff, 0xff, 0x3f, 0x00, 0x38, 
0xfe, 0xff, 0xff, 0x3f, 0x00, 0x18, 
0xfe, 0xff, 0xff, 0x3f, 0x00, 0x08, 
0xfe, 0xff, 0xff, 0x3f, 0x00, 0x08, 
0xfe, 0xff, 0xff, 0x3f, 0x00, 0x08, 
0xfe, 0xff, 0xff, 0x3f, 0x00, 0x0c, 
0xfe, 0xff, 0xff, 0x3f, 0x00, 0x0c, 
0xfe, 0xff, 0xff, 0xff, 0xff, 0x0f, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
};

void flip() //time para envio das infos pela serial
{
    led1=!led1;  
}

float p=0.05, k;
uint8_t x=0, y=0, i=0;
uint16_t l = 0;
char c;
char s[100];
bool flag_init = 0;
int main()
{
//-----As linhas abaixo configuram e ligam o ESC--------
    myservo.period(0.02f); //configura o periodo para o padrão PPM
    myservo = 0.1;      //pulso mais longo 2mS
    wait(1);
    myservo = OFF; //pulso mais curto 1mS
    wait(1);
//fim das configs do ESC

    flipper.attach(&flip, 0.1);//interrupção para piscar o led, debug para saber se o uC travou
    
    
    //mensagens de boas vindas
    epd.Clear(EPD_COLOR_WHITE);  
    epd.DisplayStringAtLine(5, (uint8_t*)"MBED", CENTER_MODE);
    epd.DisplayStringAtLine(3, (uint8_t*)"Epaper display", LEFT_MODE);
    epd.DisplayStringAtLine(2, (uint8_t*)"demo", LEFT_MODE);
    epd.DrawImage(130, 0, 48, 26, Battery_img);
    epd.DrawRect(50, 4, 60, 4);
    epd.RefreshDisplay();
    wait(1);
    epd.Clear(EPD_COLOR_WHITE);  
    epd.RefreshDisplay();
    epd.Clear(EPD_COLOR_WHITE); 
    
    flag_init = 1;
    
    myservo = OFF;
    while(1)
    {
//---------------------MENU PRINCIPAL---------------------------------------        
        if(flag_init == 1)
        {
            pc.printf("\nOla, escolha uma opcao abaixo:");
            pc.printf("\nA. Selecionar fonte");
            pc.printf("\nB. Limpar o Epaper");
            pc.printf("\nC. Escreve texto no Epaper");  
            pc.printf("\nD. Para usar o brushless"); 
            pc.printf("\nE. Para reiniciar\n\n"); 
            flag_init = 0;  
        }//FIM DO MENU PRINCIPAL
        
        c = pc.getc(); 
        
//--------------------MENU DE FONTES-----------------------------------------        
        if(c == 'A')
        {
            pc.printf("\n1. para a fonte pequena");
            pc.printf("\n2. para a fonte media");
            pc.printf("\n3. para a fonte grande");
            c = pc.getc(); 
            
            //FONTE PEQUENA
            if(c == '1')
            {
                epd.SetFont(&Font8);
                pc.printf("\nFonte pequena selecionada");  
                c = 0x00;
            }    
            
            //FONTE MEDIA
            if(c == '2')
            {
                epd.SetFont(&Font12);
                pc.printf("\nFonte media selecionada"); 
                c = 0x00; 
            }  
            
            //FONTE GRANDE
            if(c == '3')
            {
                epd.SetFont(&Font16);
                pc.printf("\nFonte grande selecionada"); 
                c = 0x00; 
            }

        }//FIM DO MENU DE FONTES   
        
//--------------LIMPAR EPAPER------------------------------------        
        if(c == 'B')
        {
            epd.Clear(EPD_COLOR_WHITE);  
            epd.RefreshDisplay();;
            pc.printf("\nEpaper limpo\n"); 
            c = 0x00;
        }//FIM DA ROTINA DE LIMPEZA DO EPAPER
       
//----------ROTINA PARA ESCREVER NO EPAPER------------------------        
        if(c == 'C') 
        {   
            if(epd.GetFont() == &Font8)          // Fonte numero 8 podemos ter 9 linhas no display!!!!!!!!!!!!!!
            {
                pc.printf("\nEscolha a linha, de 0 a 8:"); 
                c = pc.getc();
                switch (c)
                {
                    case '0': l = 0;break;
                    case '1': l = 1;break;
                    case '2': l = 2;break;
                    case '3': l = 3;break;
                    case '4': l = 4;break;
                    case '5': l = 5;break;
                    case '6': l = 6;break;
                    case '7': l = 7;break; 
                    case '8': l = 8;break;
                }
            }            
            c = 0x00;
            
            if(epd.GetFont() == &Font12)         // Fonte numero 12 podemos ter 6 linhas no display!!!!!!!!!!!!!!
            {
                pc.printf("\nEscolha a linha, de 0 a 5:"); 
                c = pc.getc();
                switch (c)
                {
                    case '0': l = 0;break;
                    case '1': l = 1;break;
                    case '2': l = 2;break;
                    case '3': l = 3;break;
                    case '4': l = 4;break;
                    case '5': l = 5;break;
                }
            }            
            c = 0x00;
            
            if(epd.GetFont() == &Font16)        // Fonte numero 16 podemos ter 4 linhas no display!!!!!!!!!!!!!!
            {
                pc.printf("\nEscolha a linha, de 0 a 3:"); 
                c = pc.getc();
                switch (c)
                {
                    case '0': l = 0;break;
                    case '1': l = 1;break;
                    case '2': l = 2;break;
                    case '3': l = 3;break;
                }
            }            
            c = 0x00;
            
            pc.printf("\nEntre com seu texto (com line feed - LF):");
            
           do
           {
               c = pc.getc();
               s[i] = c;
               ++i;
            }
            while(c!='\n'); //entra em loop, coletando os caracteres até achar o \n, e então sai do loop
            
            s[i-1] = '\0';   //elimina o caracter terminador de strings
            pc.printf("%s", s);
            epd.DisplayStringAtLine(l, (uint8_t*)s, CENTER_MODE);
            epd.RefreshDisplay();
            i=0;

        }//FIM DA ROTINA PARA ESCREVER NO EPAPER 
        
//----------ROTINA PARA CONTROLAR O MOTOR BRUSHLESS- PULSOS PPM----------------
        if(c == 'D')
        {
            pc.printf("\nP para parar");
            while(1)
            {
                k = CONTROL;
                p =_scale.from(k);  //converte o valor do ADC (0.0 - 1.0) para valor compativel do PPM (1 - 2 mS)
                myservo = p;
                pc.printf("control %f\n\r",p);    
                wait(0.2);
                if(pc.readable())
                {
                    c = pc.getc();
                }
                if(c == 'P')
                {   
                    break;
                }
                if(button == 1)
                {
                    wait(0.1);   //Debounce
                    if(button == 1)
                    {
                        break;
                    }
                }    
            }
            myservo = OFF;
            pc.printf("\nSaindo da funcao brushless");
        }//FIM DA ROTINA DO MOTOR BRUSHLESS
        
//-------ROTINA PARA EXIBIR NOVAMENTE O MENU PRINCIPAL-------------        
        if(c == 'E') 
        flag_init = 1; 
            
    }//FIM DA WHILE
}//FIM DO PROGRAMA