exercício 3.19
2 participantes
- gustavo de oliveira pires
- Mensagens : 116
Data de inscrição : 31/08/2022
Escola : murici
exercício 3.19
Sáb Jul 06, 2024 4:47 pm
/*
* 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
#include //Carrega a biblioteca com as funções do display
//DECLARAcAO DE VARIAVEIS GLOBAIS
LiquidCrystal lcd(12,11,10,9,8,7); //Setup conforme as ligações realizadas
byte dHj, mHj, dNv, mNv, temp2 = 0; //variavel usada
int aHj, aNv, temp4, idade = 0; //variavel usada
byte num1, num2, num3, num4 = 0; //variavel usada
boolean erro=0; //variavel usada
//INICIALIZAÇÃO DO HARDWARE
void setup() {
Serial.begin(9600); //inicializa a porta serial
lcd.begin(16, 2); // Inicializa o display configurado como 16 colunas e 2 linhas
}
//FUNÇÕES COMPLEMENTARES
//recebe os dados e guarda nas variaveis
//--------------------------------------------------------------------
void coletaDia(){
erro = 0; //não há erros
limpaBuffer(); //ativa o void limpaBuffer
while(Serial.available()==0){ //enquanto não haver erros o programa continuara rodando
delay(50); //tempo de intervalo
}
if(Serial.available()!=2){ //se for menor ou igual a 2 rada a função abaixo
erro = 1; //informa que há um erro
return; //retorna a função anterior
}
num1 = Serial.read()-48;// converte um caractere lido da serial para seu valor numérico correspondente.
num2 = Serial.read()-48; //converte um caractere lido da serial para seu valor numérico correspondente.
if(num1 < 0 || num1 > 9 || num2 < 0 || num2 > 9){ //se essas condições acontecderem roda o codigo abaixo
erro = 1; //informa que há erro
return; //retorna a função anterior
}
temp2 = num1 * 10 + num2; // constrói um número de dois dígitos a partir de num1 e num2
if(temp2 >31){ //se temp2 for maior que 31 roda a função abaixo
erro = 1; //informa que há erro
}else{ // bloco else é executado quando os valores são válidos, após a verificação da condição anterior
erro = 0; //não há erros
}
}
//--------------------------------------------------------------
void coletaMes(){
erro = 0; //não há erros
limpaBuffer(); //ativa o void limpaBuffer
while(Serial.available()==0){//enquanto não haver erros o programa continuara rodando
delay(50); //tempo de intervalo
}
if(Serial.available()!=2){ //se for menor ou igual a dois rodara a função abaixo
erro = 1; //imforma que há um erro
return; //retorna a função anterior
}
num1 = Serial.read()-48; //converte um caractere lido da serial para seu valor numérico correspondente.
num2 = Serial.read()-48; //converte um caractere lido da serial para seu valor numérico correspondente.
if(num1 < 0 || num1 > 9 || num2 < 0 || num2 > 9){ ////se essas condições acontecderem roda o codigo abaixo
erro = 1; //imforma que há um erro
return; //retorna a função anterior
}
temp2 = num1 * 10 + num2; // // constrói um número de dois dígitos a partir de num1 e num2
if(temp2 >12){ //se temp2 for maior que 12 rodara a função baixo
erro = 1; //imforma que há um erro
}else{ // bloco else é executado quando os valores são válidos, após a verificação da condição anterior
erro = 0; //não há erros
}
}
//---------------------------------------------------------------------
void coletaAno(){
erro = 0; //não há erros
limpaBuffer(); //ativa o void limpaBuffer
while(Serial.available()<= 3){ //enquanto for menor ou igual a 3 rodara a função abaixo
delay(50); //tempo de intervalo
}
if(Serial.available() > 4){ //se for maior que 4 rodara as funções abaixo
erro = 1; //imforma que há um erro
return; //retorna a função anterior
}
num1 = Serial.read()-48; //converte um caractere lido da serial para seu valor numérico correspondente.
num2 = Serial.read()-48;// converte um caractere lido da serial para seu valor numérico correspondente.
num3 = Serial.read()-48; //converte um caractere lido da serial para seu valor numérico correspondente.
num4 = Serial.read()-48; //converte um caractere lido da serial para seu valor numérico correspondente.
if(num1 < 0 || num1 > 9 || num2 < 0 || num2 > 9 || num3 < 0 || num3 > 9 || num4 < 0 || num4 > 9){ //se essas condições acontecderem roda o codigo abaixo
erro = 1; //imforma que há um erro
return; //retorna a função anterior
}
temp4 = num1 * 1000 + num2 * 100 + num3 * 10 + num4; // // constrói um número de dois dígitos a partir de num1, num2, num3, num4
if(temp4 < 1900){ //se temp4 for menor que 1900 rodara as funções abaixo
erro = 1; //informa que há um erro
}else{ // bloco else é executado quando os valores são válidos, após a verificação da condição anterior
erro = 0; //não há erros
}
}
//------------------------------------------------------------------
void limpaBuffer(){
while(Serial.available() > 0){// verifica se há dados disponíveis na porta serial e, se houver, executa o código dentro dele para processar esses dados
}
}
//PROGRAMA PRINCIPAL
void loop() {
Serial.println("Digite o dia do seu nacimento - formato dd"); //frase mandada a porta serial
coletaDia(); //ativa o void coletaDia
while(erro == 1){ //enquanto ouver erro rodara as funções abaixo
Serial.println("Dados invalidos - Digite o dia do seu nacimento com dois digitos"); //frase mandada a porta serial se ouver erro
coletaDia(); //ativa o void coletaDia
}
dNv = temp2;// copia o valor da variável temp2 para a variável dNv
Serial.println("Digite o mes do seu nacimento - formato mm"); //frase mandada a porta serial
coletaMes(); //ativa o void coletaMes
while(erro == 1){ //enquanto ouver erro rodara as funções abaixo
Serial.println("Dados invalidos - Digite o mes do seu nacimento com dois digitos"); //frase mandada a porta serial se ouver erro
coletaMes(); //ativa o void coletaMes
}
mNv = temp2;// copia o valor da variável temp2 para a variável mNv
Serial.println("Digite o ano do seu nacimento - formato aaaa"); //frase mandada a porta serial
coletaAno(); //ativa o void coletaAno
while(erro == 1){ //enquanto ouver erro rodara as funções abaixo
Serial.println("Dados invalidos - Digite o ano do seu nacimento com 4 digitos"); //frase mandada a porta serial se ouver erro
coletaAno(); //ativa o void coletaAno
}
aNv = temp4; // copia o valor da variável temp4 para a variável aNv
Serial.println("Digite o dia de HOJE - formato dd"); //frase mandada a porta serial
coletaDia(); //ativa o void coletaDia
while(erro == 1){ //enquanto ouver erro rodara as funções abaixo
Serial.println("Dados invalidos - Digite o dia de hoje novamente com dois digitos"); //frase mandada a porta serial se ouver erro
coletaDia(); //ativa o void coletaDia
}
dHj = temp2;// copia o valor da variável temp2 para a variável dHj
Serial.println("Digite o mes atual - formato mm"); //frase mandada a porta serial
coletaMes(); //ativa o void coletaMes
while(erro == 1){ //enquanto ouver erro rodara as funções abaixo
Serial.println("Dados invalidos - digite novamente com dois digitos"); //frase mandada a porta serial se ouver erro
coletaMes(); //ativa o void coletaMes
}
mHj = temp2; // copia o valor da variável temp2 para a variável mHj
Serial.println("Digite ano atual - formato aaaa"); //frase mandada a porta serial
coletaAno(); //ativa o void coletaAno
while(erro == 1){ //enquanto ouver erro rodara as funções abaixo
Serial.println("Dados invalidos - diite novamente o ano com 4 digitos"); //frase mandada a porta serial se ouver erro
coletaAno(); //ativa o void coletaAno
}
aHj = temp4; //copia o valor da variável temp4 para a variável aHj
if((mNv - mHj) < 0){ //se der verdadeiro ja fez aniversario
idade = aHj - aNv;// //ano de hoje - ano que naceu
}
else if(mNv - mHj > 0){ //ainda não fez aniversario
idade = aHj - aNv - 1; //ano de hoje - ano que naceu -1
}
else if((mNv - mHj) == 0 && (dNv - dHj) < 0){ //esta no mes do aniversario
idade = aHj - aNv; //ano de hoje - ano que naceu
}
else if(mNv - mHj == 0 && (dNv - dHj) > 0){ //falta alguns dias pro aniversario
idade = aHj - aNv - 1; //ano de hoje - ano que naceu -1
}else{ // faz aniversario hoje
idade = aHj - aNv; //ano de hoje - ano que naceu
Serial.println("Parabéns pelo Aniversario");
}
Serial.print(aNv);Serial.print(aHj);Serial.print(mNv);Serial.println(mHj); //manda o valor das variaveis a porta serial
Serial.print("sua idade é = ");//frase mandada a porta serial
Serial.println(idade); //coloca o valor de idade na porta serial
lcd.clear();//limpa o display
lcd.print("Sua idade é = "); //frase mandada ao display
lcd.print(idade); //manda o valor de idade ao display
}
* 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
#include //Carrega a biblioteca com as funções do display
//DECLARAcAO DE VARIAVEIS GLOBAIS
LiquidCrystal lcd(12,11,10,9,8,7); //Setup conforme as ligações realizadas
byte dHj, mHj, dNv, mNv, temp2 = 0; //variavel usada
int aHj, aNv, temp4, idade = 0; //variavel usada
byte num1, num2, num3, num4 = 0; //variavel usada
boolean erro=0; //variavel usada
//INICIALIZAÇÃO DO HARDWARE
void setup() {
Serial.begin(9600); //inicializa a porta serial
lcd.begin(16, 2); // Inicializa o display configurado como 16 colunas e 2 linhas
}
//FUNÇÕES COMPLEMENTARES
//recebe os dados e guarda nas variaveis
//--------------------------------------------------------------------
void coletaDia(){
erro = 0; //não há erros
limpaBuffer(); //ativa o void limpaBuffer
while(Serial.available()==0){ //enquanto não haver erros o programa continuara rodando
delay(50); //tempo de intervalo
}
if(Serial.available()!=2){ //se for menor ou igual a 2 rada a função abaixo
erro = 1; //informa que há um erro
return; //retorna a função anterior
}
num1 = Serial.read()-48;// converte um caractere lido da serial para seu valor numérico correspondente.
num2 = Serial.read()-48; //converte um caractere lido da serial para seu valor numérico correspondente.
if(num1 < 0 || num1 > 9 || num2 < 0 || num2 > 9){ //se essas condições acontecderem roda o codigo abaixo
erro = 1; //informa que há erro
return; //retorna a função anterior
}
temp2 = num1 * 10 + num2; // constrói um número de dois dígitos a partir de num1 e num2
if(temp2 >31){ //se temp2 for maior que 31 roda a função abaixo
erro = 1; //informa que há erro
}else{ // bloco else é executado quando os valores são válidos, após a verificação da condição anterior
erro = 0; //não há erros
}
}
//--------------------------------------------------------------
void coletaMes(){
erro = 0; //não há erros
limpaBuffer(); //ativa o void limpaBuffer
while(Serial.available()==0){//enquanto não haver erros o programa continuara rodando
delay(50); //tempo de intervalo
}
if(Serial.available()!=2){ //se for menor ou igual a dois rodara a função abaixo
erro = 1; //imforma que há um erro
return; //retorna a função anterior
}
num1 = Serial.read()-48; //converte um caractere lido da serial para seu valor numérico correspondente.
num2 = Serial.read()-48; //converte um caractere lido da serial para seu valor numérico correspondente.
if(num1 < 0 || num1 > 9 || num2 < 0 || num2 > 9){ ////se essas condições acontecderem roda o codigo abaixo
erro = 1; //imforma que há um erro
return; //retorna a função anterior
}
temp2 = num1 * 10 + num2; // // constrói um número de dois dígitos a partir de num1 e num2
if(temp2 >12){ //se temp2 for maior que 12 rodara a função baixo
erro = 1; //imforma que há um erro
}else{ // bloco else é executado quando os valores são válidos, após a verificação da condição anterior
erro = 0; //não há erros
}
}
//---------------------------------------------------------------------
void coletaAno(){
erro = 0; //não há erros
limpaBuffer(); //ativa o void limpaBuffer
while(Serial.available()<= 3){ //enquanto for menor ou igual a 3 rodara a função abaixo
delay(50); //tempo de intervalo
}
if(Serial.available() > 4){ //se for maior que 4 rodara as funções abaixo
erro = 1; //imforma que há um erro
return; //retorna a função anterior
}
num1 = Serial.read()-48; //converte um caractere lido da serial para seu valor numérico correspondente.
num2 = Serial.read()-48;// converte um caractere lido da serial para seu valor numérico correspondente.
num3 = Serial.read()-48; //converte um caractere lido da serial para seu valor numérico correspondente.
num4 = Serial.read()-48; //converte um caractere lido da serial para seu valor numérico correspondente.
if(num1 < 0 || num1 > 9 || num2 < 0 || num2 > 9 || num3 < 0 || num3 > 9 || num4 < 0 || num4 > 9){ //se essas condições acontecderem roda o codigo abaixo
erro = 1; //imforma que há um erro
return; //retorna a função anterior
}
temp4 = num1 * 1000 + num2 * 100 + num3 * 10 + num4; // // constrói um número de dois dígitos a partir de num1, num2, num3, num4
if(temp4 < 1900){ //se temp4 for menor que 1900 rodara as funções abaixo
erro = 1; //informa que há um erro
}else{ // bloco else é executado quando os valores são válidos, após a verificação da condição anterior
erro = 0; //não há erros
}
}
//------------------------------------------------------------------
void limpaBuffer(){
while(Serial.available() > 0){// verifica se há dados disponíveis na porta serial e, se houver, executa o código dentro dele para processar esses dados
}
}
//PROGRAMA PRINCIPAL
void loop() {
Serial.println("Digite o dia do seu nacimento - formato dd"); //frase mandada a porta serial
coletaDia(); //ativa o void coletaDia
while(erro == 1){ //enquanto ouver erro rodara as funções abaixo
Serial.println("Dados invalidos - Digite o dia do seu nacimento com dois digitos"); //frase mandada a porta serial se ouver erro
coletaDia(); //ativa o void coletaDia
}
dNv = temp2;// copia o valor da variável temp2 para a variável dNv
Serial.println("Digite o mes do seu nacimento - formato mm"); //frase mandada a porta serial
coletaMes(); //ativa o void coletaMes
while(erro == 1){ //enquanto ouver erro rodara as funções abaixo
Serial.println("Dados invalidos - Digite o mes do seu nacimento com dois digitos"); //frase mandada a porta serial se ouver erro
coletaMes(); //ativa o void coletaMes
}
mNv = temp2;// copia o valor da variável temp2 para a variável mNv
Serial.println("Digite o ano do seu nacimento - formato aaaa"); //frase mandada a porta serial
coletaAno(); //ativa o void coletaAno
while(erro == 1){ //enquanto ouver erro rodara as funções abaixo
Serial.println("Dados invalidos - Digite o ano do seu nacimento com 4 digitos"); //frase mandada a porta serial se ouver erro
coletaAno(); //ativa o void coletaAno
}
aNv = temp4; // copia o valor da variável temp4 para a variável aNv
Serial.println("Digite o dia de HOJE - formato dd"); //frase mandada a porta serial
coletaDia(); //ativa o void coletaDia
while(erro == 1){ //enquanto ouver erro rodara as funções abaixo
Serial.println("Dados invalidos - Digite o dia de hoje novamente com dois digitos"); //frase mandada a porta serial se ouver erro
coletaDia(); //ativa o void coletaDia
}
dHj = temp2;// copia o valor da variável temp2 para a variável dHj
Serial.println("Digite o mes atual - formato mm"); //frase mandada a porta serial
coletaMes(); //ativa o void coletaMes
while(erro == 1){ //enquanto ouver erro rodara as funções abaixo
Serial.println("Dados invalidos - digite novamente com dois digitos"); //frase mandada a porta serial se ouver erro
coletaMes(); //ativa o void coletaMes
}
mHj = temp2; // copia o valor da variável temp2 para a variável mHj
Serial.println("Digite ano atual - formato aaaa"); //frase mandada a porta serial
coletaAno(); //ativa o void coletaAno
while(erro == 1){ //enquanto ouver erro rodara as funções abaixo
Serial.println("Dados invalidos - diite novamente o ano com 4 digitos"); //frase mandada a porta serial se ouver erro
coletaAno(); //ativa o void coletaAno
}
aHj = temp4; //copia o valor da variável temp4 para a variável aHj
if((mNv - mHj) < 0){ //se der verdadeiro ja fez aniversario
idade = aHj - aNv;// //ano de hoje - ano que naceu
}
else if(mNv - mHj > 0){ //ainda não fez aniversario
idade = aHj - aNv - 1; //ano de hoje - ano que naceu -1
}
else if((mNv - mHj) == 0 && (dNv - dHj) < 0){ //esta no mes do aniversario
idade = aHj - aNv; //ano de hoje - ano que naceu
}
else if(mNv - mHj == 0 && (dNv - dHj) > 0){ //falta alguns dias pro aniversario
idade = aHj - aNv - 1; //ano de hoje - ano que naceu -1
}else{ // faz aniversario hoje
idade = aHj - aNv; //ano de hoje - ano que naceu
Serial.println("Parabéns pelo Aniversario");
}
Serial.print(aNv);Serial.print(aHj);Serial.print(mNv);Serial.println(mHj); //manda o valor das variaveis a porta serial
Serial.print("sua idade é = ");//frase mandada a porta serial
Serial.println(idade); //coloca o valor de idade na porta serial
lcd.clear();//limpa o display
lcd.print("Sua idade é = "); //frase mandada ao display
lcd.print(idade); //manda o valor de idade ao display
}
Re: exercício 3.19
Sex Set 13, 2024 10:30 pm
Oi Gustavo, esse exercício vamos corrigir juntos na aula de sabado.
Daí vou te mostrar como fazer depuraçõ do programa e como encontrar problemas em codigos mais extensos
Daí vou te mostrar como fazer depuraçõ do programa e como encontrar problemas em codigos mais extensos
Permissões neste sub-fórum
Não podes responder a tópicos