Tarde galera, so novato quando o assunto é arduino kkkk ainda to aprendendo a programar...

Seguinte tenho a ideia de colocar um computador de bordo em meu carro usando o arduino, procurei muito na internet e oque achei nao tinha muito conteúdo :/  

Quero a ajuda de voces para tocar esse prejeto e ate disponibilizar aqui no forum

Minha ideia é ter, leitura da sonda lambda, temperatura do motor, nivel de combustivel, carga da bateria, informação sobre o avanço do motor, e a hora e data e se poissivel o simbolo da fiat quando inicia, e as telas sendo alternadas por um botao

Alguem pode me dar uma luz, ou algum tutorial ja em andamento ?  

Exibições: 3768

Responder esta

Respostas a este tópico

alguem ?

Thiago,

Parece um projeto bem genérico, ou seja, necessita ser mais específico.

Seu carro possui o conector ODBII?

Nesse caso, as informações já estão disponíveis, bastando o adicionar o leitor bluetooth e um smartphone/tablet/pc para ter essas informações.

Thiago, esta usando a interface ODBII do seu FIAT ? Qual é o link da sua interface?

Qual é o modelo e ano do seu FIAT ? 

http://www.instructables.com/id/Hack-an-ELM327-Cable-to-make-an-Ard...

na realidade nao quero usar a interface do modulo do carro, pois ela usa protocola CAM, fica muito dificil estabelecer a comunicação entre o arduino e a centralina

Meu carro é um fiat marea 2.0

Boa noite, 

A interface ODB2 faz a comunicação entre a interface CAN do carro e a interface serial ( possível com o Arduino). 

Ou com a interface Bluetooth.

http://www.instructables.com/id/Arduino-OBD2-ELM327-I2C-LCD-HC05-Bl...

ou esse :

É que no caso do meu carro a interface obd é a mais antiga, no meu caso oque poderia dar certo e fazer o arduino teria de ler os sensores do carro...

comecei o projeto mas tenho muita dificuldade com a programação do arduino, nunca havia trabalhado com linguagem c++

Envie uma foto do conector da interface ODB do seu Fiat Marea. 

Qual  é o ano do seu carro ?

Achei isso :

http://www.fiat-bg.com/Downloads/Books/Marea_Workshop_Manual/Volume...

Boa noite,

Poste aqui a especificação de cada componente/sensor que está esperando medir.

Ai será mais fácil te dizer o que dá pra fazer.

  'Eiju

achei um codigo que é exatamente oque procuro, so falta incluir no codigo a parte da sonda lambda e a tela q roda quando o arduino é iniciado...

Porem o codigo foi feito para trabalhar com um lcd da nokia, e o lcd que tenho aqui e um grafico com a tela azul...

Sera que tem como alterar o codigo para funcionar com o lcd q tenho ? 
A parte fisica para converter os sinais e adequar a o arduino eu sei fazer, so tenho problema para fazer o codigo ou alterar ele 

bom galera os sensores trabalham de 5 a  14 (bateria carregando ) 
No caso o computador e bordo e para um veiculo da fiat, vi que algumas pessoas ja fizeram isso, mas nao achei os projetos

Esse é o cogido que falei 

#include <U8glib.h>
#include <PCD8544.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
// criando as variaveis na global
//======================================================================================================
char state=1; // variável que guarda posição atual do menu
int sensorValue1, sensorValue2, sensorValue3, sensorValue4, sensorValue5, sensorValue6, sensorValue7, sensorValue8; // entradas analogica de A0 a A7
// porta Analogicas
// A0 sensorValue1 pressão combustivel
// A1 sensorValue2 pressão oleo
// A2 sensorValue3 temperatura motor
// A3 temperatura
float tensao = 0; // variaveis da tensão da bateria
byte detecta = 2; // porta de detecção de rpm
int contador = 0; // contador de rpm
// Dimensão do lcd (in pixels)...
static const byte LCD_WIDTH = 84;
static const byte LCD_HEIGHT = 48;
// O número de linhas para o gráfico de temperatura...
static const byte CHART_HEIGHT = 5;
// Um símbolo de "graus" customizado...
static const byte DEGREES_CHAR = 1;
static const byte degrees_glyph[] = { 0x00, 0x07, 0x05, 0x07, 0x00 };
// A bitmap graphic (10x2) of a thermometer...
static const byte THERMO_WIDTH = 10;
static const byte THERMO_HEIGHT = 2;
static const byte thermometer[] = { 0x00, 0x00, 0x48, 0xfe, 0x01, 0xfe, 0x00, 0x02, 0x05, 0x02,
0x00, 0x00, 0x62, 0xff, 0xfe, 0xff, 0x60, 0x00, 0x00, 0x00};

static PCD8544 lcd;
void setup(){

// inicia o lcd nokia 5110
lcd.begin(LCD_WIDTH, LCD_HEIGHT);
Serial.begin(9600);
mySerial.begin(9600);

// Registre o símbolo personalizado...
lcd.createChar(DEGREES_CHAR, degrees_glyph);


// Botões

pinMode(13, OUTPUT);
digitalWrite(13,HIGH);
pinMode(detecta,INPUT);
digitalWrite(detecta,HIGH);
contador = 0;
attachInterrupt(0, DETECTA, FALLING);
noInterrupts();

lcd.clear();

}
void loop() {

// processamento do contagiros
unsigned long tempo = millis();
while(tempo +300 > millis())
{
interrupts();
}
digitalWrite(13,LOW);
int rpm = contador;
contador = contador * 100 ;

// faz a varredura das portas analogicas
//==============================================================
sensorValue1 = analogRead(0); // analog input 0
sensorValue2 = analogRead(1); // analog input 1
sensorValue3 = analogRead(2); // analog input 2
sensorValue4 = analogRead(3); // analog input 3
sensorValue5 = analogRead(4); // analog input 4
sensorValue6 = analogRead(5); // analog input 5
sensorValue7 = analogRead(6); // analog input 6
sensorValue8 = analogRead(7); // analog input 7
// local onde manda os valores para a serial para tratamento no processing que sera enviada pelo bluetooh

// tratamento da tensão da bateria para exibir no display
//==============================================================
tensao = sensorValue7 * 0.00488 ;
tensao = tensao * 4 ;

//mySerial.print("ola");// porta serial bluetooth para enviar dados trocado pela serial

// exibi na tela os valores de tensão e nivel combustivel
//==============================================================
float Combustivel = (sensorValue3 * 0.25390625 * 100.0 / 1024 ) -1.0;
if (Combustivel > 8){ Combustivel= 0;}
// tratamento da tensão da bateria para exibir no display
//===============================================================
float temperaturaEmCelsius = ( 5 * sensorValue2 * 100.0 / 1024);
if (temperaturaEmCelsius > 150){ temperaturaEmCelsius = 150.0;}
//================================================================

lcd.setCursor(0, LCD_HEIGHT/8 - THERMO_HEIGHT);
lcd.drawBitmap(thermometer, THERMO_WIDTH, THERMO_HEIGHT);
lcd.setCursor(0, 0);
lcd.print(" BAT: ");
lcd.print(tensao); // tensão da bateria
lcd.print(" V ");
lcd.setCursor(0, 2);
lcd.print("TANQUE: ");
lcd.print(contador); // tensão da bateria
lcd.print(" Lts");
lcd.print(" ");
lcd.setCursor(14, 4);
lcd.print(" TEMP:");
lcd.setCursor(14, 5);
lcd.print(temperaturaEmCelsius, 1);
lcd.print(" \001C ");

// local onde manda os valores para a serial para tratamento no processing
// apenas para depuração na serial
Serial.print(contador); // print rpm
Serial.print(","); // print ','
Serial.print(sensorValue1); // print sensor 1
Serial.print(","); // print ','
Serial.print(temperaturaEmCelsius); // print sensor 2
Serial.print(","); // print ','
Serial.print(Combustivel); // print sensor 3
Serial.print(",");
Serial.print(sensorValue4); // print sensor 4
Serial.print(",");
Serial.print(sensorValue5); // print sensor 5
Serial.print(",");
Serial.print(sensorValue6); // print sensor 6
Serial.print(",");
Serial.print(tensao); // print sensor 7
Serial.print(",");
Serial.println(sensorValue8); // print sensor 8 (println)


//========================================================================
}
void DETECTA()
{
contador ++;
Serial.print(contador);
}

//codigo processing
//===========================================================================
// Importa bibliotecas para Serial
import processing.serial.*;
Serial port; // Inicia instância de porta serial
int Rpm, oleo, Nivel_combustivel, Ar, tensao;
float temperatura;
float combustivel;
int end = 10; // tele número 10 é ASCII para linefeed (fim de Serial.println), mais tarde, vamos olhar para este para quebrar mensagens individuais
String serial; // declarar uma nova seqüência chamada "série". Uma string é uma sequência de caracteres (tipo de dados conhecida como "char")
void setup(){
frame.setTitle (" Monitor V4.0");
// Define tamanho da janela
size(800,600);
// Inicia porta serial na COM3 a 9600 bauds
//port = new Serial(this, "COM3", 9600);
port = new Serial(this, Serial.list()[0], 9600); // inicializar o objeto através da atribuição de uma taxa portuária e de transmissão (deve corresponder ao do Arduino)
port.clear(); // função da biblioteca de série que joga para fora a primeira leitura, no caso que começou a ler no meio de uma seqüência de Arduino
serial = port.readStringUntil(end); // função que ler a cadeia da porta serial até que um println em seguida, atribui seqüência à nossa cadeia variável (chamado 'série')
serial = null; // inicialmente, a seqüência será nulo (vazio)

textFont(createFont("ArialNarrow-Bold", 40));
}
void draw(){

textSize(13);

// Enquanto receber algo pela serial
while (port.available() > 0) { //enquanto não há dados provenientes de porta serial, lê-lo e armazená-lo
serial = port.readStringUntil(end);
}
if (serial != null) { //se a cadeia não está vazia, imprima o seguinte

/* Nota: a função split usado a seguir não é necessário se o envio de uma única variável. No entanto, é útil para analisar (separação) mensagens quando
leitura de múltiplas entradas em Arduino. Abaixo é exemplo de código para um esboço Arduino
*/

String[] a = split(serial, ','); //uma nova matriz (chamada de 'a') que armazena valores em células separadas (separados por vírgulas especificadas em seu programa Arduino)
println(a[0]); // imprimir Value1 (na célula 1 de Array - lembre-se que as matrizes são zero-indexada)
println(a[1]); //imprimir valor Value2
println(a[2]);
println(a[3]);
println(a[4]);
println(a[5]);
println(a[6]);
println(a[7]);
println(a[8]);

oleo = parseInt (a[7]);
Nivel_combustivel =parseInt (a[7]);


//tesao = a[1];


background(0); // Define o fundo branco

// BARRA DE CONTAGIROS
//==========================================================================================================================================
Rpm = parseInt (a[0]); // valor do contador
// Preenche com preto
fill(255,255,255); // branco
rect(10, 20, 250, 40);
//fill(0,0,255); // azul
text("RPM", 20, 16);
//rect(71, 50 , 60 - valorConvertido, 100); // posição (x,y,largura, comprimento); barra corre na horixontal

// Não altera o posicionamento da altura da barra (faça testes!)
//rect(71, 0, 60 - 2, valorConvertido);
// Gera Altera posicionamento da altura da barra de acordo com o valor recebido
//rect(71, 50 + (100 - valorConvertido), 60 - 2, valorConvertido);
//rect(71, 50 + (100 - valorConvertido), 60 - 2, valorConvertido);
//rect(71, 50 + (100 - valorConvertido), 60 - 2, valorConvertido); // posição (x,y,largura, comprimento); barra corre na vertical
//rect(71, 50 , 60 - valorConvertido, 100); // posição (x,y,largura, comprimento); barra corre na horixontal
//text( valorConvertido, 90, 40);
//==================================================================================================================================================
// BARRA DE PRESSÃO DE AR
//==================================================================================================================================================
Ar = parseInt (a[1]); // valor da pressão do AR
Ar =Ar / 2;
fill(255,255,255); // branco
rect(280, 20, 50, 40); // VACUO
rect(330, 20, 100, 40); // PRESSÃO
text("VACUO", 280, 16);
text("PRESSÃO", 340, 16);
// TRATAMENTO E ENCHEMENTO DAS BARRAS

fill(0,0,255); // azul
rect(331, 20 ,100- Ar, 40); // posição (x,y,largura, comprimento); barra corre na horixontal
fill(255,0,0); // branco
text(Ar, 280, 74);
// Não altera o posicionamento da altura da barra (faça testes!)
//rect(71, 0, 60 - 2, valorConvertido);
// Gera Altera posicionamento da altura da barra de acordo com o valor recebido
//rect(71, 50 + (100 - valorConvertido), 60 - 2, valorConvertido);
//rect(71, 50 + (100 - valorConvertido), 60 - 2, valorConvertido);
//rect(71, 50 + (100 - valorConvertido), 60 - 2, valorConvertido); // posição (x,y,largura, comprimento); barra corre na vertical
//rect(71, 50 , 60 - valorConvertido, 100); // posição (x,y,largura, comprimento); barra corre na horixontal
//text( valorConvertido, 90, 40);
//==================================================================================

// TEMPERATURA DO MOTOR
//==================================================================================
// texto de temp motor
fill(255,255,0); // branco
textSize(11);
text("TEMPERATURA", 18, 90);
temperatura = parseFloat (a[2]); // valor temperatura do motor
//float temperaturaEmCelsius = ( 5 * temperatura * 100.0 / 1024);
fill(255,255,255);
// Cria um retângulo de 60 x 100. coordenada x = 70 e y = 50
rect(30, 100, 50, 100); // motor

fill(255,0,0);
textSize(12);
text(temperatura+" ºC ", 35, 218); // text("AGUA>-", 7, !VARIAVEL TRATADA!);
//fill(255,255,255);
//line(30, 120, 740, 120);
//line(200, 120, 200, 300);
//line(30, 300, 740, 300);
//line(200, 100, 200, 100);
// Preenche com vermelho
if(temperatura <100){ fill(255,255,0); }
if(temperatura <90){ fill(0,255,0); }
if(temperatura <80){ fill(0,0,255); }
// Prepara o valor para inserir no gráfico
temperatura =temperatura/10;
temperatura =temperatura* 7;
rect(31, 100 + (100 - temperatura), 50 - 2, temperatura);
//rect(31, 100 , 50 - temperatura, 100);
//text( valorConvertido, 90, 40);
//==================================================================================
// PRESSAO DE COMBUSTIVEL
//==================================================================================
combustivel = parseFloat (a[3]);
// Preenche com preto
fill(255,255,255);
// Cria um retângulo de 60 x 100. coordenada x = 70 e y = 50
rect(130, 100, 50, 100);// pressaO de combustivel
fill(255,255,0); // AMARELO
textSize(11);
text("PRESSÃO", 130, 82);
text("COMBUSTIVEL", 118, 93);
// Preenche com vermelho
fill(255,0,0);
textSize(12);
fill(255,255,0);
if (combustivel < 3){ fill(255,255,0); }
if ( combustivel < 2) { fill(255,0,0); }
if ( combustivel < 0) { fill(0,0,255); }
if(combustivel > 4){ fill(0,255,0); }
text(combustivel+" Bar", 135, 218);
combustivel =combustivel *11.1;
rect(131, 90 + ((100 - combustivel) -1.0), 50 - 2,combustivel);
// Prepara o valor para inserir no gráfico
//rect(101, 50 , 100 - valorConvertido, 100);
//text( valorConvertido, 90, 40);
//==================================================================================

// BARRA DE VOLTS DA BATERIA
//==================================================================================
float volts = parseFloat (a[7]);
//volts = volts * 0.00489;
//volts = volts * 4;

fill(255,255,255);
rect(220, 100, 40, 100);
fill(255,255,0); // branco
textSize(11);
text("BATERIA", 218, 90);
textSize(12);
if (volts < 12){ fill(255,255,0); }
if ( volts < 10) { fill(255,0,0); }
if(volts > 12){ fill(0,255,0); }
text(volts + " V", 222, 218);
volts = volts *6.5;
rect(221, 100 + (100 - volts), 40 - 2, volts);
//==================================================================================

}
}

Thiago,

Parece uma variação desse projeto garageiro de 2015:

http://labdegaragem.com/forum/topics/processing-para-android-e-ardu...

Tentou contactá-lo?

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço