Dúvida Algoritimo Timer

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.

E em termos de código o que é que possuis?

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

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 :slight_smile: )
Usares esses delays é errado.

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

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

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

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

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

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.

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

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.

Retira entao o sumo deste codigo

#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");
  }
}

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?

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

Importas-te de explicar um pouco mais sobre o teu problema?

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 .

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á.

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

Segurar a alavanca para frente por 10 segundos e então ascender o led indicador "on" e os faróis do caminhão

Isto dá?

#define O_MEU_TEMPORIZADOR 10000 //corresponde a 10 segundos
unsigned char alavancaFrente = 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(alavancaFrente,1);//configuras o pino como entrada
  digitalWrite(alavancaFrente,1);//Activamos o pull-up no pino do botao.


}

void loop()
{
  now = millis(); //Isto obtem o "tempo" desde que o arduino esta ligado
  if (digitalRead(alavancaFrente) ==0)//O utilizador carregou na alavanca, vamos entao contar os 10 segundos daqui pra frente
  {
    eventoDisparado = now;  //Resetamos o evento
    while(!digitalRead(alavancaFrente) && (millis() - eventoDisparado) < O_MEU_TEMPORIZADOR)Serial.println("Estou a arrancar o Camiao");
    digitalWrite(led,1);//Camiao com luz ligada
    Serial.println("Camiao Ligado");
    delay(1000);
  }
}

No entanto este codigo bloquea enquanto tens o botao pressionado, nao fazendo mais nada, sendo que isso será o teu desafio para fazeres fazeres outras coisas se assim desejares.Nao testei o codigo por isso claro que vai ter bugs.

Bons estudos