ModuloArduino
Módulo Arduino - IFSPresente
Loading...
Searching...
No Matches
CristalLiq-serial.ino File Reference

O Arduino Nano gerencia a exibição no Display de quatro linhas, o acionamento do buzzer e o ajuste e leitura do RTC. More...

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include "frame.h"
Include dependency graph for CristalLiq-serial.ino:

Classes

struct  ProtocolMessage
 Representa a decodificação de uma mensagem recebida. More...
 
struct  Display
 Representa o estado de uma linha do display LCD. More...
 

Macros

Códigos de Mensagens do Protocolo.

Constantes usadas na comunicação serial com a TV-Box.

Cada constante representa um tipo de mensagem disparada pelo master (TV-Box).

#define PING   100
 
#define TIME   200
 
#define LECTURE_NAME   300
 
#define SPEAKER   400
 
#define ATTENDEE   500
 
#define SUCCESS   600
 
#define FAIL   601
 
#define SETTIME   700
 
#define GETTIME   701
 
Macros de controle dos dispositivos.

Constantes usadas para I2C e controles adicionais.

Essas constantes são relacionadas aos endereços I2C e demais ajustes sobre os dispositivos externos.

#define BUZZER   2
 
#define COL   20
 
#define ROW   4
 
#define ADDRESS   0x27
 
#define DISPLAY_UPDATE_DELAY   500
 
#define LOOP_DELAY   10
 
#define KEEP_AT_ZERO   1
 
#define KEEP_AT_LAST   1
 

Functions

LiquidCrystal_I2C lcd (ADDRESS, COL, ROW)
 
void copiaN (char dest[], int sizeDest, char origem[], int sizeOrigem, int start)
 Copia um trecho de uma string de origem para um buffer de destino, ajustando posição inicial e preenchendo com espaços em branco, se necessário.
 
void atualizaDisplay (int lines)
 Atualiza o conteúdo exibido no display LCD linha a linha.
 
void parseMessage ()
 Interpreta a mensagem recebida pela serial USB e atualiza a estrutura global netMessage.
 
void setup ()
 Configuração inicial do sistema Arduino.
 
void loop ()
 Loop principal do firmware.
 

Variables

ProtocolMessage netMessage
 Mantém uma única mensagem recebida.
 
Display dispArray [ROW]
 Informações para as quatro linhas do Display.
 
const char * VERSION = "1.0"
 Versão do firmware.
 
char strReply [MAX_STRING+1]
 
char auxStr [MAX_STRING+1]
 
unsigned long uptime
 Tempo em que o Arduino está ligado em milissegundos.
 
RTC_DS3231 rtc
 
DateTime now
 
SerialProtocol usbProto
 Classe que implementa a transmissão e recepção de quadros pela serial sobre USB.
 

Detailed Description

O Arduino Nano gerencia a exibição no Display de quatro linhas, o acionamento do buzzer e o ajuste e leitura do RTC.

O Arduino Nano comunica-se por via serial sobre USB com a TV-Box. O protocolo de comunicação está na classe SerialProtocol. São mensagens de quadro encapsuladas com os caracteres '<' e '>'. No interior do quadro é possível usar o caracter de escape para: '<', '>' e '\'. A semântica das mensagens é específica para a aplicação IFSPresente. Há nove tipos de mensagens emitidas pela TV-Box.

  • <100|0|0> → PING
  • <200|TEXTO|TIMEOUT> → TIME (Linha 0, para sala, data e hora)
  • <300|TEXTO|TIMEOUT> → LECTURE_NAME (Linha 1, para nome da palestra)
  • <400|TEXTO|TIMEOUT> → SPEAKER (Linha 2, para nome do palestrante)
  • <500|TEXTO|TIEMOUT> → ATTENDEE (Linha 3, aponta participante registrado
  • <600|0|0> → SUCCESS (Beep de sucesso no registro)
  • <601|0|0> → FAIL (Beep de falha no registro)
  • <700|YYYY:MM:DD:HH:MM:SS|0> → SETTIME (Define a hora do RTC)
  • <701|0|0> → GETTIME (Recebe a hora do RTC, além da temperatura)

O Arduino responde com três tipos de mensagens.

  • <001|uptime em milissegundos|versão de firmware> → Resposta ao ping
  • <003|YYYY:MM:DD:HH:MM:SS|temperatura> → Resposta ao gettime
  • <002|OK|> → Resposta aos demais comandos

Outras aplicações podem definir outros modelos de mensagens nos quadros do protocolo.

Macro Definition Documentation

◆ ADDRESS

#define ADDRESS   0x27

Serve para definir o endereço do display.

◆ ATTENDEE

#define ATTENDEE   500

Linha 3: estudante que aponta sua presença.

◆ BUZZER

#define BUZZER   2

Pino digital ligado ao buzzer.

◆ COL

#define COL   20

Serve para definir o numero de colunas do display utilizado.

◆ DISPLAY_UPDATE_DELAY

#define DISPLAY_UPDATE_DELAY   500

Tempo em milissegundos em que um texto é exibido numa linha do display antes de sofrer scroll.

◆ FAIL

#define FAIL   601

Beep de falha no registro, seja por leitor biométrico de digital ou por senha no teclado numérico.

◆ GETTIME

#define GETTIME   701

Comando para solicitar data/hora do RTC ligado ao Arduino, além da temperatura.

◆ KEEP_AT_LAST

#define KEEP_AT_LAST   1

Quando um texto é exibido numa linha do display, deve ficar um tempo a mais antes de reiniciar o scroll.

◆ KEEP_AT_ZERO

#define KEEP_AT_ZERO   1

Quando um texto é exibido numa linha do display, deve ficar um tempo a mais antes de iniciar o scroll.

◆ LECTURE_NAME

#define LECTURE_NAME   300

Linha 1: nome da palestra.

◆ LOOP_DELAY

#define LOOP_DELAY   10

Tempo em que o loop principal do código do Arduino dorme à espera de uma mensagem.

◆ PING

#define PING   100

Obtém o timestamp do uptime e a versão do firmware.

◆ ROW

#define ROW   4

Serve para definir o numero de linhas do display utilizado.

◆ SETTIME

#define SETTIME   700

Comando para ajustar data/hora do RTC ligado ao Arduino.

◆ SPEAKER

#define SPEAKER   400

Linha 2: nome do professor responsável pela aula em curso.

◆ SUCCESS

#define SUCCESS   600

Beep de sucesso no registro, seja por leitor biométrico de digital ou por senha no teclado numérico.

◆ TIME

#define TIME   200

Linha 0: sala, data e hora.

Function Documentation

◆ atualizaDisplay()

void atualizaDisplay ( int  lines)

Atualiza o conteúdo exibido no display LCD linha a linha.

Esta função gerencia a exibição de mensagens no display, considerando:

  • Tempo mínimo entre atualizações (usando millis() e DISPLAY_UPDATE_DELAY).
  • Mensagens temporárias (TTL): quando expiram, voltam para a mensagem padrão.
  • Rolagem horizontal (scroll): caso a mensagem seja maior que o número de colunas (COL), realiza deslocamento progressivo, mantendo o início por alguns ciclos (KEEP_AT_ZERO) antes de avançar.

O comportamento difere conforme a mensagem ativa:

  • Se dispArray[i].TTL expirou → mostra defaultMessage com rolagem.
  • Caso contrário → mostra message com rolagem.
Parameters
[in]linesÍndice da linha a ser atualizada:
  • -1 → atualiza todas as linhas, para efeito de rolagem horizontal, então faz a cada DISPLAY_UPDATE_DELAY milissegundos.
  • 0..ROW-1 → atualiza apenas a linha especificada e faz automaticamente independentemente de DISPLAY_UPDATE_DELAY ter expirado, alcançando boa responsividade.
Note
  • Usa copiaN() para preencher o buffer de exibição (toPrint).
  • Usa o estado da máquina (usbProto.machState) para evitar atualizações durante recepção de dados.
  • O cursor do LCD é posicionado no início de cada linha (lcd.setCursor(0,i)).

Regras de rolagem

  • Quando startPosition == 0, mantém a mensagem parada por KEEP_AT_ZERO ciclos.
  • Depois, incrementa startPosition até o limite calculado, com espera em KEEP_AT_LAST no final.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ copiaN()

void copiaN ( char  dest[],
int  sizeDest,
char  origem[],
int  sizeOrigem,
int  start 
)

Copia um trecho de uma string de origem para um buffer de destino, ajustando posição inicial e preenchendo com espaços em branco, se necessário.

Esta função garante que o conteúdo copiado caiba exatamente no tamanho do display (ou outro destino), ajustando o índice inicial (start) caso:

  • A string de origem seja menor ou igual ao destino → começa da posição zero.
  • A string de origem seja maior que o destino, mas o ponto inicial da cópia desejada ultrapasse os limites → recua o início para preencher completamente o destino.

Após a cópia, o restante do buffer de destino é preenchido com espaços em branco, e o finalizador ‘’\0'` é adicionado ao fim.

Parameters
[out]destBuffer de destino (receberá a string copiada).
[in]sizeDestTamanho da string que ficará em dest, número de caracteres visíveis no display. O buffer dest precisa ter pelo menos (sizeDest+1) bytes.
[in]origemString de origem.
[in]sizeOrigemTamanho da string de origem.
[in]startPosição inicial na string de origem a partir da qual a cópia deve começar (pode ser ajustada internamente pelo algoritmo).
Note
Usa min(sizeDest, sizeOrigem) para calcular o máximo de caracteres a copiar. O destino é sempre terminado em ‘’\0'`.

Exemplo de Funcionamento

Detalhamento do Algoritmo
Here is the caller graph for this function:

◆ loop()

void loop ( )

Loop principal do firmware.

O loop() executa continuamente o ciclo de atualização do display, recepção de mensagens da TV-Box e execução dos comandos recebidos.

O comportamento segue o protocolo definido:

  • PING (100): responde com uptime em ms e versão do firmware.
  • TIME (200): atualiza linha 0 (sala, data, hora).
  • LECTURE_NAME (300): atualiza linha 1 (nome da palestra).
  • SPEAKER (400): atualiza linha 2 (nome do professor).
  • ATTENDEE (500): atualiza linha 3 (participante) e força atualização imediata.
  • SUCCESS (600): feedback sonoro curto (registro aceito, pode ser usuário/senha correto ou leitura correta de impressão digital).
  • FAIL (601): feedback sonoro duplo (registro rejeitado).
  • SETTIME (700): Define a data e hora do RTC do Arduino.
  • GETTIME (701): Obtém a data/hora do RTC, além da temperatura em graus Celcius.

Estrutura do loop

  1. Atualiza o display (atualizaDisplay(-1)).
  2. Recebe frame via usbProto.receiveFrame().
  3. Se um frame válido foi recebido (machState == RECEIVED):
    • Chama parseMessage() para decodificar.
    • Executa ação conforme netMessage.code.
    • Responde sempre "002|OK" após comandos de atualização.
    • Atualiza mensagens em dispArray (conteúdo, tamanho, TTL, rolagem).
    • Gera sinais sonoros quando uma digital for lida ou usuário/senha do teclado.
    • Reinicia estado da máquina (machState = START).
    • Reinicia o ciclo (goto CONTINUE) sem esperar o delay.
  4. Se nada foi recebido → aguarda LOOP_DELAY antes do próximo ciclo.
Note
  • O goto CONTINUE garante responsividade, reiniciando o ciclo imediatamente após processar uma mensagem (sem aguardar LOOP_DELAY).
  • O uso de atualizaDisplay(3) no caso ATTENDEE deixa a linha 3 mais responsiva a eventos de digitação no teclado.
  • A comunicação usa usbProto, que mantém a decodificação de um frame recebido.
See also
atualizaDisplay
parseMessage
Here is the call graph for this function:

◆ parseMessage()

void parseMessage ( )

Interpreta a mensagem recebida pela serial USB e atualiza a estrutura global netMessage.

Esta função:

  • Remove os marcadores de acentuação gráfica da string recebida (usbProto.receivedChars).
  • Usa strtok para separar os campos da mensagem, assumindo o caractere | como delimitador.
  • Converte o primeiro campo para um código numérico (netMessage.code).
  • Copia o segundo campo como texto da mensagem (netMessage.message).
  • Converte o terceiro campo em milissegundos para o tempo de vida (netMessage.TTL).
Note
A função não recebe parâmetros nem retorna valor. Atua diretamente sobre as variáveis globais usbProto e netMessage.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ setup()

void setup ( )

Configuração inicial do sistema Arduino.

Esta função é chamada automaticamente pelo framework Arduino logo após o reset ou inicialização da placa. Ela é chamada uma única vez.

Inicializações realizadas:

  • Define o pino do buzzer (BUZZER) como saída.
  • Inicializa o display LCD (lcd.init()).
  • Configura contraste e backlight do display (mas não tem efeito no display que usamos).
  • Desativa autoscroll e cursor piscante.
  • Limpa a tela do display (lcd.clear()).
  • Configura a taxa de comunicação serial (usbProto.setBaudRate(9600)).
  • Ajusta os tamanhos das mensagens padrão em dispArray.
Note
Esta função não recebe parâmetros e não retorna valor. É executada uma única vez antes de loop().
Here is the call graph for this function:

Variable Documentation

◆ dispArray

Display dispArray[ROW]
Initial value:
= {
{"", "IFSPresente", "", 0, 0, 0, KEEP_AT_ZERO, 0},
{"", "Local Disponivel", "", 0, 0, 0, KEEP_AT_ZERO, 0},
{"", "Sem reserva de palestrante", "", 0, 0, 0, KEEP_AT_ZERO, 0},
{"", "Aguardando Registro", "", 0, 0, 0, KEEP_AT_ZERO, 0}
}
#define KEEP_AT_ZERO
Definition CristalLiq-serial.ino:64

Informações para as quatro linhas do Display.

Contém as quatro linhas do display LCD. Cada posição tem:

  • Mensagem atual (message)
  • Mensagem padrão (defaultMessage)
  • Texto a imprimir (toPrint)
  • Tamanho da mensagem (ajustado em setup())
  • Tamanho da mensagem padrão (ajustado em setup())
  • Posição inicial da string a partir da onde imprime no display
  • Tempo de vida (TTL) de impressão da mensagem

Inicialmente preenchido com mensagens padrão do sistema:

  • Linha 0 → "IFSPresente"
  • Linha 1 → "Local Disponivel"
  • Linha 2 → "Sem reserva de palestrante"
  • Linha 3 → "Aguardando Registro"

◆ VERSION

char * VERSION = "1.0"

Versão do firmware.

Note
É retornado junto com o serviço ping.