Pages: [1]   Go Down
Author Topic: Programação TCC  (Read 836 times)
0 Members and 1 Guest are viewing this topic.
São Paulo
Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Opa galera,

Tenho um problema relativamente grande com o meu trabalho de tcc, preciso disparar uma ação(deixar uma saída em nível lógico alto) de acordo com um tempo pré determinado pelo usuário de uma interface de controle, nesta interface constam 3 botões, um botão de MENU (habilita o incremento e decremento de tempo), e mais os botões de incremento e decremento, os dois botões irão incrementar ou decrementar o tempo de disparo em uma hora(cada botão com uma função), o botão MENU quando for apertado pela segunda vez desabilitará mudanças no timer e vai salvar as configurações setadas pelo usuário da interface de controle.

Por enquanto tenho funcionando um relógio regressivo baseado na função millis() que começa em 24h00 e vai decrementando até chegar em 00h00, código :

Code:
int seg=0,
min=0,
hor=0,
botao;

static unsigned long ult_tempo = 0;

void setup()
 {
   Serial.begin(9600);
 }

void loop()
{
  int tempo = millis();
 
  if(tempo - ult_tempo >= 1000)
  {
    ult_tempo = tempo;
    seg--;
  }
 
  if(seg<=0)
  {
    seg = 59;
    min--;
  }
 
  if(min<=0)
  {
    min = 59;
    hor--;
  }
 
  if(hor<=0)
  {
    hor=24;
  }
 
 
  Serial.print(hor);
  Serial.print(":");
  Serial.print(min);
  Serial.print(":");
  Serial.println(seg);
 
  delay(1500);
 
}


Também venho estudando o código do ButtonStateChange:
http://arduino.cc/en/Tutorial/ButtonStateChange

Tenho conseguido algum exito na detecção dos pulsos nos botões da interface, porém meu maior problema é a lógica envolvida em conseguir pré programar o timer para o disparo do meu dispositivo. Venho aqui no fórum procurando um norte para começar a sair do 0.1 hahaha.


Muito obrigado aos amigos do forum que tiveram paciência de ler o meu post até aqui hahaha.
Abraços

Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3219
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Já viste isto:

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

Nos exemplos creio que mostra como usar o millis para o que pretendes.

Em todo o caso, se não quiseres usar a biblioteca (que não é muito bom para trabalhos de escola). O que deves fazer é o contrário do que estavas a fazer.

Code:
unsigned char tempo_pre_definido = 23; //portanto a saída vais estar high durante 23 horas.
unsigned long tempo = tempo_pre_definido * 60 *60; //isto dá-te o numero de segundos.
tempo = tempo*1000; //tempo para comparacão com millis Neste caso deve ser algo como 82800000, verifica.
unsigned long tempo_agora = 0;

If (botao_pressionado == TRUE) { //inicia accão.
   tempo_agora = millis();
   digitalWrite(saida, HIGH);
}

if (millis() - tempo_agora >= tempo) { //passaram-se as 23 horas
   digitalWrite(saida, LOW);
}

Não inclui os cálculos para minutos e segundos para a variável tempo, mas acho que consegues chegar lá sozinho.
A diferenca é que as horas apenas são usadas no interface com o utilizador e o resto do programa trabalha em milisegundos. A maneira que estavas a fazer complica mais pois estás sempre a usar horas e minutos para contar o tempo.

Vais ter de incluir um relógio a contar o tempo em horas para apresentar?

Nota também que o millis não é ideal para usar como um relógio. Seria bem melhor usar um RTC, ou um cristal de 32kHz com um chip separado.

Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

São Paulo
Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Já viste isto:

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

Nos exemplos creio que mostra como usar o millis para o que pretendes.

Em todo o caso, se não quiseres usar a biblioteca (que não é muito bom para trabalhos de escola). O que deves fazer é o contrário do que estavas a fazer.

Code:
unsigned char tempo_pre_definido = 23; //portanto a saída vais estar high durante 23 horas.
unsigned long tempo = tempo_pre_definido * 60 *60; //isto dá-te o numero de segundos.
tempo = tempo*1000; //tempo para comparacão com millis Neste caso deve ser algo como 82800000, verifica.
unsigned long tempo_agora = 0;

If (botao_pressionado == TRUE) { //inicia accão.
   tempo_agora = millis();
   digitalWrite(saida, HIGH);
}

if (millis() - tempo_agora >= tempo) { //passaram-se as 23 horas
   digitalWrite(saida, LOW);
}

Não inclui os cálculos para minutos e segundos para a variável tempo, mas acho que consegues chegar lá sozinho.
A diferenca é que as horas apenas são usadas no interface com o utilizador e o resto do programa trabalha em milisegundos. A maneira que estavas a fazer complica mais pois estás sempre a usar horas e minutos para contar o tempo.

Vais ter de incluir um relógio a contar o tempo em horas para apresentar?

Nota também que o millis não é ideal para usar como um relógio. Seria bem melhor usar um RTC, ou um cristal de 32kHz com um chip separado.



A minha intenção era justamente essa usar as horas apenas na interface com o utilizador. Respondendo a sua pergunta, tenho que mostrar o tempo restante para disparar a ação(high no port de saída) em um lcd que vai estar no interface, quando este tempo chegar a 0, o tempo deve voltar ao estado inicial pré determinado.

Quanto ao RTC, no primeiro momento a intenção era de usa-lo porém o professor nos pediu para usarmos apenas código.

Neste momento não estou em casa, não vou poder colocar suas dicas em prática, amanhã quando estiver em casa mando um feedback para você sobre as minhas tentativas.

Abraços
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3219
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Podes fazer o cálculo inverso para apresentar ao utilizador...
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Pages: [1]   Go Up
Jump to: