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