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