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

Ir para baixo
alvaro 123456
alvaro 123456
Mensagens : 481
Data de inscrição : 27/04/2019
Idade : 18

Exercício 4.19 Resolvido Empty Exercício 4.19 Resolvido

Qui maio 26, 2022 3:48 pm
/*
* CURSO DE ROBOTICA 2021
*
* Exercicio: 4.19
* Tema: Temporizador Usando Funções e ABAS
* Atividade: Elaborar um temporizador utilizando funções para resolver o exercício
* Descrição: Usar um diplay para mostrar o tempo com resolução de 1 segundo, uma tecla para aacionar e o buzzer de alarme
* Hardware: Inicializar a porta serial, buzzer de alarme de final de contagem
* Comandos: lcd.print(), analogRead(), digitalWrite(), if(), tone()
* Dica01: Funções são trechos do programa que são executados quando a função é chamada e podem receber dados e sempre retornam algum dado
* Dica02: Vantagem 1: Segmentam o programa tornando-os mais fácil de desenvolver e entender
* Dica03: Vantagem 2: Ajudam a organizar o programa
* Dica04: Vantagem 3: Evitam a repetição de trechos do programa que podem ser executados
* Dica05: Declaração deve ser realizado sempre fora de outras funções ou procedimentos
* Dica06: Para declarar uma função usa-se o nome da função precedido do tipo de dado que vai retornar, podendo ser char, byte, int, long, float, double
* Dica07: Na declaração entre chaves é colocado o tipo de dado e o nome da variável que vai receber o dado para utilizar na função
* Dica08: Ainda na declaração se receber mais de uma variável as demais devem ser separadas por virgula
* Dica09: No final da função é utilizado o comando de retorno e o dado que retornará da função, ex. return(variavel);
* Dica10: A declaração fica no seguinte formato, Ex. int nome{byte var1, float var2}{ 1a.instrução; ... return(variavel); }
* Dica11: declare as funções na área //FUNÇÕES COMPLEMENTARES
* Dica12: As variáveis GLOBAIS podem ser acessadas pelas funções, mas uma boa prática é usar somente variáveis LOCAIS
* Dica13: Variáveis LOCAIS usadas nos procedimentos são liberadas quando o procedimento encerra
* Dica14: Para invocar uma função basta digitar o nome que foi declarado seguido de parenteses com as variáveis e terminando em ponto e virgula Ex. nome(var1, var2);
* Dica15: Usar as abas separando o setup(), programa principal e as funções.
* Dica16: A tecla serve para acionar ou parar o temporizador, também desliga o alarme quando concluir o temporizador
*/

//DEFINICOES INICIAIS
#include
#define tecla 8
#define teclaReinicio 9
#define buzzer 13


LiquidCrystal lcd(7,6,5,4,3,2);
byte estado = 0; //Informa o estrado do temporizador
bool controle = 0; //Controla se a tecla já foi depressionada
int timer [3] = {0, 1, 0}; //Vetor usado para guardar o temporizador e cagerrado para 1 minuto
long long tempoInicio, tempoAcumulado = 0;
byte hora, minuto, segundo;
long tempAnt;
enum {aguardando = 0, rodando, pausado, alarmando};//Lista de enumeração usada para checar o estado do programa

void setup () {

Serial.begin(9600); //Inicializa a porta serial
lcd.begin(16, 2); //Inicializa o display
pinMode(tecla, INPUT_PULLUP); //tecla como entrada INPUT_PULLUP
pinMode(teclaReinicio, INPUT_PULLUP); //tecla como entrada INPUT_PULLUP
pinMode(buzzer, OUTPUT); //Buzzer como saida
}


void checaEstado () {
if(estado == aguardando && !digitalRead(tecla) && controle == 0){ //Tecla pressionada inicia a contagem

estado = rodando;//estado passa a 1
controle = 1;//controle também passa para 1
tempoInicio = millis(); //Reinicia o tempo
return;//faz o returno do estado
}
if(digitalRead(tecla) && controle == 1) {//Se a tecla for depressionada
controle = 0; //reseta o controle
}
if(estado == rodando && !digitalRead(tecla) && controle == 0 ) {//Indica que incluiu uma pausa
estado = pausado;//muda o valro de estado eindica que ouve uma pausa
tempoAcumulado += millis() - tempoInicio;//
controle = 1;//controle igual a um, evitar multiplas leituras
}
if(estado = pausado){ //Se estado estiver pausado
tempoInicio = millis(); //Fica reiniciando o contador
if(!digitalRead(tecla) && controle == 0){//Indica o fim da pausa
estado = rodando; //volta para rodando
controle = 1; //controle igual a um, evitar multiplas leituras
}
}
if(estado == alarmando && !digitalRead(tecla) && controle == 0) { // Indica que foi comandado fim do alarme e reinicio
estado = aguardando;//passa estado pra zero
noTone(buzzer);//desliga o buzzer
controle = 1;//controle igual a um, evitar multiplas leituras

}
if(!digitalRead(teclaReinicio) && controle == 0){//Renicia a tecla
controle = 1;//contole igual a 1
estado = aguardando;//zera estado
tempoInicio = millis();//Inica o contador com contagem regresiva
tempoAcumulado = 0; //Zera
segundo = 0;//Zera o temporizador
minuto = 0;//Zera o temporizador
segundo = 0;//Zera o temporizador

}
}
void debug() {
Serial.print("estado = "); //Imprime o text
Serial.print(estado); //valor da variavel
Serial.print("controle = "); //Imprime o text
Serial.print(controle);//valor da variavel
Serial.print("tempAnt = "); //Imprime o text
Serial.print(tempAnt); //valor da variavel
}

void temporizador () {
if(estado == rodando){ //Temporizador começa a decrementar
long long tempoCorrido; //Declaraão de variavel local
tempoCorrido = millis() - tempoInicio + tempoAcumulado;//vai passar o tempo apos e start e se tiver uma apusa
segundo = tempoCorrido / 1000;//tempo em segundos
minuto = segundo / 60;//vai passar os minuotos
segundo = segundo - minuto * 60;//vai passar a quantidade de segundos
hora = segundo / 3600;// tempo em hora
minuto = minuto - hora * 60; //vai passar a quantidade de minutos
}
}
void mostraDisplay () {

long temp = timer[0]*3600 + timer[1]*60 + timer[2] - segundo - minuto * 60 - hora * 3600;
if(temp == tempAnt)return;//Se for diferente os tempos
tempAnt = temp; //entra e deixa o tempoAnt igual ao temp
byte horaF, minutoF, segundoF; //Declaração de variavel local
lcd.clear(); //limpa o display
horaF = temp / 3600;//Faz o calculo da hora
if(horaF < 10)lcd.print('0');//Se hora final for menor que 10 vai incluir mais um zero
lcd.print(horaF);//quantidade de horas que falta
lcd.print(":");//imprime o text
minutoF = (temp - horaF * 3600) / 60; //Faz o calculo do minuto
if(minutoF < 10)lcd.print('0');//Se minuto final for menor que 10 vai incluir mais um zero
lcd.print(minutoF);//imprime o valor de minutoF
lcd.print(":");//imprime o text
segundoF = temp - horaF * 3600 - minutoF * 60;//Faz o calculo do segundo
if(segundoF < 10)lcd.print('0');//Se segundo final for menor que 10 vai incluir mais um zero
lcd.print(segundoF);//imprime o valor de segundoF
}
void alerta () {

if((timer[0]*3600 + timer[1]*60 + timer[2]) < ((millis() - tempoInicio + tempoAcumulado))){//Se for verdadeira já zerou
estado = alarmando; //troca o estado do programa
}
if(estado == alarmando) {//Se estiver em estado alarmando
tone(buzzer,1800);//Aciona o buzzer
}else {//Senão
noTone(buzzer);//desativa o buzzer

}
}

void loop () {
checaEstado ();//Chama a função
temporizador();//Chama a função
mostraDisplay();//Chama a função
alerta();//Chama a função
debug();//Chama a função
}
Paulo Augusto Batista
Paulo Augusto Batista
Admin
Mensagens : 5788
Data de inscrição : 11/02/2019
Idade : 53
Escola : Colegio Lindaura
https://roboticalivre.forumeiros.com

Exercício 4.19 Resolvido Empty Re: Exercício 4.19 Resolvido

Ter Jul 26, 2022 11:58 pm
Ae Alvaro, parabéns nota 10.0
Falta pouco para finalizar essa etapa de programação.
Ir para o topo
Permissões neste sub-fórum
Não podes responder a tópicos