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
Tags:
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.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por