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:
- 2:6a1762df0288
- Parent:
- 0:bf743d54917c
- Child:
- 3:fcdbe4af1b6d
File content as of revision 2:6a1762df0288:
// / // _,.------....___,.' ',.-. // ,-' _,.--" | // ,' _.-' . // / , ,' ` // . / / ``. // | | . \.\ // ____ |___._. | __ \ `. // .' `---"" ``"-.--"'` \ . \ // . , __ ` | . // `,' ,-"' . \ | L // ,' ' _.' -._ / | // ,`-. ,". `--' >. ,' | // . .'\' `-' __ , ,-. / `.__.- ,' // ||:, . ,' ; / / \ ` `. . .'/ // j|:D \ `--' ' ,'_ . . `.__, \ , / // L:_ | . "' :_; `.'.' //. ""' """""' V // `. . `. _,.. ` // `,_ . . _,-'/ .. `,' __ ` // ) \`._ ___....----"' ,' .' \ | ' \ . // / `. "`-.--"' _,' ,' `---' | `./ | // . _ `""'--.._____..--" , ' | // | ." `. `-. /-. / , // | `._.' `,_ ; / ,' . // .' /| `-. . ,' , , // '-.__ __ _,',' '`-..___;-...__ ,.'\ ____.___.' // `"^--'..' '-`-^-'"-- `-^-'`.''"""""`.,^.`.--' #include "mbed.h" #include "LCD_ka.h" #include "Joystick.h" #include "Motor_de_passo.h" Motor Xe(PB_13, PB_14, PB_15, PB_1, D2, D3, 'X'); // (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(D6, D7, D2, D3, D4, D5); // Para conectar como arduíno: (D8, D9, D4, D5, D6, D7); Para default: (D6, D7, D2, D3, D4, D5); InterruptIn mybutton(D10); // Para shield, D10 DigitalOut Rele(D11); /* ************************** ***** 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 (acesse pelo botão Select do shield) void Tela_Instrucao(int a); // Tela de instrução para manuseio void Tela_Instrucao_1(int a); void Emergencia(); void Loop_Menu(); /* ************************** **** INICIA VARIÁVEIS **** ************************** */ double tempos[] = {0.2, 0.02, 0.002}; // Tempos para mudar a velocidade int t = 0; // Variável que guarda a posição do tempo string porcentagem[] = {"0.1%", " 10%", "100%"}; // Porcentagens em uma string para printar int menu = 1; int t1 = 1; int t2 = 1; /* ************************ **** LOOP PRINCIPAL **** ************************ */ int main(){ if (mybutton == 1){ Emergencia(); } mybutton.rise(&Emergencia); 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){ Xe.Full(); } Xe.mot = 0b0000; } void Loop_Anti_Horario(){ // Enquanto o valor de VRX for < 200 o motor continua girando while( Joy.ler_x() == 1){ Xe.Full_(); } Xe.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; } Xe.Tempo = tempos[t]; lcd.pos(2,13); 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; } Xe.Tempo = tempos[t]; lcd.pos(2,13); lcd.printf("%s", porcentagem[t]); } void Tela_1(){ // Função que define o funcionamento da tela 1 wait(0.2); lcd.clc(); Xe.Tempo = tempos[t]; // Define o tempo inicial lcd.putc(0x03); lcd.printf("Gira "); lcd.putc(0x05); // Insere a primeira linha do LCD lcd.pos(2,1); lcd.putc(0x04); lcd.printf("Gira "); lcd.putc(0x06); // Insere a segunda linha do LCD lcd.pos(1,9); lcd.putc(0xFF); lcd.pos(2,9); lcd.putc(0xFF); lcd.pos(2,10); lcd.printf("Vel%s", porcentagem[t]); // Insere a parte de velocidade no LCD while (t1 == 1){ switch (Joy.ler_x()) // Lê o valor de VRX { case 0: lcd.pos(1,8); lcd.putc(0x00); Loop_Horario(); lcd.pos(1,8); lcd.putc(0x80); 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: lcd.pos(2,8); lcd.putc(0x00); Loop_Anti_Horario(); lcd.pos(2,8); lcd.putc(0x80); 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(); Xe.Tempo = tempos[t]; // Define o tempo inicial Xe.Angulo = 0; // Reseta o ângulo ao entrar na tela lcd.putc(0x03); lcd.printf("Gira "); lcd.putc(0x05); // Insere a primeira linha do LCD lcd.pos(2,1); lcd.putc(0x04); lcd.printf("Gira "); lcd.putc(0x06); // Insere a segunda linha do LCD lcd.pos(1,9); lcd.printf("Pos", Xe.Angulo ); // Insere a parte de velocidade no LCD while (t2 == 1){ switch (Joy.ler_x()) // Lê o valor de VRX { case 0: lcd.pos(1,8); lcd.putc(0x00); Xe.Full(); lcd.pos(1,8); lcd.putc(0x80); lcd.pos(2,9); lcd.printf("%.1f",Xe.Angulo); break; // Se for > 800 Printa na tela um check da direção e gira o motor no sentido horário case 1: lcd.pos(2,8); lcd.putc(0x00); Xe.Full_(); lcd.pos(2,8); lcd.putc(0x80); lcd.pos(2,9); lcd.printf("%.1f",Xe.Angulo); 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.3); break; // Se for > 800 Printa na tela o valor em % e aumenta a velocidade case 1: Diminui_Vel(); wait(0.3); break; // Se for < 200 Printa na tela o valor em % e Diminui a velocidade } switch (Joy.bot_select()) { case 0: t2 = 2; break; } } } 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; }