Olá, estou fazendo no meu trabalho um acionamento, através de um sensor ativar um elevador para levar o material a operadora, porém eu gostaria de que toda vez que o sensor acionasse levasse 3 segundos para o loop começar.
eu fiz desse jeito: if (digitalRead(Sw1) == HIGH && (millis() == 3000) ) {
mas desse jeito ele está acionando após os 3 segundos que o arduino é ligado e se eu clicar ate os 3 segundos.
Eu quero que toda vez demore 3 segundos com o sensor acionado para o loop começar caso o sensor é ativado por menos de 3 segundos não aconteça nada. Peço ajuda por favor.
Tags:
Olá Lucas Rubim, tudo bem?
Muitas vezes, com o código disponível e uma simples imagem feita no paint (com as ligações), os colegas irão gastar de 30 segundos a 5 minutos para te fornecer uma resposta muito mais precisa, entretanto, com ausência de informação (código e imagem), os mesmos colegas gastariam de 30 minutos a 10horas ou dias, pois estes terão que adivinhar possíveis problemas que você tenha, e ai já viu né?
Só vou poder falar pelo que você forneceu de informação.
A função millis() é responsável por registrar o tempo total em que o programa do arduino está rodando (em ms), ou seja, se você deixar o arduino ligado por 10 segundos, e colocar um Serial.print(millis()) no instante absoluto, ele irá imprimir "10000" na serial. Só isso. O millis() não faz mais NADA além disso. (Link de referência aqui)
Então veja a sua linha:
if (digitalRead(Sw1) == HIGH && (millis() == 3000) )
Numa leitura popular o seu código diz isso:
'Se o pino "Sw1" for alto, e tiver EXATAMENTE (nem mais, nem menos) 3 segundos que o "arduino está ligado"...'
aparentemente, não é isso que você quer.
Talvez você posar usar o delay() para simplificar as coisas por ai, mas é só um chute.
Com as informações que você forneceu, é o máximo que posso fazer. Caso precise de mais informações, sugiro que poste o código completo e uma imagem qualquer do circuito.
Forte abraço.
Att. Tiago Mercês Silva
Se quiser obter um "delay" com o millis(), então deve fazer calculos com ele. Exemplo:
unsigned long refMillis;
if (millis() - refMillis >= 3000){
// acontecimento após 3 segundos
refMillis = millis();
}
Explicando o código:
unsigned long refMillis;
Declaração da variável que será responsável por armazenar o valor de millis() no instante "X".
if (millis() - refMillis >= 3000){
Leitura: Se o tempo total desde que o programa iniciou (millis()), menos o valor armazenado do ultimo tempo (refMillis), é maior ou igual a 3 segundos (3000ms) ?
refMillis = millis();
Atualiza a variável responsável por armazenar o ultimo tempo medido, igualando-a ao valor atual de millis().
Agora vamos para a prática deste código.
Imagine que millis() possui o valor de 12345, então ele irá comparar com o valor atual de refMillis. Se a ultima variável for zero, então ficará:
if (millis() - refMillis >= 3000)
if (12345 - 0 >= 3000)
if (12345 >= 3000)
if (true)
Neste momento, fazemos nossa ação no "// acontecimento após 3 segundos", em seguida devemos atualizar o valor de refMillis. refMillis = millis();
E agora? o que acontecerá? a nova chamada ficará assim:
if (millis() - refMillis >= 3000)
if (12345 - 12345 >= 3000)
if (0 >= 3000)
if (false)
1 segundo depois o valor de millis() será 13345, pois 12345 + 1000 (1 segundo) será 13345, então... 13345 - 12345 = 1000. Entretanto, 1000 é menor que 3000, logo retornará falso.
1 segundo depois 14345.
14345 - 12345 => 2000, ainda é inferior a 3000.
1 segundo depois, será 15345.
15345 - 12345 ==> 3000. Ou seja, fechará exatos 3 segundos. Então retornará "verdadeiro"
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por