Led acendendo toda vez que pressionar o botão por 3 segundos.

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.

Exibições: 188

Responder esta

Respostas a este tópico

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"

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço