Estou lendo um sensor DHT22 temperatura e umidade + data e hora com o  sensor DS-3231. 

Quando eu mudo de tela estou utilizando a função DELAY, isso atrasa o programa. 

tentei usar a função Millis mas algo está errado. 

Alguém poderia me ajudar?    

void setup() { //............. TEMPO SETUP

pinMode (Botao, INPUT_PULLUP); // ENTRADA 33 liga led verm direto
pinMode (LedVerde, OUTPUT); // saida para rele 38
pinMode (LedVermelho, OUTPUT); // SAIDA 38 INDICA TEMPO LIGADO
digitalWrite (LedVerde, HIGH);
digitalWrite (LedVermelho, HIGH);
// TEMPERATURA
{

lcd.begin();
lcd.backlight();
Serial.begin(9600);  
lcd.setCursor(0, 0);
lcd.print("Testando o sen-"); 
lcd.setCursor(0, 1);
lcd.print("sor de tempera-"); 


currentMillis = millis();

if(currentMillis - previousMillis >= 5000) {previousMillis = currentMillis; cont++; lcd.clear();}

if(cont > 6){cont = 1;


lcd.setCursor(0, 0);
lcd.print("tura e umidade"); 
lcd.setCursor(0,1);
lcd.print("DHT22!");

}

Exibições: 126

Responder esta

Respostas a este tópico

Bom dia.

Pelo que vi na sua lógica, você está limpando o LCD a cada 5 segundos e imprimindo no lcd a cada 25 segundos, depois quando passar mais cinco segundos limpa novamente e começa tudo de novo.

Acredito que não deva ser isso que você deseje fazer.

Outra coisa que percebi é que (pelo menos pelo trecho de código colado aqui) é que não está inicializando as variáveis previousMIllis e cont. 

Edson explica melhor como deseja que seja o comportamento para fazer a impressão em seu LCD.

Quebre o galho, substitua a função delay por esta:

void myDelay (int ms)
{
   long previousMillis = 0;
   unsigned long currentMillis = millis ();
   if (currentMillis - previousMillis > ms) {
      previousMillis = currentMillis;
   }
}

Só uma pequena observação nesse seu código.

Acho que nesse seu exemplo a variável previousMillis deveria ser global ou do tipo estática, pois da forma que está ai nesse seu exemplo ela sempre será zero.

Talvez deveria ser declarada assim

static long previousMillis = 0; // Ai só seria inicializada uma única vez e guardaria o valor setado abaixo.

Agora deixa sugerir uma forma de fazer um simples delay com apenas uma única variável de controle.

Acho que para um simples "delay" poderia ser feito assim:

// Declara a variável de forma global do tipo unsigned long

unsigned long comparador = 0;

// No loop você faria apenas a comparação:

if ( comparador < millis() ) {

  comparador = millis() + 1000; // Substitua aqui 1000 pelo tempo desejado 

  // Executa aqui o que tem de ser feito ..... 

}

A lógica fica bem simples, consumindo menos memória (utiliza apenas uma variável).

Certo, sua observação é válida, mas a otimização sugerida não.

Aumentou 54 bytes no código compilado.

Se você "engessar" o código com o tempo já predeterminado não poderá reutilizar esta função em outros locais onde necessite de um tempo de espera diferente de 1000.

Este é o motivo de utilizar a variável ms.

Olha agora se pretende utilizar em outros locais, terá de criar uma variável de controle em cada local.

Uma vez que se for utilizar a mesma variável ela será sobreposta pela próxima chamada ao método.

Quanto ao aumento, é estranho.

Para poder utilizar a função genérica você teria de fazer uma parada estilo DELAY.

Mais tarde irei fazer uns testes e posto aqui o resultado.

Nobre, acho que vc me confundiu com o autor da pergunta.

Tenho usado myDelay sem problemas.

Reuso de código é importante em qualquer linguagem por isso que o defendo.

Mas faça uns testes aí e constate, às vezes as coisas mudam de figura na prática.

Tranquilo amigo.

Só que a função tal como está postada não funciona.

Ela é uma função que não retorna nada (tipo void), e não preenche nenhum variável externa, ou seja, da forma como foi postada ai não vi nenhuma forma real de utilizar.

Acredito que utilize com sucesso uma função para tal fim, mais creio que o escopo da função não seja como postou.

Observe:

void myDelay (int ms) // Nunca retorna nada pois o tipo é void
{
   long previousMillis = 0; // O valor sempre iniciará como zero pois está sendo informado para fazer tal, outra coisa é o tipo de dado deveria ser unsigned long e não long
   unsigned long currentMillis = millis (); 
   if (currentMillis - previousMillis > ms) {

      // Acredito que aqui deveria setar algum flag, ou fazer algo qui.
      previousMillis = currentMillis; 
   }
}

Quando eu digo que precisa de uma variável para cada controle de tempo individual é pelo fato de ter algo para comparar com o millis atual, do contrário não teríamos como saber em que hora fazer as coisas. 

Espero que não entenda como crítica, é apenas uma observação espero que construtiva.

Positivo mister, toda observação é válida.

Lembrei de um pequeno detalhe, utilizo esta função em códigos 'multitarefa' no arduino com a lib TimedAction.

Quanto ao retorno da função, realmente não precisa, ele só serve mesmo para atrasar a execução da função/thread onde é chamada.

Como raramente a utilizo em códigos sem a TimedAction, farei uns testes de mesa e postarei o resultado em breve.

Apropos, previousMillis deve ser declarada como unsigned long, vou dar uma 'tunada' nisso também.

Show amigo.

Vou dar uma estudada nessa lib.

Abraço.

amigo sua sugestao foi legal mas não esta funcionando, me parece que isso é um pepino.... 

Valeu 

Ola  meu amigo,  no consigo resolver essa bucha,  será que conseguiria me ajudar? 

to enrolado com o millis no display 

valeu, realmente não funciona  para outros locais, obrigado pela força

RSS

Destaques

Registre-se no
Lab de Garagem
Clicando aqui

Convide um
amigo para fazer
parte

curso gratis de arduino

© 2018   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço