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!

Exibições: 538

Anexos

Responder esta

Respostas a este tópico

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!

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço