Robótica Livre
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Ir para baixo
Paulo Augusto Batista
Paulo Augusto Batista
Admin
Mensagens : 5115
Data de inscrição : 11/02/2019
Idade : 52
Escola : Colegio Lindaura
https://roboticalivre.forumeiros.com

Exercício 3.19 Calculo da Idade Empty Exercício 3.19 Calculo da Idade

Dom Dez 15, 2019 3:37 pm
Nesta aula resolvemos em sala de aula o exercício 3.19 , abaixo o código usado.
Aguardo somente os comentários para dar as notas.
Quem quiser resolver usando outra estratégia também pode ficar a vontade.

Código:
/*
 * CURSO DE ROBOTICA 2019
 *
 * Exercicio: 3.19
 * Tema: Calculo da Idade
 * Atividade: Solicitar via terminal a data atual e a data de nascimento, aclcular a idade e informar no display
 * Descrição: As datas deverão vir no formato dd/mm/aaaa
 * Hardware: Porta USB para receber os dados
 * Comandos: Serial.begin(9600); Serial.read(); Serial.available();
 * Dica1: A configuração da serial usa velocidade padrão de 9600, poderia ser alterado caso necessite maior performance
 * Dica2: Na interface do arduino abrir o terminal em ferramentas - Monitor serial ou ctr+shift+M
 * Dica3: Enviar para o terminal \n para nova linha ou \r para retorno de carro
 * Dica4: O texto entre parenteses no comando Serial.print deve estar entre aspas duplas " "
 * Dica5: Para transformar os caracteres em numeros vamos usar desenvolver uma função que retorna dia mes e ano
 * Dica6: Calcular a idade subtraindo o ano atual do ano de nascimento e comparar os dias e meses para ver se o aniversario desse ano já foi
 * Dica7: Cuidado com as leituras na porta serial porque para esvaziar o buffer é necessário ler todos os dados, abaixo como esvaziar o buffer
    for(byte i = Serial.available(); i > 0; i--){          //Esvazia o buffer da porta serial
     Serial.read();
    }
 * Dica8: Esse codigo tem pontos que podem ser otimizados, quem otimizar considero exercicio cumprido
 */

//DEFINICOES INICIAIS


//DECLARAcAO DE VARIAVEIS GLOBAIS
byte dHj, mHj, dNv, mNv, temp2 = 0;
int aHj, aNv, temp4,idade = 0;
byte num1, num2, num3, num4 = 0;
boolean erro=0;


//INICIALIZAÇÃO DO HARDWARE
void setup() {
Serial.begin(9600);
}

//FUNÇÕES COMPLEMENTARES
//recebe os dados e guarda nas variáveis
//-------------------------------------------------
void coletaDia(){
  erro = 0;
  limpaBuffer();
  while(Serial.available()==0){
    delay(10);
  }
  if(Serial.available()!=2){
    erro = 1;
    return;
  }
  num1 = Serial.read()-48; //recebe o primeiro digito
  num2 = Serial.read()-48;
  if(num1 <0 || num1 >9 || num2<0 || num2 >9){
    erro = 1;
    return;
  }
  temp2 = num1 * 10 + num2;
  if(temp2 >31){
    erro = 1; //Sinaliza que ainda tem erro
  }else{
    erro = 0; //Sinaliza que o dado é valido
  }
}
//-----------------------------------------------------
void coletaMes(){
  erro = 0;
  limpaBuffer();
  while(Serial.available()==0){
    delay(10);
  }
  if(Serial.available()!=2){
    erro = 1;
    return;
  }
  num1 = Serial.read()-48; //recebe o primeiro digito
  num2 = Serial.read()-48;
  if(num1 <0 || num1 >9 || num2<0 || num2 >9){
    erro = 1;
    return;
  }
  temp2 = num1 * 10 + num2;
  if(temp2 > 12){
    erro = 1; //Sinaliza que ainda tem erro
  }else{
    erro = 0; //Sinaliza que o dado é valido
  }
}

//COLETA ANO----------------------------------------------------------
void coletaAno(){
  limpaBuffer();
  erro = 0;
  while(Serial.available() <= 3){
    delay(10);
  }
  if(Serial.available() > 4){
    erro = 1;
    return;
  }
  num1 = Serial.read()-48;
  num2 = Serial.read()-48;
  num3 = Serial.read()-48;
  num4 = Serial.read()-48;
//  Serial.print(num1);Serial.print(num2);Serial.print(num3);Serial.println(num4);
  if(num1<0||num1>9||num2<0||num2>9||num3<0||num3>9||num4<0||num4>9){
    erro=1;
    return;
  }
  temp4 = num1 * 1000 + num2 * 100 + num3 * 10 + num4;
  if(temp4 < 1900){
    erro = 1;
  }else{
    erro =0;
  }
}

void limpaBuffer(){
  while(Serial.available()>0){
    Serial.flush();
  }
}

//PROGRAMA PRINCIPAL
void loop() {
  //------------------------COLETA DIA DO NASCIMENTO--------------------
   Serial.println("Digite o dia do seu Nascimento - formato dd");
   coletaDia();
   while(erro == 1){
    Serial.println("Dados Invalidos - Digite o dia do Nascimento Novamente com dois digitos");
    coletaDia();
   }
   dNv = temp2;
   //-------------------------COLETA MES DO NASCIMENTO------------------
   Serial.println("Digite o Mes do seu Nascimento - formato mm");
   coletaMes();
   while(erro == 1){
    Serial.println("Dados Invalidos - Digite o Mes do Nascimento Novamente com dois digitos");
    coletaMes();
   }
   mNv = temp2;
   //-------------------------COLETA ANO DO NASCIMENTO---------------------
   Serial.println("Digite o Ano do seu Nascimento - Formato aaaa");
   coletaAno();
   while(erro == 1){
    Serial.println("Dados Invalidos - Digite o Ano do Nascimento Novamente com 4 digitos");
    coletaAno();
   }
   aNv = temp4;
     //------------------------COLETA DIA DE HOJE--------------------
   Serial.println("Digite o dia de HOJE - formato dd");
   coletaDia();
   while(erro == 1){
    Serial.println("Dados Invalidos - Digite o dia de Hoje Novamente com dois digitos");
    coletaDia();
   }
   dHj = temp2;
   //-------------------------COLETA MES ATUAL------------------
   Serial.println("Digite o Mes Atual - formato mm");
   coletaMes();
   while(erro == 1){
    Serial.println("Dados Invalidos - Digite o Mes Atual Novamente com dois digitos");
    coletaMes();
   }
   mHj = temp2;
   //-------------------------COLETA ANO ATUAL---------------------
   Serial.println("Digite o Ano Atual - Formato aaaa");
   coletaAno();
   while(erro == 1){
    Serial.println("Dados Invalidos - Digite o Ano Atual Novamente com 4 digitos");
    coletaAno();
   }
   aHj = temp4;
//----------------------calculo da idade-----------------------------
if((mNv - mHj) < 0){ //Se verdadeiro ainda não fez aniversario
idade = aHj - aNv;
}
else if(mNv - mHj > 0){
  idade = aHj - aNv - 1;
}
else if((mNv - mHj) == 0 && (dNv - dHj) < 0){ //ainda ja fez aniversario
  idade = aHj - aNv;
}
else if(mNv - mHj == 0 && (dNv - dHj) > 0){ //ainda não fez aniversario
  idade = aHj - aNv - 1;
  }else{ //Aqui é o dia do aniversario
    idade = aHj - aNv;
    Serial.println("Parabéns pelo Aniversário");
  }
  Serial.print(aNv);Serial.print(aHj);Serial.print(mNv);Serial.println(mHj);
  Serial.print("Sua Idade é = ");
  Serial.println(idade);
}
Ir para o topo
Permissões neste sub-fórum
Não podes responder a tópicos