Boa tarde, sou iniciante em arduino e estou desenvolvendo um dispenser de medicamentos automatizado, um projeto que consiste em: o usuário ajusta as horas e minutos de cada alarme através de botões (são 4 alarmes para cada um dos 5 medicamentos) e ativa ou desativa. Se o valor do módulo RTC for igual ao valor das variáveis ajustadas pelo usuário do protótipo, um motor de passo é acionado e rotaciona uma tampa de plástico com um orifício, assim a pessoa consegue pegar apenas o medicamento correto, sem confusões.
Meu problema, está na linha de código que compara os valores do RTC com os valores das variáveis:
if (horas == horam1a1 && minutos == minutom1a1 && segundos == 0 && ativam1a1 == 1 )
{
motormed1(1);
}
No código que fiz até o momento (arquivo em anexo), programei apenas para dois alarmes, ambos do Medicamento 1.
Solução do problema: a comparação estava o ocorrendo dentro de uma função(void med1alarme1()), portanto, essa função só é chamada quando você entra no menu para configurar o horário do alarme. Visto que esse era o problema, coloquei a comparação dos valores no loop, assim, os valores foram comparados a todo momento. Agora o protótipo está concluído!
Tags:
Não tive como testar aqui, mas suspeito que o problema tenha relação com "precedencia".
A precedencia é a ordem em que as coisas são feitas. Por ex. Numa conta vc faz primeiro as multiplicações e depois a soma.
Em C os comandos "==" e "&&" tem qual precedencia ?? Precisa conferir.
Recomendo resolver a duvida sem nem pesquisar, colocando parentesis.
Algo como:
if ((horas == horam1a1) && (minutos == minutom1a1) && (segundos == 0) && (ativam1a1 == 1 )) // comparação do valor do rtc com a variável
Outra coisa: Vc tem delay()... O delay para a programação. Será que não está parando justo no momento em que o relogio pula esse segundo ?
Melhor dar um jeito de tirar esse delay (fazer diferente), por ex colocando um contador de tempo. Quando chegar o tempo certo vc faz certas coisas como atualizar o display mas no tempo que não é o certo faz todo o resto sempre, como ler teclado, verificar alarme, etc. Isso faz milhares de vezes por segundo. Só o display que faz 2x por segundo.
ref:
https://msdn.microsoft.com/pt-br/library/126fe14k.aspx
http://www.enseignement.polytechnique.fr/informatique/INF478/docs/C...
Veja que pelas referencias citadas estaria ok, mas... Não são para o compilador do Arduino.
Muito obrigado, colega! Substituirei os delays para que não haja mais nenhum imprevisto.
Amigo, num projeto desse aí, evite condicionar os segundos, pois por conta de 1 segundo a coisa pode não funcionar. Considere apenas hora e minuto, e verifique se naquele minuto a porta já abriu para não ficar tentando abrir de novo no mesmo minuto. Abraços
Obrigado pela dica, utilizei nesse caso para que as funções ocorram exatamente no horário programado. Tanto é que no projeto não tem ajuste de segundos no alarme (seria praticamente inútil), apenas pega o valor do RTC para fazer a comparação.
Bom dia,
Ao meu ver a linha de código correta seria :
if((horas == horam1a1) && (minutos == minutom1a1) && (segundos == 0) && (ativam1a1 == 1)){
motormed1(1);
}
Não me lembro ao nome que se da quando utilizamos "&&" que depende de vários valores para aquilo acontecer... Exclusividade, procedência, dependência.. Acredito que esteja relacionado a operadores lógicos do circuito. Só pode acontecer determinada coisa se aquela for verdadeira (segue essa lógica). Eu relaciono isso de vez em quando a portas digitais/tabela verdade...
OBS: Evite utilizar segundos, você não acha que a partir das horas e minutos já não é o suficiente para o sistema funcionar?
Espero ter ajudado, abraços!
Muito obrigado! Estudarei melhor essas operações lógicas do código para futuros implementos!
De nada, qualquer coisa manda as ordens!
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por