Estou tendo uma dúvida que já passou aqui, mas queria além de resolver isso entender a lógica melhor.

No meu código depois que coloquei um solenoide para regar umas plantas da varanda o arduino demora apenas 4h para dar uma resposta por causa de um delay, então se eu converter isso com sua ajuda para milis acho que vou entender melhor, pois me prendi a um valor constante de intervalo, que fica assim:

int ledState = LOW;   
long intervalo = 5000;

void setup()

Queria converter isso aqui.

void setup() {


pinMode(8, OUTPUT); //Declara que o pino 12 do arduino é de Saída. Vai mandar dados, energia...

}


void loop() {


digitalWrite(8, HIGH);  

delay(14400000);


digitalWrite(8, LOW);

delay(5000);

}

desde já eu e minhas plantas agradecem!

Exibições: 1458

Responder esta

Respostas a este tópico

Oi KL, boa tarde.
Não entendi muito bem sua explicação:

" No meu código depois que coloquei um solenoide para regar umas plantas da varanda o arduino demora

apenas 4h para dar uma resposta por causa de um delay, então se eu converter isso com sua ajuda para

milis acho que vou entender melhor, pois me prendi a um valor constante de intervalo"

Ele não demora depois que você colocou o solenoide não. E demora porque você colocou um

delay de 14.400.000mSeg, equivalente à 4 h.

O uso da função mills() à primeira vista parece confuso, mas não é não.

Vamos a ela:

Ao ligar o seu arduino, o valor em um registrador do arduino é iniciado.
Esta contagem é incrementado a cada milissegundo.
Se não desligar ou "resetar" o arduino, este contador conta por +- 50 dias,
(para ser exato: 49D 17H 2Min 47Seg e 295mSeg), (= 0X FF FF FF FF),
e depois volta a zero e inicia a contagem novamente.

Para ler o valor desta contagem criou-se a função "millis()".
Ao chama-la, tem como retorno o valor do contador no momento.

Voce pode simplesmente usa-la para testar seu valor:             Ex: if (millis() > xyz) ....
ou copiar o valor do contador para dentro de uma variável        Ex: abc = millis();
Lembrando que neste caso a variável abc tem que ser uma variável unsigned long, (4 bytes).

Substituindo um delay por millis:

Defina uma variável unsigned long para guardar o valor de millis()      unsigned long abc;

No void setup() coloque o valor de millis() nesta variável,                  abc = millis();

coloque tudo a seguir dento de um,                                                while(true);

Teste se o valor é maior que o tempo que você quer,                      if ((millis() - abc) > ....)

Se for então faça a sua ação que esperou o tempo,
e no inicio da ação faça novamente abc = millis(), isto atualiza o valor de abc,

ou se não for continue outra atividade no seu code, .....

sempre retornar no teste, irá verificar se atingiu novamente o valor,
se não atingiu, executa o resto do code constantemente.

Espero ter ajudado.

Rui

Respondendo, é assim nesse mesmo arduino controlo as lâmpadas e alguns equipamentos por uma interface web, onde depois de colocar esse delay para o solenoide o programa para de responder.

Já tinha encontrado esse código, mas não consegui colocar um tempo diferente entre piscar e apagar, para ser adaptado a minha necessidade. desde já obrigado pela explicação anterior. agora seria só a mudança dos tempos entre esperar e abrir a solenoide.

int ledPin = 13;                // LED conectado ao pino digital 13
int value = LOW;                // último valor do LED
long previousMillis = 0;        // último momento que o LED foi atualizado
long interval = 5000;           // tempo de transição entre estados (milisegundos)

void setup()
{
  pinMode(ledPin, OUTPUT);      // configura o pino digital como saída
}

void loop()
{
  // COLOQUE AQUI o código que precisa rodar todo o tempo

  // veja se é a hora de atualizar o LED; isto é, a diferença
  // entre o tempo atual e o último tempo que piscamos o LED é
  // maior que o tempo de transição entre estados?
  if (millis() - previousMillis > 300) {
    previousMillis = millis();   // lembre-se do último tempo que piscamos o LED

    // se o LED está apagado, acenda-o e vice-versa.
    if (value == LOW)
      value = HIGH;
    else
      value = LOW;

    digitalWrite(ledPin, value);
  }
}

Rui boa tarde

Entendo a dificuldade do Klaus, foi a minha no começo e acho que é uma das dificuldades comum dos inciantes de arduino. 

Delay é facil. MIllis (blink without delay) já é mais complicado....

Em outra discussão, cheguei a comentar que o time do arduino deveria implementar nativamente a função que estou chamando  de delayWdelay...

quer dizer, uma função que colocaria ali e o código não pararia! (como o millis mas de uso mais simples.

imagina se o Klaus pudesse colocar apenas...

digitalWrite(8, HIGH);  

delayWdelay(14400000,0);

{

digitalWrite(8, LOW);

}

}

delayWdelay(5000,1)

{

digitalWrite(8, HIGH);  

};

O que vc acha?

veja a conversa toda aqui: http://labdegaragem.com/forum/topics/sugest-o-produtividade-blink-t...

Oi P, bom dia.

Eu já havia lido este seu comentário.

Acho que seria uma excelente sugestão, mas não tenho ideia do processo para incluir

ou sugerir a inclusão de uma nova função no compilador do Arduino.

O que eu acho que seria mais factível, é alguém com competência (eu não sei fazer), criar 

uma biblioteca que faça esta função.  

Que tal:

   #include <PedrosoTime.h>     

   void loop()

   {

       Pedroso(500);   // Delay de 500mSeg sem para as outras atividades.

   }

Att:

Rui

Rui, se você quiser fazer uma biblioteca "PedrosoTime" por exemplo, crie uma pasta "PedrosoTime" dentro da pasta "libraries" do Arduino.

Ou para criar uma pasta com suas bibliotecas particulares, crie uma pasta "libraries" dentro da pasta onde vc costuma salvar seus sketchs.

Ai, crie a pasta "PedrosoTime" dentro desta nova pasta "libraries".

Na pasta "PedrosoTime" crie dois arquivos - um "PedrosoTime.h" e um "PedrosoTime.cpp". Codifique o que desejar e pronto !! Quando vc chamar:

#include <PedrosoTime.h>

no seu sketch, a IDE Arduno irá localizar e trazer o código de sua biblioteca.

Crie quantas bibliotecas desejar dessa forma.

  Como sou criança ainda no mundo arduino, espero que o tempo ande mais rápido para eu crescer logo e entender mais. Até agora aprendi muita coisa que já dá asas para planejar muita idéia, mas esse millis preciso de entender ele pois acredito que a automação da minha casa teria uma interface mais´rápida sem os delays.

  Então dentro do millis é possível ou não ter tempos distintos como no delay?

Cada vez que vc usa o comando delay(nnn) o arduino "PARA" de processar. Não faz mais nada.

millis() é uma forma de vc temporizar seu programa (sketch) e é a mais fácil, caso não precise de muita performance ou não queira executar muitas coisas simultaneamente.

Mas a coisa começa a melhorar quando você passa a utilizar as interrupções.

O Arduino oferece algumas bibliotecas para interrupção.

Gaste um tempinho aqui:

http://playground.arduino.cc/Code/Code

Não será tempo perdido... veja também o link abaixo:

http://playground.arduino.cc/Main/InterfacingWithHardware

  Pessoal, já estou lendo a dois dias muitos códigos e tutoriais, mas não encontrei algum que não seja de valor constante entre ligado e desligado do pino, se vocês me apontarem um blink com delais distintos substituidos por millis ficaria grato. Rodei em tudo quanto é post aqui do lab pela expressão millis, quando não me responde o código é mais complicado para meu conhecimento atual.

Olha esse exemplo (anexo)

Ou pela IDE do Arduino, abra o exemplo:

File->Examples->Digital->BlinkWithoutDelay.

Anexos

Klaus, 

o que vc precisa é isso , mas vc terá que fazer alguns ajustes e entender o código abaixo antes de testar.

Alguns conceitos são novos para quem está no blink ainda:

mIllis() é como olhar para um cronometro durante a corrida.  para saber o tempo em cada parte da corrida tem que fazer contas...

eu coloquei um marcador para saber se está na hora de ligar ou de desligar. (ele alterna entre HIGH e LOW)

if - é uma condição.[trocadilho a parte: if (quer programar) {saber if}  //humor geek

unsigned long (porque tem alguns números que poderão grandes (como 4horas em milisegundos) , se fosse "int" ele ia se perder. 

você pode  deve estudar cada ponto acima.

[codigo]

unsigned long tempo_inicio=0;
unsigned long tempo_desligado=3000;
unsigned long tempo_ligado=500;
boolean marcador = LOW;


int led = 3;

void setup()

{
pinMode(led, OUTPUT);
}

void loop()

{

     if (marcador==LOW) 
     {
     tempo_inicio=millis();
     marcador=HIGH;
     }

   

     if (millis()-tempo_inicio>=tempo_desligado)
    {
    marcador=LOW;
    digitalWrite(led, HIGH);
    delay(tempo_ligado);
    digitalWrite(led, LOW);
    }
}

  Gente, obrigado pelas respostas, agora tenho um bom norte para estudar e integrar ao meu código, mas isso pode ainda criar novas dúvidas. Meu domingo vai ser bem divertido estudando millis com esse exemplo.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço