Controlador de caixa automatica para Volvo (quase pronto ajuda no codigo)

Olá, sou novo aqui no forum e também no mundo Arduino, estou de momento a desenvolver um controlador para a caixa automática do meu volvo 850 T5 com o arduino ligado á caixa automatica e ao modulo de comando da caixa original do carro, com dois switchs junto ao volante consigo mudar de mudança manualmente, como nos carros com patilhas de origem.

O modulo que estou a desenvolver funciona da seguinte forma(algum do codigo é meu e outro tirei de outro projecto que encontrei na internet)

1- um interruptor permite-me alternar entre o modulo de comando original e o meu

2- quando em modo automático o arduino monitoriza os comandos dados à caixa pelo modulo original e indica no display de 7 segmentos em que mudança estou a andar.

3-quando pressiono para passar a modo manual dois switch junto ao volante permitem-me mudar de mudança e reduzir de mudança. O arduino esta ligado a 3 solenoides na caixa que quando activados na sequência correcta fazem com que a caixa mude de mudança.

4-sempre que mudo de mudança manualmente o display de 7 segmentos também me indica em que mudança estou

Até aqui esta tudo correcto e a funcionar, porem sempre que quero passar do modo automático para manual tenho de parar o carro pois por defeito sempre que passo para manual ele vai para a 1ª mudança e é justamente aqui que preciso de ajuda.

Um vez que quando em modo automático estou a monitorizar o modulo de controle original, quero que quando pressionado o botão para passar de auto para manual o meu modulo inicie na ultima mudança lida do modulo original.

Exemplo vou com a caixa em modo automático a circular em 3ª e quando passo para manual ele inicia o modo manual também em 3ª podendo eu depois reduzir ou aumentar a mudança manualmente.

Segue o meu codigo

int gear = 1;
// output pins for transistor/relays controlled solenoids
int solA = 4;
int solB = 5;
int solC = 1;
// input pins for up down /  with pullup resistors
int gearup = 2;
int geardown = 3;
int sol1 = 14; //from the original TCU-read
int sol2 = 15; //from the original TCU-read
int sol3 = 16; //from the original TCU-read
int man = 17; // switch that change from auto to manual paddle shift
int val = 0; //val to read pin 14
int val2 = 0; //val to read pin 15
int val3 = 0; //val to read pin 16
int val4 = 0; //val to read the switch that change from auto to manual
//for 7 segment display
int b=7, a=6, e=10, d=9, f=11, c=8, g=12;

void setup() {
  pinMode(solA, OUTPUT);
  pinMode(solB, OUTPUT);
  pinMode(solC, OUTPUT);
  pinMode(gearup, INPUT);
  pinMode(geardown, INPUT);
  pinMode(sol1, INPUT_PULLUP);
  pinMode(man, INPUT_PULLUP);
  pinMode(sol2, INPUT_PULLUP);
  pinMode(sol3, INPUT_PULLUP);
  
  //pins for display
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);

}
//Manual Paddle shift mode
void loop() {
  if(gear == 1 && val4 == LOW){
    digitalWrite(solA, 0);
    digitalWrite(solB, 1);
    digitalWrite(solC, 0);
    one();
  }
  if(gear == 2 && val4 == LOW){
    digitalWrite(solA, 1);
    digitalWrite(solB, 1);
    digitalWrite(solC, 0);
    two();
  }
  if(gear == 3 && val4 == LOW){
    digitalWrite(solA, 1);
    digitalWrite(solB, 0);
    digitalWrite(solC, 0);
    three();
  }
  if(gear == 4 && val4 == LOW){
    digitalWrite(solA, 0);
    digitalWrite(solB, 0);
    digitalWrite(solC, 0);
    four();
  }
  if(gear == 5 && val4 == LOW){
    digitalWrite(solC, 1);
    five();
  }

  //display when reads from the original auto TCU
  
  val=digitalRead(sol1);
  val2=digitalRead(sol2);
  val3=digitalRead(sol3);
  val4=digitalRead(man);
  
  
  if (val == HIGH && val2 == LOW && val3 == HIGH && val4 == HIGH) //gear 1
  {
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  
}
if (val == LOW && val2 == LOW && val3 == HIGH && val4 == HIGH) //gear 2
{
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  
}
if (val == LOW && val2 == HIGH && val3 == HIGH && val4 == HIGH) //gear 3
{
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  
}
if (val == HIGH && val2 == HIGH && val3 == HIGH && val4 == HIGH) //gear 4
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, LOW);
  
}
if (val == HIGH && val2 == HIGH && val3 == LOW && val4 == HIGH) //gear 5
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, LOW);
  digitalWrite(g, HIGH);
   
}




  //takes care of gear switching

  delay(120); //delay to prevent going through gears too quick from holding the button or pressing too long

 gear += digitalRead(geardown) - digitalRead(gearup); // non debounced! But may not be a problem because of the delay by gear change
  if(gear < 1) gear = 1;
  if(gear > 5) gear = 5;//limits to actual gearset
}

//for displaying numbers
void one()  //Writes a #1 on the display
{
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  
}
void two()  //Writes a #2 on the display
{
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  
}
void three()  //Writes a #3 on the display
{
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  
}
void four()  //Writes a #4 on the display
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, LOW);
  
}
void five()  //Writes a #5 on the display
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, LOW);
  digitalWrite(g, HIGH);
   
}
void six()  //Writes a #6 on the display
{
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  
}
void seven()  //Writes a #7 on the display
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  
}
void eight()  //Writes a #8 on the display
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
 
}
void nine()  //Writes a #9 on the display
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);

}

É muito pouco correcto colocar a mesma questão em dois locais diferentes do fórum à espera (não sei de quê, se calhar os que falam Português são mais burros que os outros, por isso não devem saber responder às questões).
Sendo assim, da minha parte espero que lhe respondam à questão colocada no outro local, porque não vou contribuir para a resolução do problema aqui.

Boa sorte!

Bem, julgo que fui mal interpretado, a questão só foi colocada em dois locais distintos porque cerca de 90% das pessoas deste forum não falam português de certeza e apesar de ser novo neste mundo ja consegui perceber que este universo Arduino é todo muito OpenSource logo da mesma forma que eu para fazer este código recorri a exemplos e ideias de outros e ''afinei'' conforme consegui para as minhas necessidades, julgo que além da ajuda que necessito também será justo partilha o código numa língua mais universal que o português!

Caro luisilva não se sinta menosprezado de certeza (vendo pelo sue numero de posts) que é um excelente programador agora eu com 3 posts nem sabia que este forum tinha uma secção em português antes de ter colocado em outra secção o meu ''projecto''

Não é uma questão de me sentir ou deixar de sentir menosprezado. É apenas uma questão de respeito e de dar cumprimento às regras. Se se tivesse preocupado com as regras tinha lido este e este posts, onde estão todas referidas. Uma delas é:

Don't cross-post!

Também pode ver logo no início do segundo post que indiquei em cima:

3. Choose the correct language

Por isso não sei muito bem o que falta para perceber o que se tem que fazer. Pelos visto não é falta compreensão da lingua Inglesa.

O teu código é bastante esquisito… e não ver o sistema não ajuda…

No entanto, a leitura dos pinos está num sítio estranho. Isto devia ser o caso:

void loop() {
  val4=digitalRead(man);
  if(gear == 1 && val4 == LOW){

Depois tu não tens uma variável para tomar conta do valor da mudança actual. O teu código assume que a mudança actual é a que tu seleccionaste com os switches… o que não é o caso.
O motivo pelo qual a mudança vai para um é por causa disto:

int gear = 1;

Para melhorares este aspecto deves fazer algo como:

if (val4 == LOW) {//apenas aceitar comandos quando o switch está na posição correcta... 
    gear += digitalRead(geardown) - digitalRead(gearup); 
    if(gear < 1) gear = 1;
    if(gear > 5) gear = 5;//limits to actual gearset
}

E:

  if (val == HIGH && val2 == LOW && val3 == HIGH && val4 == HIGH) //gear 1
  {
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  gear = 1;
}
if (val == LOW && val2 == LOW && val3 == HIGH && val4 == HIGH) //gear 2
{
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  gear = 2;
}
if (val == LOW && val2 == HIGH && val3 == HIGH && val4 == HIGH) //gear 3
{
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  gear = 3;
}
if (val == HIGH && val2 == HIGH && val3 == HIGH && val4 == HIGH) //gear 4
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, LOW);
  gear = 4; 
}
if (val == HIGH && val2 == HIGH && val3 == LOW && val4 == HIGH) //gear 5
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, LOW);
  digitalWrite(g, HIGH);
  gear = 5;  
}

Estou a assumir que o val4 == LOW significa estar em Manual e quando passa a HIGH está em Automático.

Dito isto, poderias melhorar imenso o teu código… I-M-E-N-S-O, mas isto assim deve funcionar.