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

Ir para baixo
Thiaguin
Thiaguin
Mensagens : 203
Data de inscrição : 03/03/2020

Exercício 4.19 Empty Exercício 4.19

Ter Dez 28, 2021 9:23 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 acionar 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 //Carregada a biblioteca com as funções do display
#define tecla 3 //Definido que o pino 3 irá se chamar tecla
#define teclaReinicio 5 //Definido que o pino 5 irá se chamar teclaReinicio
#define buzzer 13 //Definido que o pino 13 irá se chamar buzzer

//DECLARAcAO DE VARIAVEIS GLOBAIS
LiquidCrystal lcd(12,11,10,9,8,7);//O display será ligado no arduino nesta cronologia de pinos
byte estado = 0;//Informa o estado 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 carregado para 1 minuto
long tempoInicio, tempoAcumulado = 0;//Variáveis para ser armazenado o tempo decorrido
byte hora, minuto, segundo;//Variáveis para ajuste do temporizador
long tempAnt;//Variável para ser armazenado o valor do tempo decorrido anteriormente
enum {aguardando = 0, rodando, pausado, alarmando};//Lista de enumeração usada para checar o estado do programa

//INICIALIZAÇÃO DO HARDWARE
void setup() {
Serial.begin(9600);//Porta serial inicializada com uma velocidade de 9600 bps  
lcd.begin(16,2);//Display inicializado, o display utilizado possui 2 linhas e 16 colunas  
pinMode(tecla, INPUT_PULLUP);//Configurado o pino 3 como entrada usando um resistor de pullup
pinMode(teclaReinicio, INPUT_PULLUP);//Configurado o pino 5 como entrada usando um resistor de pullup
pinMode(buzzer, OUTPUT);//Configurado o pino 13 como saída
}

//FUNÇÕES COMPLEMENTARES
/*Os estado possíveis são :
* 0-contador resetado e aguardando start
* 1-contador em contagem regressiva, podendo ser pausado
* 2-contador em pausa
* 3-contador finalizado aguardando reinício, alarme ativado
*/
void checaEstado(){//Checagem dos estados
 if(estado == aguardando && !digitalRead(tecla) && controle == 0){//Se a tecla for pressionada inicia a contagem
  estado = rodando;//O estado passa para a condição 1
  controle = 1;//A variável de controle passa a ser 1
  tempoInicio = millis();//Inicia o temporizador
 }
 if(digitalRead(tecla) && controle == 1){//Controla a tecla ser depressionada
  controle = 0;//A variável controle passa a ser 0
 }
 if(estado == rodando && !digitalRead(tecla) && controle == 0){//Indica que incluiu uma pausa
  estado = pausado;//O estado passa para a condição 2
  tempoAcumulado += millis() - tempoInicio;//O tempo decorrido será armazenado na variável tempoAcumulado
  controle = 1;//A variável de controle passa a ser 1
 }
 if(estado == pausado){//Condições da pausa
  tempoInicio = millis();//O temporizador ficará reiniciando para não acionar o alarme
  if(!digitalRead(tecla) && controle == 0){//Indica fim da pausa
   estado = rodando;//O estado passa para a condição 1
   controle = 1;//A variável de controle passa a ser 1  
  }
 }
 if(estado == alarmando && !digitalRead(tecla) && controle == 0){//Indica que foi comandado fim do alarme e reinício
  estado = aguardando;//O estado passa para a condição 0
  noTone(buzzer);//Desliga o buzzer
  controle = 1;//A variável de controle passa a ser 1
 }
 if(!digitalRead(teclaReinicio) && controle == 0){//Indica o reinício
  controle = 1;//A variável de controle passa a ser 1
  estado = aguardando;//O estado passa para a condição 0
  tempoInicio = millis();//Reinicia o temporizador
  tempoAcumulado = 0;//Variável resetada
  hora = 0;//Variável resetada
  minuto = 0;//Variável resetada
  segundo = 0; //Variável resetada
 }
}
void debug(){//Verificação pelo monitor serial
 Serial.print("Estado = ");
 Serial.print(estado);//Apresenta o estado no monitor serial
 Serial.print("  Controle = ");
 Serial.print(controle);//Apresenta o controle no monitor serial
 Serial.print("  tempAnt = ");
 Serial.print(tempAnt);//Apresenta o estado no monitor serial
}
void temporizador(){//Ajuste do temporizador
 if(estado == rodando){//Se o estado estiver na condição 1, roda o bloco abaixo
  long long tempCorrido;//Variável para o tempo decorrido
  tempCorrido = millis() - tempoInicio + tempoAcumulado;//Calculo do tempo decorrido, ou seja a diferença entre a primeira leitura e a segunda, além do tempo acumulado(se tiver)
  segundo = tempCorrido / 1000;//Ajuste do tempo para segundo
  minuto = segundo / 60;//Ajuste do tempo para minuto
  segundo = segundo - minuto * 60;//Reajuste do tempo para segundo, em relação aos minutos
  hora = segundo / 3600;//Ajuste do tempo para hora
  minuto = minuto - hora *60;//Reajuste do tempo para minuto, em relação às horas
 }
}
void mostraDisplay(){
 long temp = timer[0]*3600 + timer[1]*60 + timer[2] - segundo - minuto * 60 - hora * 3600;//tempo que falta
 if(temp == tempAnt)return;//Se o tempo decorrido for igual ao anterior, o programa retorna ao início, pois não é necessário atualizar os dados o display
 tempAnt = temp;//O tempo decorrido será armazenado na variável tempoAnt
 byte horaF, minutoF, segundoF;//Variável para serem atribuídos o tempo que falta
 lcd.clear();//Limpa o display
 horaF = temp/3600;//Ajuste do tempo pra hora
 if(horaF < 10)lcd.print('0');//Deixa sempre o tempo com dois algarismos pra unidade de tempo em questão
 lcd.print(horaF);//Quantidade de horas que falta
 lcd.print(':');//Símbolo para a separacão das unidades de tempo
 minutoF = (temp - horaF * 3600) / 60;//Ajuste do tempo pra minuto
 if(minutoF < 10)lcd.print('0');//Deixa sempre o tempo com dois algarismos pra unidade de tempo em questão
 lcd.print(minutoF);//Quantidade de minutos que falta
 lcd.print(':');//Símbolo para a separacão das unidades de tempo
 segundoF = temp - horaF * 3600 - minutoF * 60;//Ajuste do tempo pra segundo
 if(segundoF < 10)lcd.print('0');//Deixa sempre o tempo com dois algarismos pra unidade de tempo em questão
 lcd.print(segundoF);//Quantidade de segundos que falta
}
void alarme(){
 if(tempAnt == 0){//Se o tempo da contagem regressiva chegar a zero, roda o bloco abaixo
  estado = alarmando;//O estado passa para a condição 3
 }
 if(estado == alarmando){
  tone(buzzer, 1500);//Buzzer ativado com uma frequência de 1500Hz
  delay(50);
  tone(buzzer, 1500);//Buzzer ativado com uma frequência de 1500Hz
  delay(200);
 }else{
   noTone(buzzer);//Desliga o buzzer
 }
}

//PROGRAMA PRINCIPAL
void loop() {
checaEstado();//Checagem dos estados
temporizador();//Ajuste do temporizador
mostraDisplay();//Apresentação no display
alarme();//Sinalização pelo buzzer
debug();//Verificação pelo monitor serial  
}
Paulo Augusto Batista
Paulo Augusto Batista
Admin
Mensagens : 5798
Data de inscrição : 11/02/2019
Idade : 53
Escola : Colegio Lindaura
https://roboticalivre.forumeiros.com

Exercício 4.19 Empty Re: Exercício 4.19

Qua Abr 27, 2022 11:28 pm
Muito bom Thiago, nota 10.0
Ir para o topo
Permissões neste sub-fórum
Não podes responder a tópicos