olá galera do LdG.

Instalei um kit de suspensão a ar no meu carro e como tinha uma arduino uno em casa, resolvi pensar em utiliza-lo para controlar a suspensão.

pretendo utilizar um potenciômetro em cada caixa de roda ligado a bandeja da suspensão. Os potenciômetros irão informar a altura do veiculo em tempo real em um display lcd 24X4 (4 fios)

minha ideia é colocar no display números de 1 a 4, sendo 4 alturas pré-programadas

considerando a posição mais baixa como 0% e a mais alta 100%

Exemplo: como será mostrado no display

DE     DD      SUSPENSÃO     1     2

20      21             CIVC            *

21      20          RODRIGO       3     4

TE     TD        SCHNEIDER

DE=bolsa dianteira esquerda (abaixo, o valor lido pelo respectivo potenciômetro, em porcentagem)

DD=bolsa dianteira direita (valor abaixo)

TE=bolsa traseira esquerda (valor mostrado acima)

TD=bolsa traseira direita (valor acima)

no centro do display apenas um texto qualquer

na direita a posição utilizada no momento(o "*" mostra a altura configurada, pretendo usar um símbolo que preencha toda a célula abaixo da configuração selecionada)

uma outra função que pretendo utilizar é quando desligar o carro, vá para a posição 0% (as bolsas secam completamente) e quando ligar o carro vá para a posição 1 (20%)

para alterar da posição 1 pra 2, da 2 pra 3 e da 3 pra 4, pretendo utilizar o mesmo botão (botão de pulso, onde cada pulso avança para a próxima configuração e no display mude a posição do símbolo)

para retornar da posição 4 pra 3, da 3 pra 2 e da 2 pra 1, utilize outro botão, semelhante ao que avança as configurações

as mudanças devem ser feitas baseadas nas leituras dos potenciômetros.

exemplo.

posição 1 se refere a 20% de leitura. quando o botão que avança as posições for acionado, a arduino leia os potenciômetros e trabalhe com as válvulas solenoides que fazem encher as bolsas, até que a leitura no potenciômetro fique dentro da programada na posição 2 (tipo 30%), assim que atingir a posição programada, feche as válvulas.

esse ajuste não pode ficar em loop, pois com o carro em movimento, os potenciômetros vão ficar variando as leituras, fazendo com que as válvulas fiquem abrindo e fechando.

enfim, conheço pouco de linguagem de programação, mas já consegui fazer a leitura dos potenciômetros convertidos pra porcentagem, falta configurar os botoes e programar essas posições. o display posso deixar pra programar depois, ainda nem tenho um.

acredito que se eu conseguir um comando, onde tenha uma fila de leds e dois botoes, onde um botão faça com que um led apague e acenda o próximo, mais um pulso e o processo se repita. o outro botão faça o movimento contrario. nesse caso mudaria apenas a ação para leitura dos potenciômetros e completaria com a função "if" comandando as válvulas pelas saídas digitais.

aceito outras ideias, sem gastar muito, é claro :)

se alguém puder ajudar ficarei muito grato.

contato pessoal. rso-123@hotmail.com

wattsapp: (91) 98229-4194

 

Exibições: 2201

Responder esta

Respostas a este tópico

vou colocar um "braço" no potenciometro. vai ficar parecido com um servo.

procure por "i-system". é o sistema inteligente da Tebão suspensões.

estou fazendo um sistema parecido, porem gastando bemmmm menos.

gente.

me deparei com uma dificuldade.

programei o controle das valvulas que controlam a suspensao, mas do jeito que fiz ele fica corrigindo o tempo todo e isso exige muito ar.

preciso que ele faça as correções somente se a leitura dos potenciometros ficarem fora do intervalo por 3 segundos, ou seja, com o carro em movimento os potenciometros ficam medindo a altura o tempo todo e essa medida fica variando muito devido o movimento das balanças. 

do jeito que programei, quero que fique na altura de 20% e caso a leitura esteja abaixo de 20% ele abre a valvula que faz encher a bolsa de ar, caso a leitura esteja acima de 20% ele abre a valvula que seca a bolsa. mas só quero que ele faça a correção se ele ficar abaixo/acima de 20% por 3 segundos.

como faço pra programar esses 3 segundos?

DE = (analogRead(A0)/10.23);
if(a == 1)
{
analogRead(DE);
if(DE < 20)       NESSA PARTE
{digitalWrite(sobeDE, HIGH);}
else(digitalWrite(sobeDE, LOW));
}

quero colocar os 3 segundos nessa parte que destaquei acima

tipo: if(DE < 20, POR 3 SEGUNDOS)

Para ver se a leitura permanece abaixo de 20 por 3 segundos, você pode usar o millis, mas o processamento ficará ocupado durante esses 3 segundos. O melhor seria usar um RTC, pois a operação com millis não será perfeita.

Veja se dá certo assim:

DE = (analogRead(A0) / 10.23);
while ((DE < 20) && ((millis() % 3000) != 0))
{
  DE = (analogRead(A0) / 10.23);
}
if (DE < 20) ... continue o código aqui

bom dia.

como você falou, funcionou, mas quando fica abaixo de 20% ele só lê de 3 em 3 segundos, não queria dessa forma, pois o programa para de rodar nesses 3 segundos.

o RTC ocupa 2 portas analogicas e eu não tenho nenhuma disponível.

vou usar 4 para os potenciômetros e 2 para o lcd

será que não existe algum código que rode independente do programa?

muito obrigado

será que essa função daria pra usar?

https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

não sei como inserir no meu codigo, mas parece que ela conta um determinado tempo sem interromper o programa principal

Tem um jeito de contar o tempo sem interromper o processamento.

Tente fazer assim:

Crie uma variável global no início do sketch para controlar o tempo

unsigned long tempo = 0;

No seu programa, na parte da leitura inicie a contagem do tempo da seguinte forma:

if(tempo == 0) {

  tempo = millis();

}

Faça a leitura e crie uma variável de flag para controlar se ela ficou abaixo de 20

DE = (analogRead(A0) / 10.23);

boolean abaixo = (DE < 20);

Teste se já atingiu 3 segundos e faça os processamentos necessários

if ((millis()-tempo) >= 3000){

  tempo = 0 

  if(abaixo) { ... faça aqui o processamento

Rodrigo, desculpe. Há uma falha no algoritmo anterior. A leitura tem que se manter durante todos os 3 segundos abaixo do 20. Então o certo é:

Crie variáveis globais no início do sketch para controlar o tempo e a leitura:

unsigned long tempo = 0;

boolean abaixo = false;

No seu programa, na parte da leitura inicie a contagem do tempo da seguinte forma:

if(tempo == 0) {

  tempo = millis();

  abaixo = false;

}

Faça a leitura e crie uma variável de flag para controlar se ela ficou abaixo de 20

DE = (analogRead(A0) / 10.23);

if (DE > 20){ //Se uma ficou acima no período, então não pode ser levada em conta

  abaixo = true;

}

Teste se já atingiu 3 segundos e faça os processamentos necessários

if ((millis()-tempo) >= 3000){

  tempo = 0 

  if(abaixo) { ... faça aqui o processamento

Obs: Para ficar mais eficiente, você pode zerar todos os contadores no if (DE > 20)

analogRead(DE);
if (DE < 18){ //Se uma ficou acima no período, então não pode ser levada em conta
abaixo = true;
}
if ((millis()-tempo) >= 3000){
tempo = 0;
if(abaixo)
{digitalWrite(sobeDE, HIGH);}
else (digitalWrite(sobeDE, LOW));

}

deixei assim,

quando esta acima de 20, o sobeDE fica em LOW. ok

quando fica abaixo de 20, ele conta os 3 segundos e vai pra HIGH. ok

mas quando volta acima de 20 ele só vai pra LOW depois dos 3 segundos. nesse caso eue queria que fosse imediatamente pra LOW, sem contar o tempo.

só é pra contar os três segundos enquanto estiver abaixo.

outra, a cada vez q a leitura for acima ele deve zerar esses 3 segundos, ou seja, só vai ficar em HIGH caso permaneça abaixo por 3 segundos corridos, se ele der uma leitura acima ele zera o tempo novamente.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço