Relatório do Projeto - lucasvribeiro/Projeto-Despertador-Sistemas-Microcontrolados GitHub Wiki
Projeto Despertador-Calculadora
Objetivo
O foco desse projeto foi desenvolver um despertador utilizando a plataforma Arduino, que trabalha em conjunto com um aplicativo Android Serial Bluetooth Terminal, que envia os dados do celular para a porta serial do despertador.
Requisitos do sistema
Para a realização deste projeto, foram necessários cumprir os seguintes pré-requisitos:
- O projeto deve usar um display (7 segmentos, LCD texto, LCD gráfico), o qual é utilizado para mostrar mostrar a conta para que o despertador pare de tocar;
- O projeto deve controlar pelo menos um LED, utilizado para mostrar se já existe algum valor armazendo na memória EEPROM (algum horário para despertar) ;
- O projeto deve fazer beep com um buzer ou um autofalante, o projeto fica apitando pelo buzzer quando der a hora de despertar;
- O projeto deve ter uma modalidade de entrada do tipo botão ou teclado, utilizamos a matriz de botões para que seja possível digitar o resultado da conta para desligar o despertador;
- O projeto deve se comunicar com algum dispositivo (protocolos USART, SPI, e/ou I2C), será utilizado o módulo de tempo real, que utiliza o protocolo I2C;
- O projeto deve logar alguma variável de maneira permanente (EEPROM, MMC Card), é armazedo na EEPROM o horário que o despertador deve ser ligado;
- O projeto deve permitir entradas via porta serial (computador controlando o dispositivo), utilizamos o módulo de bluetooth para enviar para o dispositivo o horário a ser gravado na EEPROM e consequentemente, será o horário para despertar.
Funcionamento
Através do aplicativo Serial Bluetooth Terminal, envia-se o horário que o dispositivo deve despertar, via Bluetooth. Ao fazê-lo, um sinal será enviado para o Módulo Bluetooth do projeto, indicando o horário selecionado. Este horário será salvo na EEPROM do Arduino e, quando o horário selecionado for igual ao horário atual, indicado pelo Módulo RTC, o Módulo Buzzer começará a emitir sons de alarme.
As mensagens para comunicação do dispositivo com o usuário serão exibidas no Display LCD, como a conta, o resultado, mensagem de erro e mensagem de acerto.
Para desligar o alerta do despertador, o usuário deverá responder à três contas corretamente, que será exibida no Display LCD. A conta é gerada randomicamente, utilizando o tempo real como semente. Pode ser uma soma ou multiplicação, com operandos que variam de 1 à 99. O usuário deve digitar o resultado das contas no Teclado Matricial e apertar, ou a tecla '*', ou '#', ou 'A', ou 'B' ou 'C', para confirmar o resultado.
Materiais e Métodos
Para projetar o circuito serão utilizados os seguintes materiais:
- 1 Arduino Mega 2560
- 1 LCD 16x2
- 1 Módulo Buzzer
- 1 Módulo Bluetooth HC-06
- 1 Módulo RTC (Real Time Clock)
- 1 LED 5mm
- 1 Teclado Matricial
- 3 Resistores
- Vários Jumpers
O código do programa foi feito em C++, utilizando o Arduino IDE.
Desenvolvimento
Nesta seção serão apresentados os métodos desenvolvidos para cada atividade do sistema.
No resultado final, os módulos estão intercalados, mas, para o melhor entendimento de cada funcionalidade dos módulos, aqui eles serão explicados separadamente. O sistema Despertador-Calculadora é composto pelos seguintes módulos: Bluetooth, Botões, Buzzer, EEPROM, LCD e RTC.
Módulo Bluetooth
O módulo Bluetooth é o responsável por estabelecer conexão com algum celular que após se conectar com o despertador, poderá enviar um novo horário para despertar. Para utilizar este módulo, sabendo que utiliza uma via serial para comunicação, basta adicionar o comando Serial.begin(9600);
, colocar o pino de Transmissor em um divisor de tensão para que receba 3.3V e ligá-lo na porta TX1<-1 e colocar o Receptor na porta RX0<-0.
A liberação de sinal (Visibilidade para aparelhos) e conexão com algum dispositivo são tratados pelo próprio componente, que por sinal é o modelo HC-06. Contudo, é necessário verificar se algum dispositivo conectado enviou algum dado para o componente, utilizamos o comando: Serial.available() != 0
dentro de um if para fazer essa verificação, caso algum dado seja enviado chamamos a função bluetooth_eeprom()
que salvará na EEPROM a nova hora para despertar.
Módulo Botões
O módulo Botões é quem captura a resposta do usuário para as contas apresentadas pelo despertador. Ele gerencia uma matriz de botões, a qual é ligada ao microcontrolador por jumpers, através das portas 2, 3, 4, 5, 6, 7, 8 e 9. Para fazer esse gerenciamento, utilizamos a biblioteca Keypad.h
.
A função makeKeymap()
faz o mapeamento dos botões do teclado para uma matriz de caracteres, passada por parâmetro. Dessa forma, basta criar uma matriz de caracteres, aqui chamada de matrizteclado
, e passá-la para a função makeKeymap()
que, ao se referenciar alguma caracter dessa matriz, estará sendo referenciado o botão correspondente na matriz de botões.
A matriz de botões é manipulada através da variável teclado
, que é instanciada pelo construtor Keypad
, o qual recebe como parâmetro o mapa de caracteres/teclas, os pinos que representam as linhas, os pinos que representam as colunas, o número de linhas e o número de colunas.
Keypad teclado = Keypad( makeKeymap(matrizteclado), pinoslinhas, pinoscolunas, linhas, colunas );
Para capturar os botões pressionados pelo usuário basta utilizar a função getKey()
. Ela irá retornar o caracter correspondente ao botão apertado, sendo um caracter para cada vez que um botão for pressionado. Então, se ao ser chamada, nenhuma tecla tiver sido apertada, ela não guardará nenhum caracter.
// Verifica se, e qual, tecla foi pressionada
char apertatecla = teclado.getKey();
Módulo Buzzer
O módulo Buzzer é extremamente fácil de manipular, foi utilizada a porta 32 e é ativado quando for a hora de despertar e desativado quando o usuário conseguir resolver as contas. Para ativar o buzzer e torná-lo viável como um componente de saída, setamos através do comando: pinMode(porta_buzzer, OUTPUT);
como saída.
Para ligar o buzzer é utilizada a função tone(porta_buzzer, frequencia)
, e para desligar é utilizado a função noTone(porta_buzzer)
que seta o buzzer com a frequência 0MHz.
Módulo EEPROM
O módulo EEPROM nada mais é do que, a memória não-volátil do próprio Arduíno, para acessá-lo utilizamos a biblioteca EEPROM.h
e o módulo é utilizado de duas formas diferentes:
-
A primeira utilização é com a escrita de dados, quando um valor é enviado por bluetooth é necessário armazená-lo na EEPROM e organizar uma forma de ser possível ler o dado depois, por isso, utilizamos sempre os espaços 0:4 da memória, tamanho necessário para guardar a hora para despertar (HH:mm [tamanho 5]). Para que seja possível escrever utilizamos a função
bluetooth_eeprom()
que, assim como visto anteriormente irá, através da funçãoEEPROM.write(POSIÇÃO_EEPROM, VALOR);
guardar a nova hora para despertar. -
A segunda utilização é a leitura e exibição do horário guardado na memória, utilizamos a função
recebe_horas()
que faz uso da função localEEPROM.read(POSIÇÃO_EEPROM)
e retorna o valor guardado na EEPROM em uma determinada posição. No nosso caso, lemos os 5 primeiros caracteres e armazenamos em uma string local no código, se a string retornar vazia (string == "") desligamos um LED acoplado no projeto pra demonstrar que não nenhum horário guardado para despertar. Caso contrário deixamos o LED ligado informando que em algum momento o despertador irá tocar.
Apesar de não aplicarmos no código atualmente (13/12/2018) existe uma função limpa_eeprom()
que simplesmente limpa a hora guardada na EEMPROM. Contudo, poderá ser utilizada com a evolução do projeto.
Módulo LCD
O módulo LCD é o responsável por exibir as informações ao usuário, como mensagens, as contas e o resultado digitado pelo mesmo. Ele é composto por 2 linhas e 16 colunas. Os pinos utilizados para o componente LCD são 12, 11, 28, 29, 30 e o 31.
Para manipularmos esse componente, utilizamos a variável lcd
. Sua instanciação é feita através do construtor lcd()
, devendo ser passado por parâmetro os pinos a serem utilizados pelo mesmo, como pode ser visto abaixo. Para tanto, faz-se necessário a importação da biblioteca LiquidCrystal.h
.
// Define os pinos que serão utilizados para ligação ao display
LiquidCrystal lcd(12, 11, 28, 29, 30, 31);
Sua inicialização é feita no setup, atravéz da função begin()
, que recebe o número de colunas e linhas.
// Define o número de colunas e linhas do LCD
lcd.begin(16, 2);
Outras funções da biblioteca LiquidCrystal
que foram utilizadas para a implementação do Despertador-Calculadora foram: clear()
, que limpa a tela LCD; setCursor()
, que recebe a coluna e a linha onde o cursor deve ser posicionado para a escrita; e a função print()
, que recebe uma string e imprime a mesma na tela LCD.
// Limpa a tela
lcd.clear();
// Posiciona o cursor na coluna 3, linha 0;
lcd.setCursor(3, 0);
// Envia o texto entre aspas para o LCD
lcd.print("FRANK É LEGAL");
Módulo RTC
Por último mas não menos importante, o módulo RTC(Real Time Clock) é responsável por capturar o tempo atual. No projeto, integramos essa funcionalidade para comparar com a hora guardada para que, quando os dois sejam iguais o despertador comesse a tocar.
A biblioteca utilizada para o RTC foi DS1307.h
e foram colocadas nas portas A4 e A5, ambas analógicas, utilizamos a função DS1307 rtc(A4, A5)
para setar as portas e inicializar a variável rtc que será usada durante o resto do código.
Abaixo temos a configuração para o rct:
rtc.halt(false);
rtc.setSQWRate(SQW_RATE_1);
rtc.enableSQW(true);
Essas configurações são padrão e habilitam o RTC para funcionar corretamente. Pegar a hora atual pelo rtc é utilizado a partir da função:
horaAtual = rtc.getTimeStr();
horaAtual.remove(5, 3);`
onde, horaAtual é uma string que guarda a hora atual com formatação completa (HH:mm:ss), como não utilizamos os segundos no código, fazemos uso da segunda função mostrada acima que retira 3 letras a partir da 5ª posição da string. Resultando em uma variável que guarda a hora (HH:mm) possibilitando a comparação com as horas guardadas na EEPROM.
Despertador
Código disponível aqui. Por fim, para a construção do código do projeto foram utilizadas as seguintes funções:
- void setup (): Função responsável por setar todas os componentes adequadamente;
- void loop (): Função principal que pega hora para despertar da memória e ao mesmo tempo verifica se algum dispositivo foi conectado e, consequentemente, enviou algum novo horário para ser gravado na EEPROM. Após gerenciar as horas para despertar, o programa pega a hora atual pelo RTC e compara os dois, se forem iguais chama a função
despertar ()
; - void despertar (): Função responsável por ligar o buzzer, gerar contas aleatórias, exibir no LCD, receber os dados da Matriz de LED, verificar se está correto ou não e tomar as devidas consequências para a ação;
- void geraConta (): Função que gera uma conta aleatória de adição ou multiplicação utilizando a função:
random(INICIO, FIM)
. PS: Vale lembrar que a aleatoriedade é dada por uma configuração de seed na funçãosetup()
que coloca um valor de ruído da porta analógica A0 pela funçãorandomSeed(analogRead(0))
; - void limpa_eeprom (): Função responsável por limpar os dados da memória EEPROM, para isso, basta escrever em cada posição da memória o caracter 0;
- void recebe_horas (): Função que passa pelas 5 primeiras posições da EEPROM (onde deverá estar a hora para despertar) e guardar em uma variável;
- void bluetooth_eeprom (): Função que recebe dados pela porta serial bluetooth e guarda na memória EEPROM.
Apêndice
Durante a execução do projeto, não houve dificuldades de implementação ou construção do projeto.