Go Down

Topic: Dúvida Algoritimo Timer (Read 4804 times) previous topic - next topic

coxinha

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.

bubulindo

E em termos de código o que é que possuis?
This... is a hobby.

coxinha

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


hugo007

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 :) )
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á?



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

coxinha

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

hugo007

#5
Nov 04, 2013, 10:43 am Last Edit: Nov 04, 2013, 10:46 am by HugoPT Reason: 1
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
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

THECROW

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.

bubulindo

A lógica é a mesma... Qual é o problema?
This... is a hobby.

THECROW

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.

hugo007

Retira entao o sumo deste codigo
Code: [Select]


#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");
 }
}
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

THECROW

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?

bubulindo

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

Importas-te de explicar um pouco mais sobre o teu problema?
This... is a hobby.

THECROW

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 .

bubulindo

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á.
This... is a hobby.

THECROW

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. :)

Go Up