[TUTORIAL] - Computador de bordo através do TID

Faça você mesmo as instalações e manutenções em o seu Corsa.
Responder
cansei
:: Piquet ::
Mensagens: 319
Registrado em: Quinta-feira 06 2008f Março 2008 10:30:35 PM
Localização: São Paulo - SP
Modelo do veiculo: CORSA HATCH 1 8 FLEXPOWER
Ano de fabricação: 2004

Re: [TUTORIAL] - Computador de bordo através do TID

Mensagem por cansei »

ChavesHe escreveu:Eae galera blz?

Adicionei a função de temperatura interna sem problemas aproveitando quero criar um "gerenciamento" do A/C mas estou com o seguinte problema.

1- Aparece na tela o simbolo 4 quando a temperatura está acima da programada.
Ação: Funcionando perfeitamente

2- Apaga da tela o simbolo 4 quando a temperatura chega na programada.
Ação: Aparece "Até Logo!" e o simbolo "EON".

Método utilizado.

1 - Criado um item no menu para mostrar a temperatura.
2 - Criado uma função para o termômetro que chamada junto com a Ativade_led.
3 - Criado uma função para ligar e desligar o A/C na temperatura chamada junto com a Ativade_led.

Seria possível deixar-las em background mas fazer com eles rode a cada 30 secs?
Legal, eu sempre quis fazer isso mas meu carro nem tem A/C hehe

Eu precisava ver no detalhe o que vc fez... anexa o seu código pra eu dar uma olhada nele e aí eu aproveito e vejo essa questão de rodar em background a cada 30 segundos, da pra fazer isso sim.

fialho escreveu:Cansei, ainda está rolando a venda da placa? Tem um tempo que estou acompanhando e finalmente peguei meu corsa C.
Está rolando sim, entra em contato com o Guilherme que é ele que está gerenciando as vendas: gui_brandao_srs@hotmail.com
fialho escreveu:2 Duvidas:

1) o meu é aquele 12/12 com airbag, como faço pra saber se ele tem BCM? (eu acho que tem mas queria confirmar)
Só pelo ano já da pra dizer que não tem. Até onde sei só os corsas até 2006 saiam com BCM.

Pra saber se tem ou não é só ver como vc faz pra acender a luz do teto. Se no seu carro vc puxa o botão pra acender então seu carro não tem BCM. Se vc aperta o botão pra acender então ele tem BCM.

Mas já te falo que pro computador de bordo é indiferente ter BCM ou não viu, o que muda é só a questão da alavanca R/S.
fialho escreveu:2) o meu é o peladão que não vem nada (apesar do airbag rs), o TID, é apenas puxar os fios de alimentação né? (Igual esse tuto aqui https://www.youtube.com/watch?v=rsKnyW76elo)

Desde já obrigado
Pra ter o computador de bordo funcionando vc precisa pegar no mínimo os fios de alimentação (12V pós chave, 12V permanente, terra) e fio da velocidade (tanto esse quanto os outros 3 fios que mencionei vc encontra no chicote do som).

Legal esse vídeo, pode seguir as instruções deles.


ChavesHe
:: Super ::
Mensagens: 54
Registrado em: Sexta-feira 29 2016f Janeiro 2016 10:49:16 AM
Localização: Osasco - SP
Modelo do veiculo: CORSA HATCH PREMIUM 1.4 ECONOFLEX
Ano de fabricação: 2009

Mensagem por ChavesHe »

Cansei,

Segue o código, coloquei somente a parte do A/C.

Leitura do termômetro.

Código: Selecionar todos

void tempe_ac()
{
      byte type_s;
      byte data[12];
     
      byte addr[8];
      
      if ( !ds.search(addr)) {
        ds.reset_search();
        return;
      }

      // the first ROM byte indicates which chip
      switch (addr[0]) {
        case 0x10:
          type_s = 1;
          break;
        case 0x28:
          type_s = 0;
          break;
        case 0x22:
          type_s = 0;
          break;
        default:
          return;
      }

      ds.reset();
      ds.select(addr);
      ds.write(0x44, 1);        // start conversion, with parasite power on at the end

      ds.reset();
      ds.select(addr);
      ds.write(0xBE);         // Read Scratchpad

      for (byte i = 0; i < 9; i++) {           // we need 9 bytes
        data[i] = ds.read();
      }

      int16_t raw = (data[1] << 8) | data[0];
      if (type_s) {
        raw = raw << 3; // 9 bit resolution default
        if (data[7] == 0x10) {
          // "count remain" gives full 12 bit resolution
          raw = (raw & 0xFFF0) + 12 - data[6];
        }
      } else {
        byte cfg = (data[4] & 0x60);
        if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
        else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
        else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
        //// default is 12 bit resolution, 750 ms conversion time
      }
      celsius = (float)raw / 16.0;
      
      dtostrf(celsius,4,0,texttemp);  
}

Item do menu mostrando a temperatura interna.

Código: Selecionar todos

void menu_Ac()
{
  if (flagAc == 0)
  {
    calcula_intervalo();
    if (intervaloMiliSecs < 100)
      mydisplay.display_message(F("A/C"),10);
    else if (intervaloMiliSecs > 1000 && intervaloMiliSecs < 1300)
      mydisplay.display_message(F("A/C"),2);
    else if (intervaloMiliSecs > 1700 && intervaloMiliSecs < 2000)
      mydisplay.display_message(F("A/C"),2);
      
    else if (intervaloSecs >= 4)
    {
      flagAc = 1;
      //secs = 0;
    }
  }
  else if (flagAc == 1)
  {
    calcula_intervalo();
    if (intervaloMiliSecs >= 2000)
    {
      
      sprintf(textfinal, "Ti %s c", texttemp);
      mydisplay.display_message(textfinal,254);
      exibe_simbolo_colchete();
      zera_intervalo();
    }
  }
}
Função para ligar e desligar o A/C.

Código: Selecionar todos

void re_ac()
{
  
  //Aciona o rele
  if ( celsius > 25 ){
  //digitalWrite(8, HIGH);
  mydisplay.display_symbol(4);
  }
  else if (celsius < 25) {
  //Desliga o rele
  //digitalWrite(8, LOW);
  mydisplay.clear_symbol(4);
  }
}


cansei
:: Piquet ::
Mensagens: 319
Registrado em: Quinta-feira 06 2008f Março 2008 10:30:35 PM
Localização: São Paulo - SP
Modelo do veiculo: CORSA HATCH 1 8 FLEXPOWER
Ano de fabricação: 2004

Mensagem por cansei »

Eu precisava ver o código completo pra ver como vc está chamando cada função e pra te ajudar a construir o contador de tempo de 30 segundos (ou ver se da pra aproveitar algum outro que já ta no código), mas com o que vc postou já da pra dar algumas sugestões.


O código da leitura do termômetro vc ta chamando continuamente, não é? Se vc colocou a função no atividade_led então ela ta sendo chamada continuamente por 1 segundo, e no outro segundo ela não é chamada.
É esse código que vc quer rodar a cada 30 segundos? Se sim, é bom fazer isso sim. Temperatura é algo que muda devagar então vc não precisa ficar lendo ela toda hora.

Aproveite e tire a última linha, a "dtostrf(celsius,4,0,texttemp);". Vc já tem a temperatura armazenada na variável celsius, essa linha do dtostrf vc usa só quando for exibir a temperatura no TID.


O código pra exibir na tela eu tirei umas linhas de exibição do texto "A/C" (vc usa multiplas linhas do jeito que tava quando vc tem um texto maior que 10 caracteres e precisa fazer scroll dele na tela, nesse caso o texto "A/C" da pra exibir numa tacada só). E coloquei o dtostrf aqui.

Código: Selecionar todos

void menu_Ac()
{
  if (flagAc == 0)
  {
    calcula_intervalo();
    if (intervaloMiliSecs < 100)
      mydisplay.display_message(F("A/C"),255);
    else if (intervaloSecs >= 4)
      flagAc = 1;
  }
  else if (flagAc == 1)
  {
    calcula_intervalo();
    if (intervaloMiliSecs >= 2000)
    {
      dtostrf(celsius,4,0,texttemp);
      sprintf(textfinal, "Ti %s c", texttemp);
      mydisplay.display_message(textfinal,254);
      exibe_simbolo_colchete();
      zera_intervalo();
    }
  }
}

A função para ligar e desligar o A/C vc tb colocou no atividade_led?
Se sim (o que eu acredito ser o caso) vc tb pode chamar ela uma vez a cada 30 segundos, cai na mesma situação que eu comentei aí em cima. Essa função aqui é interessante vc chamar ela logo depois de fazer a leitura de temperatura.

E o problema que eu desconfiei estar causando o EON acender com o carro ligado está aqui. Vc não pode acionar os símbolos toda hora, eles são as funções mais pesadas que tem no TID e acontece todo tipo de maluquice quando se faz isso.

Aqui eu vou sugerir também que vc procure as funções "exibe_simbolo_colchete" e "apaga_simbolo_colchete" e crie funções equivalentes para o símbolo 4, e o código de acionamento vai ficar assim:

Código: Selecionar todos

void re_ac()
{
 
  //Aciona o rele
  if ( celsius > 25 ){
  //digitalWrite(8, HIGH);
  exibe_simbolo_cr();
  }
  else if (celsius < 25) {
  //Desliga o rele
  //digitalWrite(8, LOW);
  apaga_simbolo_cr();
  }
}


ChavesHe
:: Super ::
Mensagens: 54
Registrado em: Sexta-feira 29 2016f Janeiro 2016 10:49:16 AM
Localização: Osasco - SP
Modelo do veiculo: CORSA HATCH PREMIUM 1.4 ECONOFLEX
Ano de fabricação: 2009

Mensagem por ChavesHe »

Canse,

Show de bola!

O rele aciona e desliga mas o simbolo cr não some da tela kkkk mas deve ser alguma coisa q eu fiz errado, vou olhar com calma e te falo.

Como pedido segue a chamada das funções.

Código: Selecionar todos

void coisas_a_fazer_sempre(bool extras)
{
  if (extras == 1)
  {
    /*
      Colocar dentro deste if a chamada de funções extras ao computador de bordo
      que vocês venham a desenvolver que precisem rodar em background e que em
      algum momento use a função "atraso".
      
      Dentro dessas funções extras que vocês criarem, use a função atraso com o 
      segundo parâmetro igual a 0, da seguinte forma "atraso(TempoEmMiliSegundos,0);"
      
      Esta ação é obrigatória para evitar um loop infinito.
      
      Caso a função extra não use a função "atraso" mas precise trabalhar em background
      (independente do menu selecionado no TID), faça a chamada para ela de fora
      deste if.
      
      Caso a função extra não precise rodar em background, pode chamá-la de dentro
      do "switch (IndiceMenu)" criando um menu específico para sua função.
    */
   
    

  }  
  /* Coloque logo abaixo a chamada de funções extras que não vão usar a função "atraso" 
     mas que precisam trabalhar em background */
 // LED_atividade();
  tempe_ac();
  re_ac(); 

  
  //Leitura do min e max da bateria
  int sensorValue = analogRead(A0);
  float voltage = sensorValue * (5.0 / 1023.0);
  vin = voltage / (R2/(R1+R2));
  if (vin < vmin)
  {
    vmin = vin;
  }
  if (vin > vmax)
  {
    vmax = vin;
  }


ChavesHe
:: Super ::
Mensagens: 54
Registrado em: Sexta-feira 29 2016f Janeiro 2016 10:49:16 AM
Localização: Osasco - SP
Modelo do veiculo: CORSA HATCH PREMIUM 1.4 ECONOFLEX
Ano de fabricação: 2009

Mensagem por ChavesHe »

ChavesHe escreveu:Canse,

Show de bola!

O rele aciona e desliga mas o simbolo cr não some da tela kkkk mas deve ser alguma coisa q eu fiz errado, vou olhar com calma e te falo.

Como pedido segue a chamada das funções.

Código: Selecionar todos

void coisas_a_fazer_sempre(bool extras)
{
  if (extras == 1)
  {
    /*
      Colocar dentro deste if a chamada de funções extras ao computador de bordo
      que vocês venham a desenvolver que precisem rodar em background e que em
      algum momento use a função "atraso".
      
      Dentro dessas funções extras que vocês criarem, use a função atraso com o 
      segundo parâmetro igual a 0, da seguinte forma "atraso(TempoEmMiliSegundos,0);"
      
      Esta ação é obrigatória para evitar um loop infinito.
      
      Caso a função extra não use a função "atraso" mas precise trabalhar em background
      (independente do menu selecionado no TID), faça a chamada para ela de fora
      deste if.
      
      Caso a função extra não precise rodar em background, pode chamá-la de dentro
      do "switch (IndiceMenu)" criando um menu específico para sua função.
    */
   
    

  }  
  /* Coloque logo abaixo a chamada de funções extras que não vão usar a função "atraso" 
     mas que precisam trabalhar em background */
 // LED_atividade();
  tempe_ac();
  re_ac(); 

  
  //Leitura do min e max da bateria
  int sensorValue = analogRead(A0);
  float voltage = sensorValue * (5.0 / 1023.0);
  vin = voltage / (R2/(R1+R2));
  if (vin < vmin)
  {
    vmin = vin;
  }
  if (vin > vmax)
  {
    vmax = vin;
  }
Achei o problema do cr.


Obs. Não sei como edita o post.


fialho
:: Wind ::
Mensagens: 9
Registrado em: Quinta-feira 30 2015f Abril 2015 07:33:20 PM
Localização: São Paulo - SP
Modelo do veiculo: CORSA (DEMAIS)
Ano de fabricação: N/I

Mensagem por fialho »

cansei escreveu:
fialho escreveu:2 Duvidas:

1) o meu é aquele 12/12 com airbag, como faço pra saber se ele tem BCM? (eu acho que tem mas queria confirmar)
Só pelo ano já da pra dizer que não tem. Até onde sei só os corsas até 2006 saiam com BCM.

Pra saber se tem ou não é só ver como vc faz pra acender a luz do teto. Se no seu carro vc puxa o botão pra acender então seu carro não tem BCM. Se vc aperta o botão pra acender então ele tem BCM.

Mas já te falo que pro computador de bordo é indiferente ter BCM ou não viu, o que muda é só a questão da alavanca R/S.
Blz, muito obrigado por ajudar e manter esse projeto ativo por tanto tempo, é um dos poucos projetos que tem aqui que quero fazer que ainda está ativo


cansei
:: Piquet ::
Mensagens: 319
Registrado em: Quinta-feira 06 2008f Março 2008 10:30:35 PM
Localização: São Paulo - SP
Modelo do veiculo: CORSA HATCH 1 8 FLEXPOWER
Ano de fabricação: 2004

Mensagem por cansei »

ChavesHe escreveu:Achei o problema do cr.


Obs. Não sei como edita o post.
Seria bom vc fazer o contador de tempo pra chamar essas funções viu. Duplica as funções zera_intervalo e calcula_intervalo (criando variáveis novas pra não contaminar as outras). Chamar esse termômetro toda hora não é bom.

Mais pra baixo do coisas a fazer sempre tem um contador que roda a cada 1 segundo, vc pode chamar essas duas funções do termômetro lá de dentro que já ajuda bastante.
fialho escreveu:Blz, muito obrigado por ajudar e manter esse projeto ativo por tanto tempo, é um dos poucos projetos que tem aqui que quero fazer que ainda está ativo
De nada. Na medida do possível eu sempre dou uma passada aqui.


Avatar do usuário
thiiagoarts
:: Wind ::
Mensagens: 21
Registrado em: Quarta-feira 01 2012f Agosto 2012 09:36:38 PM
Localização: São Sebastião do Passé - BA
Modelo do veiculo: CORSA HATCH 1.0 MPFI 8V 71CV
Ano de fabricação: 2004

Mensagem por thiiagoarts »

Salve galera vi Aqui que teve novidades [emoji122][emoji122][emoji122][emoji122] show de bola

Enviado de meu XT1563 usando Tapatalk


ChavesHe
:: Super ::
Mensagens: 54
Registrado em: Sexta-feira 29 2016f Janeiro 2016 10:49:16 AM
Localização: Osasco - SP
Modelo do veiculo: CORSA HATCH PREMIUM 1.4 ECONOFLEX
Ano de fabricação: 2009

Mensagem por ChavesHe »

Cansei,

Não estou conseguindo, criei as novas funções de tempo e mesmo assim continua dando o bug do até logo.
Tirei o simbolo e tbm aparece o até logo.
E está atrapalhando o consumo, ele não identifica direto se o carro está andado.

Se poder da uma olhada como fiz.

Chamada das funções.

Código: Selecionar todos

//Calculo de Vel, vel max e Consumo em L/h
  calcula_intervalo_C();
  if (intervaloSecsC >= 1)
  {
    zera_intervalo_C();
    //Coloque abaixo a chamada de funções extras que precisam rodar a cada 1 segundo em background sem precisar exibir nada no TID
    tempe_ac(); // Função do termometro
     re_ac(); // Função acionamento do A\C
    
    //Calculo vel e vel max
    VelKmPorHBKG = (DistVelCountBKG/16) * fatorVel * 3.6;
    DistVelCountBKG = 0.0;
    if (VelKmPorHBKG > VelKmMax)
    {
      VelKmMax = VelKmPorHBKG;
    }

As funções novas.

Código: Selecionar todos

void exibe_simbolo_cr()
{
  if (flag_simbolo_cr == 0)
  {
    mydisplay.display_symbol(4);
    flag_simbolo_cr = 1;
  }
}

void apaga_simbolo_cr()
{
  
   if (flag_simbolo_cr == 1)
  {
    mydisplay.clear_symbol(4);
    flag_simbolo_cr = 0;
  }
}

void zera_intervalo_Ac() //Momento zero/inicial. Marca o instante que começa a contagem
{
  milisecac = millis();
  secsac = milisecac/1000;
}

void calcula_intervalo_Ac() //Calcula o tempo que passou desde o momento 0
{
  milisec1ac = millis();
  secs1ac = milisec1ac/1000;
  intervaloMiliSecsac = milisec1ac - milisecac;
  intervaloSecsac = secs1ac - secsac;
}

void tempe_ac()
{
      byte type_s;
      byte data[12];
      byte addr[8];
      
      if ( !ds.search(addr)) {
        ds.reset_search();
        return;
      }

      // the first ROM byte indicates which chip
      switch (addr[0]) {
        case 0x10:
          type_s = 1;
          break;
        case 0x28:
          type_s = 0;
          break;
        case 0x22:
          type_s = 0;
          break;
        default:
          return;
      }

      ds.reset();
      ds.select(addr);
      ds.write(0x44, 1);        // start conversion, with parasite power on at the end

      ds.reset();
      ds.select(addr);
      ds.write(0xBE);         // Read Scratchpad

      for (byte i = 0; i < 9; i++) {           // we need 9 bytes
        data[i] = ds.read();
      }

      int16_t raw = (data[1] << 8) | data[0];
      if (type_s) {
        raw = raw << 3; // 9 bit resolution default
        if (data[7] == 0x10) {
          // "count remain" gives full 12 bit resolution
          raw = (raw & 0xFFF0) + 12 - data[6];
        }
      } else {
        byte cfg = (data[4] & 0x60);
        if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
        else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
        else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
        //// default is 12 bit resolution, 750 ms conversion time
      }
      celsius = (float)raw / 16.0;
}

void re_ac()
{
  
  calcula_intervalo_Ac();
  if ( intervaloMiliSecsac <3) {
  //Aciona o rele
  if ( celsius > 24 ){
  //digitalWrite(8, HIGH);
  exibe_simbolo_cr();
  zera_intervalo_Ac();
  }
  else  if (celsius < 24) {
    //Desliga o rele
  //digitalWrite(8, LOW);
  apaga_simbolo_cr();
  zera_intervalo_Ac();
  }
  }
}

void menu_Ac()
{
  if (flagAc == 0)
  {
    calcula_intervalo();
    if (intervaloMiliSecs < 100)
      mydisplay.display_message(F("A/C"),255);
    else if (intervaloSecs >= 4)
      flagAc = 1;
  }
  else if (flagAc == 1)
  {
    calcula_intervalo();
    if (intervaloMiliSecs >= 2000)
    {
      dtostrf(celsius,4,0,texttemp);
      sprintf(textfinal, "Ti %s c", texttemp);
      mydisplay.display_message(textfinal,254);
      exibe_simbolo_colchete();
      zera_intervalo();
    }
  }
}
Muito obrigado!


cansei
:: Piquet ::
Mensagens: 319
Registrado em: Quinta-feira 06 2008f Março 2008 10:30:35 PM
Localização: São Paulo - SP
Modelo do veiculo: CORSA HATCH 1 8 FLEXPOWER
Ano de fabricação: 2004

Mensagem por cansei »

Acho que é a leitura do termômetro que ta causando isso. Deleta a chamada da função tempe_ac(); e faz um teste, vê se sem ler o termômetro o problema ainda acontece.

Supondo que isso resolveu o problema, o negócio é ler essa temperatura em intervalos maiores.
As funções que vc criou zera_intervalo_Ac() e calcula_intervalo_Ac() tão ok, então tira a chamada das funções tempe_ac(); e re_ac(); de onde elas tão e coloca elas logo abaixo da chamada da função LED_atividade(); da seguinte forma:

Código: Selecionar todos

  LED_atividade();
  
  calcula_intervalo_Ac();
  if (intervaloSecsac >= 30) {
    tempe_ac();
    re_ac();
    zera_intervalo_Ac();
  }
  
  //Calculo vel e vel max
  VelKmPorHBKG = (DistVelCountBKG/16) * fatorVel * 3.6;  
  
A função re_ac(); vc vai mudar e deixar da seguinte forma:

Código: Selecionar todos

void re_ac()
{
  //Aciona o rele
  if ( celsius > 24 ){
  //digitalWrite(8, HIGH);
  exibe_simbolo_cr();
  }
  else  if (celsius < 24) {
    //Desliga o rele
  //digitalWrite(8, LOW);
  apaga_simbolo_cr();
  }
}
Faz um teste e veja se assim resolveu.


Responder
  • Tópicos Semelhantes
    Respostas
    Exibições
    Última mensagem

Voltar para “Tutoriais”