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.
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);
}
Permissões neste sub-fórum
Não podes responder a tópicos