KAIQUE DOGNANI
/
LCD_JOYSTICK
Utilizando a Nucleo F103RB com um módulo LCD e um Joystick para interface
main.cpp
- Committer:
- rhisis
- Date:
- 2020-06-09
- Revision:
- 5:c549c4b25997
- Parent:
- 4:a0a633b93fd0
- Child:
- 6:835e123d1692
File content as of revision 5:c549c4b25997:
// / // _,.------....___,.' ',.-. // ,-' _,.--" | // ,' _.-' . // / , ,' ` // . / / ``. // | | . \.\ // ____ |___._. | __ \ `. // .' `---"" ``"-.--"'` \ . \ // . , __ ` | . // `,' ,-"' . \ | L // ,' ' _.' -._ / | // ,`-. ,". `--' >. ,' | // . .'\' `-' __ , ,-. / `.__.- ,' // ||:, . ,' ; / / \ ` `. . .'/ // j|:D \ `--' ' ,'_ . . `.__, \ , / // L:_ | . "' :_; `.'.' //. ""' """""' V // `. . `. _,.. ` // `,_ . . _,-'/ .. `,' __ ` // ) \`._ ___....----"' ,' .' \ | ' \ . // / `. "`-.--"' _,' ,' `---' | `./ | // . _ `""'--.._____..--" , ' | // | ." `. `-. /-. / , // | `._.' `,_ ; / ,' . // .' /| `-. . ,' , , // '-.__ __ _,',' '`-..___;-...__ ,.'\ ____.___.' // `"^--'..' '-`-^-'"-- `-^-'`.''"""""`.,^.`.--' #include "mbed.h" #include "LCD_ka.h" #include "Joystick.h" #include "Motor_de_passo.h" Motor Ze (PB_13, PB_14, PB_15, PB_1, PA_6, PA_7, 'Z'); // (IN1, IN2, IN3, IN4, Sensor 1, Sensor 2, Eixo) (para shield do arduino, (PB_13, PB_14, PB_15, PB_1, D2, D3, 'X') Joystick Joy (A1, A2, USER_BUTTON); // (VRX, VRY, SW) LCD lcd (D8, D9, D4, D5, D6, D7); // Para conectar como arduíno: (D8, D9, D4, D5, D6, D7); Para default: (D6, D7, D2, D3, D4, D5); InterruptIn mybutton (PA_5); // Para shield, D10 DigitalOut Rele (PA_9); /* ************************** ***** INICIA FUNÇÕES ***** ************************** */ void Loop_Horario(); // Loop para girar o motor no sentido horário void Loop_Anti_Horario(); // Loop para girar o motor no sentido anti-horário void Aumenta_Vel(); // Função que aumenta a velocidade void Diminui_Vel(); // Função que Diminui a velocidade void Tela_1(); // Seletor de velocidades e sentido de rotação void Tela_2(); // Modo Step void Tela_Instrucao(int a); // Tela de instrução select void Tela_Instrucao_1(int a); // Tela de instrução para manuseio void Emergencia(); // Função para o botão de emergência void Loop_Menu(); // Loop da tela de menu /* ************************** **** INICIA VARIÁVEIS **** ************************** */ double tempos[] = {0.2, 0.02, 0.002}; // Tempos para mudar a velocidade string porcentagem[] = {"0.1%", " 10%", "100%"}; // Porcentagens em uma string para printar int t = 0; // Variável que guarda a posição do tempo e da porcentagem int menu = 1; // Variável que guarda o estado do menu int t1 = 1; // Variável que guarda o estado da tela 1 int t2 = 1; // Variável que guarda o estado da tela 2 /* ************************ **** LOOP PRINCIPAL **** ************************ */ int main(){ if (mybutton == 1){ Emergencia(); } mybutton.rise(&Emergencia); /* lcd.printf(" Bem Vindo!"); wait(2); lcd.clc(); lcd.printf("A mesa esta vazia?"); lcd.printf("S N"); int vazia = 0; while (vazia == 0){ switch (Joy.ler_x()) { case 0: lcd.cima(); wait(0.2); break; case 1: lcd.baixo(); wait(0.2); break; } switch (Joy.ler_y()) { case 0: lcd.direita(); wait(0.2); break; case 1: lcd.esquerda(); wait(0.2); break; } switch (Joy.bot_select()) { case 0: if ((lcd.Lepos()[1] == '2') && (lcd.Lepos()[3] == '1')){ vazia = 1;} else{ wait(0.2); lcd.clc(); lcd.printf("Esvazie a mesa"); wait(1); lcd.clc(); lcd.printf("Está vazia?")lcd.pos(2,1); lcd.printf(">Sim >Nao");} } } */ Loop_Menu(); } /* ************************ **** DEFINE FUNÇÕES **** ************************ */ void Loop_Menu(){ wait(0.2); lcd.clc(); lcd.printf("> Modo Livre"); lcd.pos(2,1); lcd.printf("> Modo Steps"); menu = 1; lcd.home(); while(menu >= 1){ switch (Joy.ler_x()) { case 0: lcd.cima(); wait(0.2); break; case 1: lcd.baixo(); wait(0.2); break; } switch (Joy.ler_y()) { case 0: lcd.direita(); wait(0.2); break; case 1: lcd.esquerda(); wait(0.2); break; } switch (Joy.bot_select()) { case 0: menu = 0; if ((lcd.Lepos()[1] == '1') && (lcd.Lepos()[3] == '1')){ Tela_Instrucao(1);} if ((lcd.Lepos()[1] == '2') && (lcd.Lepos()[3] == '1')){ Tela_Instrucao(2);} wait(0.2); break; } if (menu == 2){ lcd.clc(); lcd.printf("> Modo Livre"); lcd.pos(2,1); lcd.printf("> Modo Steps"); menu = 1; lcd.home(); } } } void Loop_Horario(){ // Enquanto o valor de VRX for > 800 o motor continua girando. while( Joy.ler_x() == 0){ Ze.Full(); lcd.pos(2,5); lcd.printf("%.3f", Ze.Angulo); lcd.putc(0xDF); lcd.putc(0x10); } Ze.mot = 0b0000; } void Loop_Anti_Horario(){ // Enquanto o valor de VRX for < 200 o motor continua girando while( Joy.ler_x() == 1){ Ze.Full_(); lcd.pos(2,5); lcd.printf("%.3f", Ze.Angulo); lcd.putc(0xDF); lcd.putc(0x10); } Ze.mot = 0b0000; } void Aumenta_Vel(){ // Incrementa t em 1, muda a relação de tempo do Motor e printa o valor em porcentagem na tela t++; if (t == 3){ t = 2; } Ze.Tempo = tempos[t]; lcd.pos(1,5); lcd.printf("%s", porcentagem[t]); } void Diminui_Vel(){ // Decrementa t em 1, muda a relação de tempo do Motor e printa o valor em porcentagem na tela t--; if (t == -1){ t = 0; } Ze.Tempo = tempos[t]; lcd.pos(1,5); lcd.printf("%s", porcentagem[t]); } void Tela_1(){ // Função que define o funcionamento da tela 1 wait(0.2); lcd.clc(); Ze.Tempo = tempos[t]; // Define o tempo inicial Ze.Angulo = 0; // Reseta o ângulo ao entrar na tela Ze.Posicao = 0; lcd.pos(1,1); lcd.printf("Vel %s", porcentagem[t]); // Insere a parte de velocidade no LCD lcd.pos(2,1); lcd.printf("Pos %.3f", Ze.Angulo); while (t1 == 1){ switch (Joy.ler_x()) // Lê o valor de VRX { case 0: Loop_Horario(); wait(0.2); break; // Se for > 800 Printa na tela um check da direção e gira o motor no sentido horário case 1: Loop_Anti_Horario(); wait(0.2); break; // Se for < 200 Printa na tela um check da direção e gira o motor no sentido horário } switch (Joy.ler_y()) // Lê o valor de VRY { case 0: Aumenta_Vel(); wait(0.2); break; // Se for > 800 Printa na tela o valor em % e aumenta a velocidade case 1: Diminui_Vel(); wait(0.2); break; // Se for < 200 Printa na tela o valor em % e Diminui a velocidade } switch (Joy.bot_select()) { case 0: t1 = 2; break; } } } void Tela_2(){ // Função que define o funcionamento da tela 2 wait(0.2); lcd.clc(); Ze.Tempo = tempos[0]; // Define o tempo inicial Ze.Angulo = 0; // Reseta o ângulo ao entrar na tela Ze.Posicao = 0; lcd.printf("Pos"); // Insere a parte de velocidade no LCD while (t2 == 1){ switch (Joy.ler_x()) // Lê o valor de VRX { case 0: Ze.Full(); lcd.pos(1,5); lcd.printf("%.2f",Ze.Posicao); lcd.putc(0xE4); lcd.printf("m "); lcd.pos(2,5); lcd.printf("%.2f",Ze.Angulo); lcd.putc(0xDF); lcd.putc(0x10); break; // Se for > 800 Printa na tela um check da direção e gira o motor no sentido horário case 1: Ze.Full_(); lcd.pos(1,5); lcd.printf("%.2f",Ze.Posicao); lcd.putc(0xE4); lcd.printf("m "); lcd.pos(2,5); lcd.printf("%.2f",Ze.Angulo); lcd.putc(0xDF); lcd.putc(0x10); break; // Se for < 200 Printa na tela um check da direção e gira o motor no sentido horário } switch (Joy.ler_y()) // Lê o valor de VRY { case 0: wait(0.2); break; case 1: wait(0.2); break; } switch (Joy.bot_select()) { case 0: t2 = 2; break; } Ze.mot = 0b0000; } } void Tela_Instrucao(int a){ // Função que define o funcionamento da tela 1 wait(0.2); lcd.clc(); lcd.printf("Aperte o select para seguir"); int ti = 1; while (ti == 1){ switch (Joy.bot_select()) { case 0: ti = 2; Tela_Instrucao_1(a); break; } if (menu == 2){ ti = 0; Loop_Menu(); } } } void Tela_Instrucao_1(int a){ // Função que define o funcionamento da tela 1 wait(0.2); lcd.clc(); lcd.putc(0x03); lcd.printf("Gira "); lcd.putc(0x05); lcd.putc(0xFF); lcd.putc(0x04); lcd.printf("Gira "); lcd.putc(0x06); lcd.putc(0xFF); lcd.putc(0x7F); lcd.printf("Velo +"); lcd.putc(0xFF); lcd.putc(0x7E); lcd.printf("Velo -"); lcd.putc(0xFF); int ti1 = 1; t1 = 1; t2 = 1; while (ti1 == 1){ switch (Joy.bot_select()) { case 0: ti1 = 0; if (a == 1){ Tela_1(); Loop_Menu();} if (a == 2){ Tela_2(); Loop_Menu();} break; } if (menu == 2){ ti1 = 0; Loop_Menu(); } } } void Emergencia(){ Rele = 1; lcd.clc(); lcd.printf("!!!Emergencia!!!!!!pressionado!!"); while(mybutton == 1){ wait(0.2); } Rele = 0; lcd.clc(); t1 = 2; t2 = 2; menu = 2; }