Pages: [1] 2   Go Down
Author Topic: Dúvida Algoritimo Timer  (Read 2240 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bom pessoal, preciso de ajuda com um algoritmo que faça o seguinte:

No algoritimo vai conter a hora inicial e a hora final, e entre esse horário de tempo, teria um timer, que realizaria a função de por exemplo, o rele ficar ligado 30 segundos e desligado 10 minutos dentro desse horario de tempo.

Possuo um RTC grove, ligado ao Data Shield.

Obrigado.
Logged

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

E em termos de código o que é que possuis?
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).

Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Então, por exemplo, fazendo ele ligar 30 segundos e desligar 10 minutos, estou conseguindo. Não estou conseguindo mesmo a parte do horário de inicio, pois não to conseguindo pegar a hora atual, get DateTime, creio que seja algo relacionado.

    double tempoligado = 0.3;
    double tempodelisgado = 10;
   
    digitalWrite(rele, HIGH); //Aciona o rele
    delay(tempoligado  * 60000); //Tempo que ficará ligado
    digitalWrite(rele, LOW); //Desliga o rele
    delay(tempodelisgado * 60000); //Tempo que ficará desligado

Logged

Portugal
Offline Offline
Edison Member
*
Karma: 37
Posts: 1547
Pretending you know everything then you will learn nothing.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Então, por exemplo, fazendo ele ligar 30 segundos e desligar 10 minutos, estou conseguindo.
Olhando para o teu código estas a fazê-lo mas com cocegas no microcontrolador.(Ele deve se estar a rir por dentro smiley )
Usares esses delays é errado.
Quote
    double tempoligado = 0.3;
    double tempodelisgado = 10;
   
    digitalWrite(rele, HIGH); //Aciona o rele
    delay(tempoligado  * 60000); //Tempo que ficará ligado
    digitalWrite(rele, LOW); //Desliga o rele
    delay(tempodelisgado * 60000); //Tempo que ficará desligado
Se queres trabahar com situaçoes temporais aprende a usar a funçao millis()
Aqui tens um bom começo
http://arduino.cc/en/Tutorial/BlinkWithoutDelay
Quote
Não estou conseguindo mesmo a parte do horário de inicio, pois não to conseguindo pegar a hora atual, get DateTime, creio que seja algo relacionado.
Se tens um RTC que código já tens sobre ele e que dizes que a função getDateTime nao dá?



Logged

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B


Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Olhando para o teu código estas a fazê-lo mas com cocegas no microcontrolador.(Ele deve se estar a rir por dentro smiley )
Usares esses delays é errado.

Certo, vou dar uma estudada sobre millis(), e começar a usa-lo

Quote
Se tens um RTC que código já tens sobre ele e que dizes que a função getDateTime nao dá?

Então, estou tentando fazer assim:

    float horaatual;
    double tempoligado = 0.3;
    double tempodelisgado = 10;
    float horainicial = '21:59:00';
    float horafinal = '22:02:00';
   
    horaatual = DateTime.now();

    if (horainicial >= horaatual &&  horafinal <= horaatual)

Não sei se está correto, se alguem puder dar uma luz, agradeço.

Obrigado
Logged

Portugal
Offline Offline
Edison Member
*
Karma: 37
Posts: 1547
Pretending you know everything then you will learn nothing.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
float horaatual;
    double tempoligado = 0.3;
    double tempodelisgado = 10;
    float horainicial = '21:59:00';
    float horafinal = '22:02:00';
  
    horaatual = DateTime.now();

    if (horainicial >= horaatual &&  horafinal <= horaatual)

Não sei se está correto, se alguem puder dar uma luz, agradeço.
Sim nao estas a fazer correctamente.
DateTime.now devolve te um objecto da class  DateTime
Entao carregares isso para dentro de um float nao dará em nada.
Comparar floats tambem é algo do alem e certamente nao te vai levar a ter sucesso.
Tenta ler isto
http://learn.adafruit.com/ds1307-real-time-clock-breakout-board-kit/understanding-the-code
« Last Edit: November 04, 2013, 04:46:25 am by HugoPT » Logged

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B


Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vou pegar uma carona aqui.......não consigo entender o lance dos tempos no arduino, eu preciso de um codigo onde pressionando um botão, e, aguardando 10 segundos execute um comando, como ascender um led por exemplo, e quando der 20 segundos execute outra função. No mplab programando em c bastava criar uma variavel tempo, e depois por um if com botão pressionado && e variavel tempo ==10. Se puderem me ajudar agradeço.
Logged

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

A lógica é a mesma... Qual é o problema?
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).

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

O problema é que no arduino não funciona, não sei como fazer, se não for pedir demais gostaria de um exemplo, um codigo onde, pressionando um certo botão e esperando 10 segundos após o botão ter sido pressionado ascendesse um led, e que ele apagasse só pressionando outro botão. mas gostaria de algo que não fosse delay.
Logged

Portugal
Offline Offline
Edison Member
*
Karma: 37
Posts: 1547
Pretending you know everything then you will learn nothing.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Retira entao o sumo deste codigo
Code:

#define O_MEU_TEMPORIZADOR 10000 //corresponde a 10 segundos
unsigned char botao = 10;//Botao que precionas para iniciar o temporizador
unsigned char led = 13;//Vamos usar o led que esta na board

unsigned long now = 0;
unsigned long eventoDisparado = 0;


void setup()
{
Serial.begin(9600);
pinMode(led,1);//Configuras o pino com entrada
pinMode(botao,1);//configuras o pino como entrada
digitalWrite(botao,1);//Activamos o pull-up no pino do botao.


}

void loop()
{
Serial.println("estou a processar outras coisas e nao estou parado");  
now = millis(); //Isto obtem o "tempo" desde que o arduino esta ligado
if (digitalRead(botao) ==0)//Se o botao e levado a low entao alguem o pressionou
{
  eventoDisparado = millis();//Marcamos o tempo de inicio
  digitalWrite(led,1);//Ligas o led e vais a tua vida...
  Serial.println("Liguei o Led");
  
}
if(now - eventoDisparado > O_MEU_TEMPORIZADOR) //Se passou o tempo do temporizador
{
  eventoDisparado = now;  //Resetamos o evento
  digitalWrite(led,0);//E desligamos o led
  Serial.println("Desliguei o Led");
  }
}
Logged

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B


Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Valeu pela atenção, o problema é que se eu usar essa forma eu não poderei usar os pinos 1 e 2 do arduino, e meu prjeto ja esta faltando pinos, daqueles exemplos da livraria time, tem algum que posso usar para fazer a mesma função do millis? Ou o que preciso?
Logged

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

O millis() não usa pinos...
O pino 1 já é usado pela UART...

Importas-te de explicar um pouco mais sobre o teu problema?
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).

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Estou a fazer um caminhão de controle remoto, usarei duas alavancas tres posições, e pretendo fazer as seguintes funções.
Segurar a alavanca para frente por 10 segundos e então ascender o led indicador "on" e os faróis do caminhão. Isso significaria que o caminão esta ligado. Eu fiz o codigo já, porem só o que consegui foi ligar o caminhão assim q pulsado o botão. Sou leigo no assunto programação e ainda nãoconsegui entender muito bem a função millis, quanto aos pinos 1 e2 estou usando como entradas digitais, e em outro forum me disseram que se caso eu usar a função millis não poderia usar os pinos 1 e2 como saidas .
Logged

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

Há algo aqui que me confunde... Primeiro dizes que no MPLab isto era fácil de fazer em programação e agora não percebes de programação?
Que fórum era esse onde te disseram isso?

O millis indica-te o numero de milissegundos que passaram desde que o microcontrolador foi ligado. Se agora o millis te dá 1500, daqui a 1 segundo dar-te-á 2500. Isso é simples, não?

Então agora só tens de fazer um programa que se o botão for activado, guarda o valor que o millis devolve nesse instante. E depois fica a ver se o botão continua pressionado e se o millis é igual ao valor inicialmente guardado mais 10000.

O código do hugo deixa o led ligado por 10 segundos. Adicionando uma condição para testar se o botão continua pressionado chegas lá.
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).

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

O mplab foi o programa que usavamos no curso de eletronica, porem o material didatico foi bem basico, era só isso mesmo ascender led, essas coisinhas, mas nele bastava criar uma variavel de tempo, depois criando uma borda para o botão, e incrementar o tempo, por isso disse ser leigo no assunto.
Mas valeu, muito obrigado pelas informações, vou ver  oq posso fazer aqui. smiley
Logged

Pages: [1] 2   Go Up
Jump to: