Show Posts
Pages: [1] 2 3 ... 6
1  International / Portugues / Re: Ajuda com programação de estufa on: March 19, 2014, 11:15:00 am
Seria isso?

((Tempo em ms / 1000 / 60) % 60)
2  International / Portugues / Re: Ajuda com programação de estufa on: March 18, 2014, 08:12:39 pm
sem o float o tempo mostra apenas os minutos restantes e os segundos não,
assim se por exemplo faltare 0:59 segundos do tempo o lcd vai mostrar apenas o 0
3  International / Portugues / Re: Ajuda com programação de estufa on: March 18, 2014, 03:57:19 pm
Sim.

O teu LCD deve ser actualizado quando:

- houver uma alteração de estado ou... se não te quiseres dar a esse trabalho.
- de segundo a segundo ou com um intervalo maior.

Eu referi isto num post mais atrás...

bubulindo resolvi atualizar segundo a segundo mesmo..

só estou com dificuldade em colocar a contagem de tempo no formato mm:ss

fiz assim

float(time_t - t_restante)/1000/60

só que assim o resultado de 1 minuto é 0.99 > 0.98 até 0.00

como formatar corretamente?
4  International / Portugues / Re: Ajuda com programação de estufa on: March 14, 2014, 04:37:39 pm
bubulindo obrigado pela dica.

consegui resolver o problema agora esta parte esta funcionando como deveria ser..

agora tenho mais 2 dúvidas. 

a contagem esta em millisegundos para mostrar em segundo é só fazer contagem / 1000?

outra coisa, por ser um laço com poucas instruções ele é executado rapidamente então meu lcd esta atualizando muito rapido e piscando muito, como resolver isto?

valeu pessoal
5  International / Portugues / Re: Ajuda com programação de estufa on: March 14, 2014, 09:40:50 am
Me explica o que o StartStatus tem que fazer que a gente já agiliza.

entao cara o StartStatus é uma flag para o botao start/stop

entao eu queria que durante o while se eu apertasse o botão start/stop ele desse um break no laco
6  International / Portugues / Re: Ajuda com programação de estufa on: March 13, 2014, 07:39:42 pm
Seu código original está assim:
Code:
time_t = t *60 *1000;    
    
     if (SaidaStatus == 1 && t > 0) {
      count = millis();
        digitalWrite(Saida_Pin, HIGH); //activa a saida do arduino...
            lcd.clear();
            lcd.setCursor(1, 0 );
            lcd.print(time_t);
        contagem = millis() - count;
            lcd.setCursor(12, 1);
            lcd.print(contagem);
    }
       if (contagem >= time_t){
          digitalWrite(Saida_Pin, LOW); //desactiva a saida...
E você quer que o LCD fique mostrando um tempo, certo? A passagem do tempo deve ocorrer dentro de um laço e, dentro desse laço, você mostra o valor no LCD:
Code:
time_t = t *60 *1000;

if (SaidaStatus == 1 && t > 0) {
    count = millis();
    digitalWrite(Saida_Pin, HIGH); //activa a saida do arduino…

    // fiz o laço abaixo para mostrar o tempo no LCD
    contagem = 0;
    while (contagem < time_t) {
        lcd.clear();
        lcd.setCursor(1, 0);
        lcd.print(time_t);
        contagem = millis() - count;
        lcd.setCursor(12, 1);
        lcd.print(contagem);
    }
}

digitalWrite(Saida_Pin, LOW); //desactiva a saida…
Peraí, já que você disse que está bloqueando com o while(1) do Hugo_PT, tente fazer assim:
Code:
time_t = t *60 *1000;

if (SaidaStatus == 1 && t > 0) {
    if (count == 0) {
        count = millis();
    }
    digitalWrite(Saida_Pin, HIGH); //activa a saida do arduino…
    contagem = millis() - count;
} else {
    count = 0;
    contagem = 0;
}

lcd.clear();
lcd.setCursor(1, 0);
lcd.print(time_t);
lcd.setCursor(12, 1);
lcd.print(contagem);

if (contagem >= time_t) {
    digitalWrite(Saida_Pin, LOW); //desactiva a saida...
}


Cara o teu laço while funcionou perfeitamente, muito obrigado.

Agora estou querendo implementar o botão start para dar um break no while para parar a execução do bloco. Fiz assim

Code:
while (contagem < time_t) {
       if(StartStatus);
          break;
        lcd.clear();
        lcd.setCursor(1, 0);
        lcd.print(time_t);
        contagem = millis() - count;
        lcd.setCursor(12, 1);
        lcd.print(contagem);
    }

coloquei o if(StartStatus); break..

porem agora o laço nao executa mais..

qual a forma certa de implementar o break atraves de um botao?

valeu
7  International / Portugues / Re: Ajuda com programação de estufa on: March 11, 2014, 03:18:51 pm
Remove o while(1) e as {} correspondestes.Estas a correr isso no loop() certo?

sim esta no loop, onde devo coloca-los? fora do loop?
8  International / Portugues / Re: Ajuda com programação de estufa on: March 10, 2014, 09:48:16 pm
Code:
time_t = t *60 *1000;

    if (StartStatus ==1 && time_t > 0) {
   count = millis();
   digitalWrite(Saida_Pin, HIGH) ;//activa a saida do arduino...
   lcd.clear();
   lcd.setCursor(0, 0);
   lcd.print(time_t);
   lcd.setCursor(0, 1);
   lcd.print(millis() - count);
}

if (StartStatus == 1 && (millis() - count >= time_t)){
   digitalWrite(Saida_Pin, LOW); //desactiva a saida...
}
Se tiveres a correr isso no loop ou dentro de algum ciclo repetitivo é normal que não funcione devido á variável count = millis(); estar a ser sempre actualizada, já que nada a encrava para não ser corrida de novo.Ou seja o tempo que passa acaba por não ser contado.
Nota que StartSatus esta sempre 1 pelos visto logo  if (StartStatus ==1 && time_t > 0) é sempre corrido e count = millis(); actualizado.
Desta forma o if (StartStatus == 1 && (millis() - count >= time_t)) nunca é corrido devido a millis() - count >= time_t nunca chegar a ser verdade
Ja agora para que é isto && time_t > 0, visto que time_t = t *60 *1000 é sempre maior que 0 e nunca o vai deixar de ser?
Tenta isto:
Code:
time_t = t *60 *1000;
char escravada = 0;
while(1)
{
 
  if (StartStatus ==1 && escravada == 0) {
    count = millis();//Guardamos os milisegundos
    escravada =1;//Previne que este if seja percorrido novamente, garantindo assim a contagem temporal
    digitalWrite(Saida_Pin, HIGH) ;//activa a saida do arduino...
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(time_t);
    lcd.setCursor(0, 1);
    lcd.print(millis() - count);
  }

  if (StartStatus == 1 && (millis() - count >= time_t)){
    digitalWrite(Saida_Pin, LOW); //desactiva a saida...
    escravada = 0;
    break;
  }
}


hugopt, no exemplo que me passou tem alguma coisa bloqueando a execução do programa e não consegui descobrir o que é;;;

nenhum botão responde
9  International / Portugues / Re: Ajuda com programação de estufa on: March 10, 2014, 04:18:47 pm
Olhando para a tua lógica, faz todo o sentido que dê 5... é precisamente o tempo que demora a executar estas instruções.
Quote
       
digitalWrite(Saida_Pin, HIGH); //activa a saida do arduino...
lcd.clear();
lcd.setCursor(1, 0 );
lcd.print(time_t);

Não sei onde arranjaste o último excerto de código que colocaste, mas dizer que seguiste a minha sugestão é no mínimo errado. Compara ambos os excertos de código e diz-me se o teu é remotamente parecido com o meu.

Nota que no meu exemplo, o programa usa uma contagem de tempo ascendente para criar a funcionalidade que queres e depois para ser bonito para o utilizador imprime a contagem invertida (não sei se funcionará, mas deve estar perto). O teu código não faz nem uma nem outra. 



Code:
[code]time_t = t *60 *1000;

    if (StartStatus ==1 && time_t > 0) {
   count = millis();
   digitalWrite(Saida_Pin, HIGH) ;//activa a saida do arduino...
   lcd.clear();
   lcd.setCursor(0, 0);
   lcd.print(time_t);
   lcd.setCursor(0, 1);
   lcd.print(millis() - count);
}

if (StartStatus == 1 && (millis() - count >= time_t)){
   digitalWrite(Saida_Pin, LOW); //desactiva a saida...
}
[/code]

bubulindo se reparar o código esta praticamente igual, apenas adicionei a parte do lcd para visualizar o que esta a suceder...
10  International / Portugues / Re: Ajuda com programação de estufa on: March 10, 2014, 04:09:14 pm
Estas a dizer que isto  contagem = millis() - count; esta sempre a dar 5?
Qual é o tipo de dados do count e do contagem?


hugoPt a variavel contagem é do tipo unsigned long
11  International / Portugues / Re: Ajuda com programação de estufa on: March 09, 2014, 09:03:29 pm
resolvi o problema do tamanho da variavel t usando um unsigned long.

mas continuo com o problema da contagem,..

o valor do teste millis() - contagem esta retornando sempre 5 e numca atinge a condição >= time_t

ta dificil
12  International / Portugues / Re: Ajuda com programação de estufa on: March 08, 2014, 11:39:34 pm
pessoal, resolvido a parte da impressao no lcd, estou com problemas para implementar o contador do tempo

fiz a seguinte lógica com a sugestao do bubulindo

Code:
time_t = t *60 *1000;   
     
     if (SaidaStatus == 1 && t > 0) {
      count = millis();
        digitalWrite(Saida_Pin, HIGH); //activa a saida do arduino...
            lcd.clear();
            lcd.setCursor(1, 0 );
            lcd.print(time_t);
        contagem = millis() - count;
            lcd.setCursor(12, 1);
            lcd.print(contagem);
    }
       if (contagem >= time_t){
          digitalWrite(Saida_Pin, LOW); //desactiva a saida...

primeiro problema:
o valor da varivel time_t quando t esta com o valor 1 esta retornando 4294961760 quando deveria retornar 60000.

segundo problema, o valor da variavel contagem fica sempre entre 6 e 7 e o teste fica sempre na primeira condição com a saida ativada e mesmo ao pressionar o botao start para parar a contagem a saida fica sempre ativada..

deu pra entender ou ficou confuso??

o que esta a sair errado?
13  International / Portugues / Re: Ajuda com programação de estufa on: March 05, 2014, 08:21:09 pm
Usei um serial print para ver o valor real da variável e no serial monitor o valor esta correto baixa de 10 para 9
apenas no lcd aparece 90, o que estou esquecendo no comando do lcd?
14  International / Portugues / Re: Ajuda com programação de estufa on: March 05, 2014, 04:18:20 pm
hugo, mesmo zerando as variáveis na inicialização ainda não resolveu o problema, continua o mesmo problema do vídeo.


ao decrementar de 10 para 9, ao invés de ir à 9 vai à 90

muito confuso
15  International / Portugues / Re: Ajuda com programação de estufa on: March 05, 2014, 07:01:36 am
Hugo, o código é este

Code:
const int Start_buttonPin = 6;
const int TempMenos_buttonPin = 7;
const int TempMais_buttonPin = 8;
const int TimeMenos_buttonPin = 9;
const int TimeMais_buttonPin = 10;

const int Saida_Pin =  13;
unsigned char TimeMais_antes = 0;
unsigned char TimeMenos_antes = 0;
int Start_buttonState = 0;
int setTemp = 0;
int t;
int SensorPin = 0; // Pino analogico para ligacao do LM35
int samples[30]; // Array para precisão na medição
int i;
int tempc;
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //Define os pinos que serão ligados ao LCD

byte a[8]=
{B00110,B01001,B00110,B00000,B00000,B00000,B00000,B00000,}; //Array que desenha o simbolo de grau

void setup()
{
  Serial.begin(9600); // Inicializa comunicação serial
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  lcd.begin(16, 2); //Inicializa
  lcd.setCursor(0, 0);
  lcd.print("Temperatura: ");
  lcd.setCursor(0, 1);
  lcd.print("Tempo= ");
 
pinMode(Saida_Pin, OUTPUT);
pinMode(Start_buttonPin, INPUT);
pinMode(TempMenos_buttonPin, INPUT);
pinMode(TempMais_buttonPin, INPUT);
pinMode(TimeMenos_buttonPin, INPUT);
pinMode(TimeMais_buttonPin, INPUT);

}

void loop()
{
  for(i = 0;i<=29;i++){ // Loop que faz a leitura da temperatura 8 vezes
    samples[i] = ( 5.0 * analogRead(SensorPin) * 100.0) / 1024.0;
    tempc = tempc + samples[i]; //A cada leitura, incrementa o valor da variavel tempc
  }

tempc = tempc/30.0; // Divide a variavel tempc por 8, para obter precisão na medição
delay(100);

lcd.setCursor(13, 0);
lcd.print(tempc,DEC); //Escreve no display o valor da temperatura
tempc=0;


   if(digitalRead(TimeMais_buttonPin)== HIGH && TimeMais_antes == 0) {
   TimeMais_antes = 1;
   t++;
}
if (TimeMais_antes == 1 && digitalRead(TimeMais_buttonPin)==LOW) TimeMais_antes = 0;

if(digitalRead(TimeMenos_buttonPin)== HIGH && TimeMenos_antes == 0) {
   TimeMenos_antes = 1;
   t--;
}
if (TimeMenos_antes == 1 && digitalRead(TimeMenos_buttonPin)==LOW) TimeMenos_antes =0;



   lcd.setCursor(7, 1);
   lcd.print(t);
   
  }
Pages: [1] 2 3 ... 6