funcionando
Dependencies: EPD_GDE021A1 mbed reScale
Fork of DISCO-L053C8_ePD_demo by
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