Exercício 4.19
2 participantes
- Thiaguin
- Mensagens : 203
Data de inscrição : 03/03/2020
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
}
* 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
}
Permissões neste sub-fórum
Não podes responder a tópicos