Alguém tem algum projeto de temporizador ajustável por potenciômetro? Tenho esse código que pretendo adaptar, mas não descobri a forma correta.

// Programação Timer sensor  
const int Rele = 11; //Pino do Rele
void setup()
{
Serial.begin(9600);
pinMode(Rele, OUTPUT); //Definido como saída
}
void loop()
{
digitalWrite(Rele, HIGH); //Sensor acende
delay(32400000); //Espera 9 Horas
digitalWrite(Rele, LOW); //Sensor desliga
delay(54000000); //Espera 15 Horas
}


Nesse código preciso acrescentar uma entrada para dar o pulso de acionamento e o tempo de
delay em segundos seja ajustável por potenciômetro. Exemplo 1 pulso High na entrada digital irá
acionar a saída digital 13 com delay ajustado pelo potenciômetro, poderíamos definir um tempo de 10 a 30s, o delay só irá considerar a posição do potenciômetro no momento do pulso atualizando a temporização no pulso seguinte.

Exibições: 5675

Responder esta

Respostas a este tópico

Alguém poderia dar uma luz nesse projeto?

Oi Jonas, boa tarde,

Segue a minha sugestão de sketch e o esquema.

 Na linha 21 voce pode variar o valor do multiplicador  para definir a faixa de valores para o

tempo ajustável pelo potenciômetro.

Boa sorte 

Rui 

// Programação Timer sensor
const int Rele = 11; // Pino do Rele
const int Disp = 10; // Pino do Sw
int analogPin0 = 0; // Porta analógica para SW1

int valor_pot =0 ; // Variavél com o valor do potenciometro lido na A0
word Tempo = 0; // Variável de 2 Bytes para guardar tempo de delay
int SW1 = 0;
void setup()
{
Serial.begin(9600);
pinMode(Rele, OUTPUT); // Definido como saída
pinMode(Disp, INPUT); // Definido como entrada
}
void loop()
{
SW1 = digitalRead(Disp);
if (SW1==LOW)
{
valor_pot = analogRead(analogPin0); // read the input pin
Tempo = valor_pot*10; // <-------------- Calcula tempo de delay
// Serial.println(Tempo);
digitalWrite(Rele, HIGH); // Sensor acende
delay(Tempo); // Usa o tempo calculado com delay
digitalWrite(Rele, LOW); // Sensor desliga
delay(Tempo); // Usa o tempo calculado com delay
}
}

Rui pelo que entendi do seu codigo é preciso que SW1 esteja em LOW para que o estado de Rele fique variando com o tempo e aparentemente isso não aconteceria na descriçao que o Jonas deu, o pulso apenas atualizaria o tempo de delay (posso estar errado).

A minha sugestão seria utilizar o codigo do Rui porem tirar o acionamento do Rele de dentro do IF, ficando da seguinte forma o loop

SW1 = digitalRead(Disp); 

if (SW1==LOW)

{

valor_pot = analogRead(analogPin0); // read the input pin

Tempo = valor_pot*10; // <-------------- Calcula tempo de delay

}

// Serial.println(Tempo); 

digitalWrite(Rele, HIGH); // Sensor acende 

delay(Tempo); // Usa o tempo calculado com delay

digitalWrite(Rele, LOW); // Sensor desliga 

delay(Tempo); // Usa o tempo calculado com delay 

Oi Jonas,

eu testei e vi que para a faixa que voce quer, (10s a 30s), o multiplicador deve ser em torno de 40 a 50.

Rui

Obrigado Rui, vou testar e comento como ficou.

Olá Rui o circuito funcionou, mas de forma um pouco diferente do que eu esperava, na verdade estou fazendo um circuito experimental de injeção eletrônica para um motor monocilíndrico, certamente vou usar outros sensores para o ajuste fino da injeção (temperatura, ar, Lambda, temperatura do motor), mas antes de incrementar a fórmula da mistura estequiométrica perfeita preciso acertar este timer, o ajuste de tempo será feito por pelo tps que é o sensor de posição do acelerador (atua da mesma forma que um potenciômetro comum) e a temporização deve ser encerada se não houver, mais pulso no SW ( no circuito sugerido ele ficou intermitente com ajuste de intervalo pelo potenciômetro), o tempo será em milisegundos, mas podemos usar em segundos para testes depois farei a conversão.

Acho que teremos que adaptar apenas alguns códigos para atuar desta forma, pois no restante acredito que o circuito está correto e talvez eu não tenha me explica direito.

Então funciona assim 1 sensor hall (SW) no virabrequim irá pulsar para indicar o momento que a saída (11) será acionada, á partir daí o timer fará a contagem do tempo (High) conforme o ajuste do potenciômetro (se o tempo mínimo é de 10s e o máximo de 30s e no momento do pulso estiver em 10s a saída irá acionar imediatamente no pulso SW e desligar após 10s) até entrar em (Low) se não houver mais pulsos a saída (11) fica em (Low), não sou nenhum expert em arduíno, talvez esse problema seja simples de resolver, mas ainda não encontrei o caminho, desde já agradeço a dedicação.

Oi Jonas, bom dia,

Testa com este novo código.

Só fiquei na dúvida se voce vai testar  o Hall  High ou Low, eu defini como  low, se for High voce muda na linha 25.

Boa sorte.

Rui

// Programação Timer sensor

// Então funciona assim 1 sensor hall (SW) no virabrequim irá pulsar para indicar o momento que a saída (11) será acionada,
// á partir daí o timer fará a contagem do tempo (High) conforme o ajuste do potenciômetro (se o tempo mínimo é de 10s e o
// máximo de 30s e no momento do pulso estiver em 10s a saída irá acionar imediatamente no pulso SW e desligar após 10s)
// até entrar em (Low) se não houver mais pulsos a saída (11) fica em (Low), não sou nenhum expert em arduíno, talvez esse
// problema seja simples de resolver, mas ainda não encontrei o caminho, desde já agradeço a dedicação.

const int Rele = 11; // Pino do Rele
const int Disp = 10; // Pino do Sensor Hall
int analogPin0 = 0; // Porta analógica para o potenciometro

int valor_pot =0 ; // Variavél com o valor do potenciometro lido na A0
word Tempo = 0; // Variável de 2 Bytes para guardar tempo de delay
int Hall = 0; // Variável para guardar status de Hall
void setup()
{
Serial.begin(9600);
pinMode(Rele, OUTPUT); // Definido como saída
pinMode(Disp, INPUT); // Definido como entrada
}
void loop()
{
Hall = digitalRead(Disp); // Le o sensor Hall
if (Hall==LOW) // Se o Hall foi acionado
{
valor_pot = analogRead(analogPin0); // read the input pin; Valor de leitura do potenciomentro
Tempo = valor_pot*40; // <-------------- Calcula tewmpo de delay
digitalWrite(Rele, HIGH); // Liga Rele
delay(Tempo); // Usa o tempo calculado com delay
digitalWrite(Rele, LOW); // Desliga Rele
}
}

Olá Rui, funcionou exatamente como eu queria, só mais uma coisa, como faço para fixar uma escala exata de tempo? Ex: potenciômetro no mínimo (0v) tempo mínimo 5s, potenciômetro em nível máximo (5v) tempo máximo 10s, vou usar essa temporização apenas para testes, pois no motor os tempos são de aproximadamente 2 a 3 milisegundos em marcha lenta, até 10 á 15 ms acelerado, até agora valeu você é o mestre, o único que se despôs a me ajudar.

Oi Jonas, boa tarde.

 

O ADC do arduino funciona assim:

Qdo voce tem 0v no pino  o valor do convertido é igual a 0(Zero);

Qdo voce tem 5v no pino o valor convertido é 1023 ( hex 0x03FF);

Como no esquema eu coloquei um resistor de 330ohms em serie com o potenciômetro de 4k7, (totalizando 5k), o valor não chegará a 1023, mas sim próximo de 960 (hex 0x03C0).

Voce pode mudar o resistor de 330ohm e coloca-lo entre o pino do arduino e o pino central do potenciômetro, isto melhora a escala e voce consegue valores bem próximo de zero até próximo a 1023.
 

Agora vem a questão do tempo:

 

Vamos começar com o potenciometro de 5k.

 

Desprezando o tempo que arduino gasta para medir o pino e calcular o valor,  voce pode usar o seguinte raciocínio:

O recurso "delay(Tempo)"   está usando o valor lido e calculado pelo ADC, portanto o maior tempo seria 1023 ms.

Eu usei no sketch que te enviei a correção do tempo assim :  Tempo = valor_pot*40;

Este valor (40) (agora não me lembro se é hexa ou decimal) (Depois procuro), é para alterar o tempo.

Podemos usar o recursos de dividir ou multiplicar este valor para obtermos o nosso valor máximo. 

Usando seus exemplos:

 

(1023/1023)*15 = 15ms     e    (1023/1023*10.000) = 10.000ms (10s).

Para o valor mínimo voce pode estabelecer colocando um resistor ligado entre um pino do potenciômetro e o GND.

Vou usar novamente seus exemplos:

(X/1023)*15 = 3    ---->   X/1023 =  3/15  ---->   X  = 1023*0,2  ----> +- 204

(204/1023)*15 = +-3ms

 

(X/1023*10.000) = 5.000 ---->   X/1023 =  5.000/10.000  ---->   X  = 1023*0,51  ----> +- 521

(521/1023)*10.000 = +-5.000ms (5s).

 

1o caso:

Como 1023 = 5v, para obter  204 voce precisa de (5/1023) * 204 = 0,997v no pino (vou arredondar para 1v)

Para conseguir 1v no pino voce deve usar a seguinte formula:  5v =  5k

Então para conseguir 1v = 1k, precisa colocar um resistor de 1k entre o GND e o potenciômetro, e usar um potenciômetro de 4k.  Total 5k.

 

2o caso:

Como 1023 = 5v, para obter  521 voce precisa de (5/1023) * 521 = 2,546v no pino (vou arredondar para 2,5v)

Para conseguir 1v no pino voce deve usar a seguinte formula:  5v =  5k.

Então para conseguir 2,5v = 2,5k, então coloca um resistor de 2,5k entre o GND e o potenciômetro, e usar um potenciômetro de 2,5k.  Total 5k.

 

Espero não ter confundido mais do que ajudado.

Rui

Oi Jonas, 

o valor 40 é decimal.

Rui

Não confundiu não, ficou muito bem esclarecido, desde já agradeço a atenção, agora vou para a prática, vamos ver como o arduino se comporta gerenciando um motor, valeu.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço