KAIQUE DOGNANI
/
LCD_JOYSTICK
Utilizando a Nucleo F103RB com um módulo LCD e um Joystick para interface
Diff: main.cpp
- Revision:
- 0:bf743d54917c
- Child:
- 2:6a1762df0288
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Jun 09 00:35:52 2020 +0000 @@ -0,0 +1,271 @@ +// / +// _,.------....___,.' ',.-. +// ,-' _,.--" | +// ,' _.-' . +// / , ,' ` +// . / / ``. +// | | . \.\ +// ____ |___._. | __ \ `. +// .' `---"" ``"-.--"'` \ . \ +// . , __ ` | . +// `,' ,-"' . \ | 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, D9, D10, 'X'); // (IN1, IN2, IN3, IN4, Sensor 1, Sensor 2, Eixo) +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(D8); +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; +}