Saudações! Gostaria de fazer um projeto usando um led e um sensor de luminosidade, de forma que o led fosse ligado quando o sensor registrasse determinado valor, equivalente a um ambiente escuro. Até aqui não há dificuldade. Ocorre que depois de ligado, desejo que o led desligue sozinho depois de 30 segundos. Para isso é necessário fazer um contador, acredito que através da função millis(), a fim de calcular o tempo em que o led permanece aceso. No entanto, já tentei fazer isso de diversas formas e ainda não obtive êxito. Alguém pode me ajudar com esse código? Desde já agradeço.

Exibições: 17234

Responder esta

Respostas a este tópico

de uma olhada no exemplo unbounce button without delay

#define PIN_LAMPAGA 3

#define PIN_LDR A1

unsigned long Inicio;

byte contando = false;

void setup()

{

}

void loop()

{

if (analogRead(PIN_LDR) < 200 and !Contando)

{

contando = true;

Inicio = millis();

digitalWrite(PIN_LAMPADA, HIGH);

if (((millis() - inicio) > 30000) and Contando))

{

    contando = false;

    digitalWrite(PIN_LAMPAGA, LOW);

}

}

Obrigado pela resposta Marcelo!

Como não tenho formação na área, encontro dificuldades em linguagem de programação. E baseado no seu código, fiz algumas adaptações e obtive um efeito muito semelhante do que eu desejava. Isso porque, quando o sensor de luz detecta um ambiente escuro, o led acende, mas permanece assim definitivamente, ao contrário de ficar ligado apenas 30 segundos como queria. O interessante é que quando o ambiente passa a ser outro, deixando de ser escuro, aí sim o led apaga após o tempo programado, ao invés de apagar imediatamente.

Não sei se fiz algo errado. Por isso, para facilitar a identificação de qualquer erro, abaixo cito o código que utilizei no projeto. Peço humildemente para que também me esclareça o objetivo da variável "contando" e a razão de ser a mesma declarada inicialmente como "false". Mais uma vez lhe agradeço.

 

const int led = 13;
const int LDR = 0;
int ValorLDR = 0;
unsigned long inicio;
byte contando = false;

void setup() {
  pinMode(led, OUTPUT);
}

void loop() {
  ValorLDR = analogRead(LDR);
  if (ValorLDR < 200 && !contando) {
    contando = true;
    inicio = millis();
    digitalWrite(led, HIGH);
  }
  if (((millis() - inicio > 30000) && contando)) {
    contando = false;
    digitalWrite(led, LOW);
  }
}

boolean ativa = false;            //digamos que essa variavel liga e desliga o led  

unsigned long tempo = 0;

void loop()

{

 if (ativa == true)

{

   tempo=millis();                //pega o tempo

   digitalwrite(led,high);       //escreve a saida alta

   ativa=false;                    //finaliza if

}

 if (millis() > tempo+30000))          //  compara se passou 30 segundo

{

   digitalwrite(led,low);                  //escreve baixo na saida

}

}

Obrigado pela resposta SuperTec!

Como não tenho muita familiaridade com linguagem de programação, tenho dificuldade para entender algumas coisas. Assim, se for possível, queria entender melhor o motivo da variável "ativa" ser declarada inicialmente como "false" e, posteriormente, no void loop(), ser novamente declarada como "false".

Além disso, se fosse usado um sensor de luz no projeto, como ficaria o código se a variável "ativa" fosse substituída por "ValorLDR"? Mudaria muita coisa em relação ao seu código?

Opa!

Tudo bem!?

É possível fazer laços de repetição com a função millis()?

Para ser mais preciso......!

A função millis() aceita ser inserida em laços de repetição ou deve ser feito laços de repetição dentro do millis()?

Usando o delay() eu consegui montar laços para executar repetições finitas, sem nenhum inconveniente, porém quando tento fazer o mesmo usando o millis() ou o laço é ignorado ou trava o loop() e ação em se inicia!

No seu exemplo como seria a forma do laço para repetir a ação de acender o led por 10 vezes?

Haveria problemas e fazer um laço desse laço, tipo uma replicata desse processo?

Uhmm.... e uma última dúvida estou procurando uma forma de separar a execução dos componentes dentro do ciclo de tempo, mas não consegui ter nenhuma ideia e não achei nada relacionado nos fóruns que percorri!

Para exemplificar, no seu exemplo, caso houvesse três leds sendo que a cada 30 segundos fosse necessário  um se a pague o outro se acenda.

Como ficaria esse laço?

Aff.... estou penando para achar uma alternativa para o delay().

Falou a todos!

Diogo boa noite.

Encontrei um exemplo de utilização de millis e adaptei com a utilização de para 3 led e 1 buzzer funcionando ao mesmo tempo.Este exemplo funciona perfeitamente.

Segue o código:

#define Led1 13
#define Led2 8
#define Led3 7
#define Apito 12
int Led1State = LOW; //Estado inicial dos leds
int Led2State = LOW;
int Led3State = LOW;
int BuzzerState = LOW;
long previousMillis1 = 0;// Variáveis de controle do tempo
long previousMillis2 = 0;
long previousMillis3 = 0;
long previousBuzzerMillis = 0;
long Led1Interval = 1000;// Tempos em ms do intervalo a ser executado
long Led2Interval = 200;
long Led3Interval = 450;
long BuzzerInterval = 100;
void setup ()
{
pinMode(Apito,OUTPUT);
pinMode(Led1,OUTPUT);
pinMode(Led2,OUTPUT);
pinMode(Led3,OUTPUT);
}
void loop()
{
unsigned long currentMillis1 = millis();//Tempo atual em ms

//Lógica de verificação do tempo
if (currentMillis1 - previousMillis1 > Led1Interval) {
previousMillis1 = currentMillis1;// Salva o tempo atual
//E aqui muda o estado do led1
//verificando como ele estava anteriormente
if (Led1State == LOW) {
Led1State = HIGH;
} else {
Led1State = LOW;
}

digitalWrite(Led1, Led1State);
}
unsigned long currentMillis2 = millis();//Tempo atual em ms

//Lógica de verificação do tempo
if (currentMillis2 - previousMillis2 > Led2Interval) {
previousMillis2 = currentMillis2;// Salva o tempo atual

//E aqui muda o estado do led2
//verificando como ele estava anteriormente
if (Led2State == LOW) {
Led2State = HIGH;
} else {
Led2State = LOW;
}

digitalWrite(Led2, Led2State);
}
unsigned long currentMillis3 = millis(); //Tempo atual em ms

//Lógica de verificação do tempo
if (currentMillis3 - previousMillis3 > Led3Interval) {
previousMillis3 = currentMillis3; // Salva o tempo atual

//E aqui muda o estado do led3
//verificando como ele estava anteriormente
if (Led3State == LOW) {
Led3State = HIGH;
} else {
Led3State = LOW;
}

digitalWrite(Led3, Led3State);
}
unsigned long currentBuzzerMillis= millis(); //Tempo atual em ms

//Lógica de verificação do tempo
if (currentBuzzerMillis - previousBuzzerMillis > BuzzerInterval) {
previousBuzzerMillis = currentBuzzerMillis; // Salva o tempo atual

//E aqui muda o estado do buzzer
//verificando como ele estava anteriormente
if (BuzzerState == LOW) {
BuzzerState = HIGH;
} else {
BuzzerState = LOW;
}

digitalWrite(Apito, BuzzerState);
}
}

Este código foi uma adaptação do link abaixo:

http://forum.fazedores.com/t/usando-a-funcao-millis-ao-inves-do-del...

Steffen, bom dia.

os códigos do Marcelo e do SuperTec funcionam ok.

Não testei o code do Sergio.

Se estiver ok para voce, coloque resolvido no inicio do titulo.

Assim estára ajudando outros garajistas.

Rui

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço