Boa tarde à todos os garagistas. Gostaria da ajuda de vocês rsrs.

Há algum tempo venho tentando utilizar "timers" no Arduíno, porém sem sucesso. Minha experiência nessa plataforma é pequena e minha vivência é com CLP´s e afins.

Sei que é muito complicado comparar um ao outro, porém venho tentando utilizar alguns temporizadores no software mas ainda sem sucesso. Fiz algumas pesquisas e não sei se foi falta de atenção minha ou se realmente não passei por algum exemplo que me ajudasse.

Lá vai a dúvida em um exemplo:

Gostaria de utilizar 3 temporizadores com o Tempo sendo uma variável setável individualmente para cada temporizador.

Temporizador 1, a variável é X e caso eu aperte um botão e fique com ele pressionado, o tempo começa a contar. Caso o tempo não atinja a variável X o mesmo reseta a contagem. Uma saída só seria ligada ou desligada caso o botão fique apertado durante todo o tempo requisitado na variável X. Isso se aplica aos 3 temporizadores que podem ou não serem executados em paralelo.

Venho estudando um pouco da função Millis afim de não travar o software enquanto isso ocorre, mas até o momento não obtive sucesso nas tentativas.

Acompanho o fórum "nas sombras" já faz um bom tempo e consegui tirar muitas dúvidas aqui em alguns assuntos como por exemplo: PullDown e PullUp, ZeroCross, Millis e outros assuntos.

Agradeço desde já a ajuda!

OBS.: O projeto é simular temporizadores para minha "fábrica caseira" de cervejas e bebidas haha.

Exibições: 823

Responder esta

Respostas a este tópico

Boa tarde RB,

voce descreveu no seu texto:  "variável setável individualmente para cada temporizador."

Como você "setará" estas variáveis?

O resto é relativamente fácil.

Você pode usar millis(), ou a biblioteca  timerOne.h ou  a elapsedMillis.h.

Com millis() faça assim:

1. No setup() carregue 3 variáveis com o valor de millis();

2. Com os botões sem pressionar, cada variável fica sendo atualizada com valor de millis();

3. Ao pressionar algum botão, inicia a comparação da variável com o valor "setado" para aquele botão.

4. Se "estourar" o tempo, executa a ação planejada para aquele botão.

RV

RV, Obrigado!

Testarei amanhã, isso está quebrando minha cabeça.

Essas variáveis serão parametrizadas por botões e um display. Vou fazer um menu onde inputo o tempo e esse funciona como "rampa de subida e rampa de descida".

Estarei postando os resultados assim que testar!

RB

Olá.

  Eu usaria interrupção... Apenas uma.

Veja em:

http://labdegaragem.com/profiles/blogs/tutorial-executando-fun-es-e...

 No exemplo está para meio segundo. Pode ser por ex 0,1 segundo.

 Aih vc pode criar contadores de tempo. 

 Incrementa esses contadores a cada ida ao callback()

Logo depois de incrementar vc verifica se chegou ao limite da contagem para aquele contador, que pode ser por ex de botao pressionado, nivel de porta, tempo de led, o que quiser, faca sua logica.

Apenas nunca faça coisas demoradas em uma interrupçao como delay(), escrita em serial de mais de 1 caracterer, escrita em LCD, coisas assim. Se precisar em vez de fazer vc pode setar uma variavel avisando da necessidade e la no programa principal (loop()) vc verifica essa flag e executa (depois reseta a flag).

Acho o melhor jeito de trabalhar com varios timers.

Eduardo, agradeço muito a resposta rápida, irei testar amanhã e estarei postando os resultados por aqui. Muito obrigado!

Eu tive um problema semelhante e resolvi com as informações do site

https://www.luisllamas.es/libreria-arduino-asynctask/

Espero que ajude.

Galera, boa noite!

Após alguns dias longe do Arduino, fiz uma implementação de uma função de timer, bem primitiva na verdade, que me atendeu em boa parte:

unsigned long startMillis0;
unsigned long currentMillis0;
unsigned long periodo0;
bool tempofoi0 = false;

void tempo0()
{
currentMillis0 = millis(); //Obtém o "tempo" atual (o número de milissegundos desde que o programa iniciou)
if (currentMillis0 - startMillis0 >= periodo0) //Verifica se o período passou
{
tempofoi0 = true; //Se período atingiu, sinaliza na variável
startMillis0 = currentMillis0; //IMPORTANTE para salvar o tempo em que sinalizou na variável
}
}

Controlando as variáveis, consegui fazer o delay sem 'bloquear' o processador.

Acontece que estou fazendo um dimmer com função 0 crossing, e para funcionar, utilizo uma interrupção, mas dentro da função na qual a interrupção chama, só consegui usar a função "delayMicroseconds". Isto está causando problemas quando tento fazer uma 'rampa de aceleração', controlando a delay. Segue o código básico do 0 cross:

const int setmoc = 4;
int PotPin = A2;
volatile float AnalogValue = 0;
volatile float Delay = 0;

void setup() {
Serial.begin(9600);
pinMode(setmoc, OUTPUT);
attachInterrupt(0, Dimm, RISING);
}

void loop() {
AnalogValue = analogRead(PotPin);
Delay = ((AnalogValue * 7.03)+360);
Serial.print(Delay);
Serial.print("\n");
}

void Dimm() {
delayMicroseconds(Delay);
digitalWrite(setmoc, HIGH);
delayMicroseconds(6);
digitalWrite(setmoc, LOW);
}

A questão é: seria possível fazer o delay dentro da função chamada pela interrupção sem utilizar a função delay do Arduino?

Agradeço desde já a atenção de todos.

boa noite Rafael.

       Fiz uma implementação do Sistema que vc descreveu, e todas as funcionalidades que você descreveu aqui no post, estão funcionando exatamente como descrito.

       Porém há alguns pontos que você não passou detalhes, e inclusive chegam a parecer incongruentes em termos de funcionamento.

       Se possível, entre em contato, pois se você descrever estes detalhes, te passo toda a implementação (código e Hardware), bem como publico a mesma aqui neste tópico, claro se vc concordar (de forma a servir de base para projetos diversos de outros garagistas).

       Também tenho algumas sugestões que podem ajudar na sua implementação, mas somente com a descrição mais detalhada da sua parte, é que posso encaixar estas sugestões.

       Abrçs,

       Elcids

você pode usar essa função no código para fazer a contagem no lugar do delay

void hold(const unsigned int &ms) { // função de substituição do delay// Non blocking delay
    unsigned long m = millis();
           while (millis() - m < ms) {
                yield();
      }
}

Ai ao invés de "delay(2000);" por exemplo você  escreve  "hold(2000);"

É muito pratico, te da o conforto do delay e a liberdade do millis rsrs.

Olá garagistas, agradeço todo o empenho, no período da noite estarei atualizando tudo o que ocorreu aqui, agora só passei para mostrar que não desapareci haha.

Até logo amigos.!

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço