Capítulo IV – Desenvolvimento do Protótipo
4.4.3.5. Código do Módulo Adaptador
O módulo adaptador tem um funcionamento semelhante ao do módulo dispensador, no entanto, neste módulo, as configurações das tomas são efetuadas de X em X horas e não de forma livre. Também não existem mecanismos de verificação do sucesso da toma, pelo que possui um funcionamento mais simples.
Inicialmente, e à semelhança do módulo dispensador, o sistema aguarda pelo momento (hora e minuto) em que a toma se realiza. Assim que os valores do tempo atual, provenientes do RTC, coincide com os valores das variáveis responsáveis por indicarem o momento da toma do módulo adaptador, o programa entra num trecho de código. Neste, inicialmente é dada a indicação de que os alertas podem ser lançados e, à semelhança do módulo dispensador, são efetuados cálculos que permitem determinar o momento em que os alertas devem ser cessados.
//Executa assim que chega o momento da toma
if((myRTC.hours == tomaHoraA && myRTC.minutes == tomaMinutoA) && estadoLedA == 0) {
//Permite que o código dos alertas do módulo correspondente seja
executado
estadoLedA = 1;
//Define o momento em que os alertas são interrompidos
momentoDesligaLedMinuto = tomaMinutoA + tempoDesligaAlarmesA;
//Implementa a mudança de hora
if(momentoDesligaLedMinuto < 60) { momentoDesligaLedHora = tomaHoraA; } else {
momentoDesligaLedMinuto = momentoDesligaLedMinuto - 60; momentoDesligaLedHora = tomaHoraA + 1;
//Implementa a mudança de dia if(momentoDesligaLedHora == 24) { momentoDesligaLedHora = 0; }
} }
Após ser dada a indicação de que os alertas do módulo adaptador podem ser emitidos, a execução entra num trecho que simplesmente liga o LED verde e a buzina, de forma intermitente. Estes alertas são emitidos até que o tempo de duração definido nas configurações
das tomas termine, ou que o utilizador pressione o botão de pressão, interrompendo instantaneamente os alarmes.
if(estadoLedA == 0) {
digitalWrite(ledVerdeMA,LOW); digitalWrite(buzzer,LOW);
//Emite os alertas do módulo adaptador
} else if(estadoLedA == 1 && alarmesDesligadosUtilizador == 0) { digitalWrite(ledVerdeMA,HIGH); digitalWrite(buzzer,HIGH); delay(500); digitalWrite(ledVerdeMA,LOW); digitalWrite(buzzer,LOW); delay(750);
//Caso o botão de pressão seja pressionado, desliga os alertas do
módulo adaptador
if(digitalRead(botaoPressao) == LOW) { alarmesDesligadosUtilizador = 1; }
}
Assim que tiver decorrido o tempo calculado anteriormente, uma condição que especifica que o tempo atual é igual ao tempo em que os alertas do módulo adaptador são cessados é satisfeita e, deste modo, a execução passa para um novo bloco de código. Neste trecho é contabilizada uma dose e os alertas são cessados. Visto que, para este módulo, foi utilizada o regime de tomas de X em X horas, é necessário determinar qual o horário para a próxima toma. Para isso, é retirado o valor definido nas configurações da toma para o intervalo de tempo até à próxima toma. Com a soma deste valor ao valor da hora da última toma, é possível verificar a nova hora a que deve ser realizada a próxima toma. Este processo é contínuo e realizado de forma indefinida enquanto o módulo se encontrar em utilização.
//Quando chega o momento de interromper os alertas, executa este trecho
else if(myRTC.hours == momentoDesligaLedHora && myRTC.minutes == momentoDesligaLedMinuto && estadoLedA == 1) {
numAlertasA++; //Reinicia as variáveis momentoDesligaLedHora = 0; momentoDesligaLedMinuto = 0; alarmesDesligadosUtilizador = 0;
//Atualiza os dados da próxima toma
tomaMinutoA = tomaMinutoA;
tomaHoraA = tomaHoraA + tomaHoraEmHora;
//Implementa a mudança de dia
if(tomaHoraA >= 24) { tomaHoraA = tomaHoraA - 24; } estadoLedA = 0; }
4.5. Nota Conclusiva
Após a leitura deste Capítulo, pode-se concluir que o protótipo foi desenvolvido com êxito, seguindo a estrutura e a arquitetura idealizadas no Capítulo anterior.
Foram necessárias várias tentativas e correções para se culminar num protótipo funcional. Inicialmente, existiu a necessidade de corrigir as imperfeições da estrutura física do dispositivo resultantes dos defeitos da impressão, no entanto, conseguiu-se ultrapassar as limitações e defeitos existentes no início, obtendo-se, assim, uma estrutura física aceitavelmente coesa.
Após isso, foi efetuada a montagem dos periféricos e a sua respetiva ligação ao Arduino. Durante este processo surgiu uma dificuldade acrescida uma vez que houve a necessidade de arranjar solução para que os periféricos ficassem presos à estrutura e para que os fios e cabos de ligação não se desencaixassem do Arduino durante o manuseamento do dispensador. Foi também necessário um processo de testes de tentativa-erro para garantir que todas as ligações e os respetivos periféricos se encontravam em pleno funcionamento e estáveis.
Com toda a estrutura mecânica preparada, foi possível desenvolver o código que especifica o comportamento do dispositivo. O mesmo foi redigido de modo a facilitar o trabalho futuro de integração de mais módulos e da base de dados. Surgiram, inicialmente, dificuldades relativamente ao consumo energético do sistema, o que comprometia a autonomia do dispositivo sendo pois, que ao final de algum tempo, o dispositivo se reiniciava por falta de energia, tornando a sua utilização inviável uma vez que perdia a capacidade de realizar as dispensas de forma adequada. Desta forma, houve necessidade de implementar mecanismos
que permitissem reduzir a quantidade de processamento efetuada e, com isto, proporcionar uma redução do consumo energético. O código que implementa o funcionamento do dispositivo foi desenvolvido com sucesso, sendo que, após as alterações necessárias, o dispensador comportava-se da forma pretendida. O processo de desenvolvimento decorreu em simultâneo à realização de testes ao sistema. Foram simuladas várias situações que, de alguma forma, pudessem quebrar a estrutura programada originando, assim, erros de execução. Foram introduzidas as validações necessárias para contornar o surgimento destes problemas. Apesar de ser impossível garantir que não possa surgir nenhum erro ou incoerência na execução do programa, existiu o cuidado de tentar reduzir ao máximo a probabilidade das suas ocorrências. É de referir que a arquitetura estipulada, assim como os materiais e componentes utilizados, foram escolhidos tendo em vista o desenvolvimento de um protótipo simples e fácil de utilizar e interpretar por qualquer pessoa.
Embora o protótipo não esteja perfeito, este revela-se funcional, demonstrando bons indicadores e potencialidades de melhoria para o futuro. É então possível concluir que esta etapa foi efetuada com bastante êxito. Agora, é necessária a realização de testes de usabilidade, de forma a validar a sua utilização em ambiente real.