Utilizando a Nucleo F103RB com um módulo LCD e um Joystick para interface

Dependencies:   mbed

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;
}