init repo
This commit is contained in:
commit
3d4280d078
479
dashboard.ino
Normal file
479
dashboard.ino
Normal file
@ -0,0 +1,479 @@
|
||||
//##############################################################################################################
|
||||
|
||||
// Volkswagen Dashboard CAN BUS
|
||||
// Arduino Sketch v0.1
|
||||
// (C) by Niklas Schütrumpf 2018
|
||||
|
||||
//##############################################################################################################
|
||||
|
||||
|
||||
// https://github.com/Flori1989/MCP2515_lib
|
||||
#include "Arduino.h"
|
||||
#include <mcp_can.h>
|
||||
#include <SPI.h>
|
||||
#include <ArduinoJson.h>
|
||||
|
||||
#define lo8(x) ((int)(x)&0xff)
|
||||
#define hi8(x) ((int)(x)>>8)
|
||||
|
||||
int high_beam = A3;
|
||||
int fog_beam = A2;
|
||||
int park_brake = A0;
|
||||
|
||||
String inputString = "";
|
||||
boolean stringComplete = false;
|
||||
|
||||
//Variables (Dashboard Functions)
|
||||
int turning_lights = 3;
|
||||
boolean turning_lights_blinking = true;
|
||||
int turning_lights_counter = 0;
|
||||
int temp_turning_lights = 0;
|
||||
boolean backlight = false;
|
||||
int oilpswitch = A1;
|
||||
int pack_counter = 0;
|
||||
boolean add_distance = false;
|
||||
int drive_mode = 0;
|
||||
int distance_multiplier = 2;
|
||||
boolean oil_pressure_simulation = true;
|
||||
boolean door_open = false;
|
||||
boolean clutch_control = false;
|
||||
int temp_clutch_control = 0;
|
||||
boolean check_lamp = false;
|
||||
int temp_check_lamp = 0;
|
||||
boolean trunklid_open = false;
|
||||
int temp_trunklid_open = 0;
|
||||
boolean battery_warning = false;
|
||||
int temp_battery_warning = 0;
|
||||
boolean keybattery_warning = false;
|
||||
int temp_keybattery_warning = 0;
|
||||
int lightmode = 0;
|
||||
boolean seat_belt = false;
|
||||
int temp_seat_belt = 0;
|
||||
int engine_control = 0;
|
||||
int temp_dpf_warning = 0;
|
||||
boolean dpf_warning = false;
|
||||
boolean light_fog = false;
|
||||
int temp_light_fog = 0;
|
||||
boolean light_highbeam = false;
|
||||
int temp_light_highbeam = 0;
|
||||
boolean signal_abs = false;
|
||||
boolean signal_offroad = false;
|
||||
boolean signal_handbrake = false;
|
||||
boolean signal_lowtirepressure = false;
|
||||
boolean signal_dieselpreheat = false;
|
||||
boolean signal_watertemp = false;
|
||||
int temp_signal_abs = 0;
|
||||
int temp_signal_offroad = 0;
|
||||
int temp_signal_handbrake = 0;
|
||||
int temp_signal_lowtirepressure = 0;
|
||||
int temp_signal_dieselpreheat = 0;
|
||||
int temp_signal_watertemp = 0;
|
||||
|
||||
//Variables (Speed and RPM)
|
||||
int speed = 0;
|
||||
int speedTmp = 0;
|
||||
byte speedL = 0;
|
||||
byte speedH = 0;
|
||||
|
||||
int rpm = 0;
|
||||
short tempRPM = 0;
|
||||
byte rpmL = 0;
|
||||
byte rpmH = 0;
|
||||
|
||||
int distance_adder = 0;
|
||||
int distance_counter = 0;
|
||||
|
||||
const int SPI_CS_PIN = 10;
|
||||
MCP_CAN CAN(SPI_CS_PIN);
|
||||
|
||||
//Setup Configuration
|
||||
void setup()
|
||||
{
|
||||
pinMode(high_beam, OUTPUT);
|
||||
pinMode(fog_beam, OUTPUT);
|
||||
pinMode(park_brake, OUTPUT);
|
||||
pinMode(oilpswitch, OUTPUT);
|
||||
|
||||
digitalWrite(park_brake, HIGH);
|
||||
digitalWrite(high_beam, LOW);
|
||||
digitalWrite(fog_beam, LOW);
|
||||
|
||||
Serial.begin(115200);
|
||||
while (!Serial) continue;
|
||||
|
||||
//Begin with CAN Bus Initialization
|
||||
START_INIT:
|
||||
|
||||
if (CAN_OK == CAN.begin(CAN_500KBPS, MCP_16MHz)) // init can bus : baudrate = 500k
|
||||
{
|
||||
Serial.println("CAN BUS Shield init ok!");
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.println("CAN BUS Shield init fail");
|
||||
Serial.println("Init CAN BUS Shield again");
|
||||
delay(100);
|
||||
//goto START_INIT;
|
||||
}
|
||||
|
||||
//##############################################################################################################
|
||||
|
||||
//MAIN SETUP FOR OPERATION
|
||||
|
||||
//Set constant speed and RPM to show on Dashboard
|
||||
speed = 0; //Set the speed in km/h
|
||||
rpm = 0; //Set the rev counter
|
||||
Fuel(100); //Set the fuel gauge in percent
|
||||
|
||||
//Set Dashboard Functions
|
||||
backlight = true; //Turn the automatic dashboard backlight on or off
|
||||
turning_lights = 0; //Turning Lights: 0 = none, 1 = left, 2 = right, 3 = both
|
||||
turning_lights_blinking = true; //Choose the mode of the turning lights (blinking or just shining)
|
||||
add_distance = false; //Dashboard counts the kilometers (can't be undone)
|
||||
distance_multiplier = 2; //Sets the refresh rate of the odometer (Standard 2)
|
||||
signal_abs = false; //Shows ABS Signal on dashboard
|
||||
signal_offroad = false; //Simulates Offroad drive mode
|
||||
signal_handbrake = false; //Enables handbrake
|
||||
signal_lowtirepressure = false; //Simulates low tire pressure
|
||||
oil_pressure_simulation = false; //Set this to true if dashboard starts to beep
|
||||
door_open = false; //Simulate open doors
|
||||
clutch_control = false; //Displays the Message "Kupplung" (German for Clutch) on the dashboard's LCD
|
||||
check_lamp = false; //Show 'Check Lamp' Signal on dashboard. B00010000 = on, B00000 = off
|
||||
trunklid_open = false; //Simulate open trunk lid (Kofferraumklappe). B00100000 = open, B00000 = closed
|
||||
battery_warning = false; //Show Battery Warning.
|
||||
keybattery_warning = false; //Show message 'Key Battery Low' on Display. But just after first start of dashboard.
|
||||
light_fog = false; //Enable Fog Light
|
||||
light_highbeam = false; //Enable High Beam Light
|
||||
seat_belt = false; //Switch Seat Betl warning light.
|
||||
signal_dieselpreheat = false; //Simualtes Diesel Preheating
|
||||
signal_watertemp = false; //Simualtes high water temperature
|
||||
dpf_warning = false; //Shows the Diesel particle filter warning signal.
|
||||
|
||||
|
||||
//##############################################################################################################
|
||||
}
|
||||
|
||||
void CanSend(short address, byte a, byte b, byte c, byte d, byte e, byte f, byte g, byte h)
|
||||
{
|
||||
unsigned char DataToSend[8] = {a, b, c, d, e, f, g, h};
|
||||
CAN.sendMsgBuf(address, 0, 8, DataToSend);
|
||||
}
|
||||
|
||||
void Fuel(int amount)
|
||||
{
|
||||
pinMode(A4, INPUT);
|
||||
pinMode(A5, INPUT);
|
||||
pinMode(3, INPUT);
|
||||
pinMode(4, INPUT);
|
||||
pinMode(5, INPUT);
|
||||
pinMode(6, INPUT);
|
||||
pinMode(7, INPUT);
|
||||
pinMode(8, INPUT);
|
||||
pinMode(9, INPUT);
|
||||
|
||||
if (amount >= 87)
|
||||
{
|
||||
pinMode(A4, OUTPUT);
|
||||
digitalWrite(A4, LOW);
|
||||
return;
|
||||
}
|
||||
if (amount >= 75)
|
||||
{
|
||||
pinMode(A5, OUTPUT);
|
||||
digitalWrite(A5, LOW);
|
||||
return;
|
||||
}
|
||||
if (amount >= 62)
|
||||
{
|
||||
pinMode(3, OUTPUT);
|
||||
digitalWrite(3, LOW);
|
||||
return;
|
||||
}
|
||||
if (amount >= 50)
|
||||
{
|
||||
pinMode(4, OUTPUT);
|
||||
digitalWrite(4, LOW);
|
||||
return;
|
||||
}
|
||||
if (amount >= 37)
|
||||
{
|
||||
pinMode(5, OUTPUT);
|
||||
digitalWrite(5, LOW);
|
||||
return;
|
||||
}
|
||||
if (amount >= 25)
|
||||
{
|
||||
pinMode(6, OUTPUT);
|
||||
digitalWrite(6, LOW);
|
||||
return;
|
||||
}
|
||||
if (amount >= 18)
|
||||
{
|
||||
pinMode(7, OUTPUT);
|
||||
digitalWrite(7, LOW);
|
||||
return;
|
||||
}
|
||||
if (amount >= 12)
|
||||
{
|
||||
pinMode(8, OUTPUT);
|
||||
digitalWrite(8, LOW);
|
||||
return;
|
||||
}
|
||||
if (amount >= 0)
|
||||
{
|
||||
pinMode(9, OUTPUT);
|
||||
digitalWrite(9, LOW);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//Loop
|
||||
void loop()
|
||||
{
|
||||
if (stringComplete) {
|
||||
Serial.print(inputString.length());
|
||||
Serial.print(": ");
|
||||
Serial.println(inputString);
|
||||
|
||||
if(inputString.length() >= 39 && inputString.length() <= 46) {
|
||||
if(getValue(inputString, ',', 19) != "") {
|
||||
speed = getValue(inputString, ',', 0).toInt();
|
||||
rpm = getValue(inputString, ',', 1).toInt();
|
||||
Fuel(getValue(inputString, ',', 2).toInt());
|
||||
|
||||
backlight = getValue(inputString, ',', 3).toInt();
|
||||
|
||||
if(getValue(inputString, ',', 4).toInt() == 1 && getValue(inputString, ',', 5).toInt() == 1) {
|
||||
turning_lights = 3;
|
||||
} else if (getValue(inputString, ',', 4).toInt()) {
|
||||
turning_lights = 1;
|
||||
} else if (getValue(inputString, ',', 5).toInt()) {
|
||||
turning_lights = 2;
|
||||
} else {
|
||||
turning_lights = 0;
|
||||
}
|
||||
|
||||
signal_offroad = getValue(inputString, ',', 6).toInt();
|
||||
signal_watertemp = getValue(inputString, ',', 7).toInt();
|
||||
seat_belt = getValue(inputString, ',', 8).toInt();
|
||||
battery_warning = getValue(inputString, ',', 9).toInt();
|
||||
check_lamp = getValue(inputString, ',', 10).toInt();
|
||||
door_open = getValue(inputString, ',', 11).toInt();
|
||||
light_fog = getValue(inputString, ',', 12).toInt();
|
||||
light_highbeam = getValue(inputString, ',', 13).toInt();
|
||||
signal_handbrake = getValue(inputString, ',', 14).toInt();
|
||||
signal_abs = getValue(inputString, ',', 15).toInt();
|
||||
oil_pressure_simulation = getValue(inputString, ',', 16).toInt();
|
||||
signal_lowtirepressure = getValue(inputString, ',', 17).toInt();
|
||||
clutch_control = getValue(inputString, ',', 18).toInt();
|
||||
trunklid_open = getValue(inputString, ',', 29).toInt();
|
||||
|
||||
Serial.print("CHECK:");
|
||||
Serial.print(speed);
|
||||
Serial.print(" - ");
|
||||
Serial.print(rpm);
|
||||
Serial.print(" - ");
|
||||
Serial.print(light_fog);
|
||||
Serial.print(" - ");
|
||||
Serial.println(turning_lights);
|
||||
} else {
|
||||
Serial.println("INVALID STRING!");
|
||||
}
|
||||
} else {
|
||||
Serial.println("INVALID STRING!");
|
||||
}
|
||||
|
||||
inputString = "";
|
||||
stringComplete = false;
|
||||
}
|
||||
|
||||
//Conversion Speed
|
||||
speedTmp = speed / 0.0075; //KMH=1.12 MPH=0.62
|
||||
|
||||
//Conversion Low and High Bytes
|
||||
speedL = lo8(speedTmp);
|
||||
speedH = hi8(speedTmp);
|
||||
|
||||
tempRPM = rpm * 4;
|
||||
rpmL = lo8(tempRPM);
|
||||
rpmH = hi8(tempRPM);
|
||||
|
||||
if (add_distance == true)
|
||||
{
|
||||
distance_adder = speedTmp * distance_multiplier;
|
||||
distance_counter += distance_adder;
|
||||
if (distance_counter > distance_adder) {
|
||||
distance_counter = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if ( oil_pressure_simulation == true)
|
||||
{
|
||||
//Set Oil Pressure Switch
|
||||
if (rpm > 1500) {
|
||||
digitalWrite(oilpswitch, LOW);
|
||||
}
|
||||
else {
|
||||
digitalWrite(oilpswitch, HIGH);
|
||||
}
|
||||
}
|
||||
|
||||
/*Send CAN BUS Data*/
|
||||
|
||||
//Immobilizer
|
||||
CanSend(0x3D0, 0, 0x80, 0, 0, 0, 0, 0, 0);
|
||||
|
||||
//Engine on and ESP enabled
|
||||
CanSend(0xDA0, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
|
||||
|
||||
//Enable Cruise Control
|
||||
//CanSend(0x289, 0x00, B00000001, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
|
||||
|
||||
//Dashboard Functions
|
||||
|
||||
//Turning Light blinking
|
||||
if (turning_lights_blinking == true)
|
||||
{
|
||||
if (turning_lights_counter == 15)
|
||||
{
|
||||
temp_turning_lights = turning_lights;
|
||||
turning_lights_counter = turning_lights_counter + 1;
|
||||
}
|
||||
if (turning_lights_counter == 30)
|
||||
{
|
||||
temp_turning_lights = 0;
|
||||
turning_lights_counter = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
turning_lights_counter = turning_lights_counter + 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
temp_turning_lights = turning_lights;
|
||||
}
|
||||
|
||||
//Check main settings
|
||||
|
||||
//DPF
|
||||
if (dpf_warning == true) temp_dpf_warning = B00000010;
|
||||
else temp_dpf_warning = B00000000;
|
||||
|
||||
//Seat Belt
|
||||
if (seat_belt == true) temp_seat_belt = B00000100;
|
||||
else temp_seat_belt = B00000000;
|
||||
|
||||
//Battery Warning
|
||||
if (battery_warning == true) temp_battery_warning = B10000000;
|
||||
else temp_battery_warning = B00000000;
|
||||
|
||||
//Trunk Lid (Kofferraumklappe)
|
||||
if (trunklid_open == true) temp_trunklid_open = B00100000;
|
||||
else temp_trunklid_open = B00000000;
|
||||
|
||||
//Check Lamp Signal
|
||||
if (check_lamp == true) temp_check_lamp = B00010000;
|
||||
else temp_check_lamp = B00000000;
|
||||
|
||||
//Clutch Text on LCD
|
||||
if (clutch_control == true) temp_clutch_control = B00000001;
|
||||
else temp_clutch_control = B00000000;
|
||||
|
||||
//Warning for low key battery
|
||||
if (keybattery_warning == true) temp_keybattery_warning = B10000000;
|
||||
else temp_keybattery_warning = B00000000;
|
||||
|
||||
//Lightmode Selection (Fog Light and/or High Beam)
|
||||
if (light_highbeam == true) temp_light_highbeam = B01000000;
|
||||
else temp_light_highbeam = B00000000;
|
||||
if (light_fog == true) temp_light_fog = B00100000;
|
||||
else temp_light_fog = B00000000;
|
||||
lightmode = temp_light_highbeam + temp_light_fog;
|
||||
|
||||
//Engine Options (Water Temperature, Diesel Preheater)
|
||||
if (signal_dieselpreheat == true) temp_signal_dieselpreheat = B00000010;
|
||||
else temp_signal_dieselpreheat = B00000000;
|
||||
if (signal_watertemp == true) temp_signal_watertemp = B00010000;
|
||||
else temp_signal_watertemp = B00000000;
|
||||
engine_control = temp_signal_dieselpreheat + temp_signal_watertemp;
|
||||
|
||||
//Drivemode Selection (ABS, Offroad, Low Tire Pressure, handbrake)
|
||||
if (signal_abs == true) temp_signal_abs = B0001;
|
||||
else temp_signal_abs = B0000;
|
||||
if (signal_offroad == true) temp_signal_offroad = B0010;
|
||||
else temp_signal_offroad = B0000;
|
||||
if (signal_handbrake == true) temp_signal_handbrake = B0100;
|
||||
else temp_signal_handbrake = B0000;
|
||||
if (signal_lowtirepressure == true) temp_signal_lowtirepressure = B1000;
|
||||
else temp_signal_lowtirepressure = B0000;
|
||||
|
||||
drive_mode = temp_signal_abs + temp_signal_offroad + temp_signal_handbrake + temp_signal_lowtirepressure;
|
||||
|
||||
|
||||
//Send CAN data every 200ms
|
||||
pack_counter++;
|
||||
if (pack_counter == 20)
|
||||
{
|
||||
//Turning Lights 2
|
||||
CanSend(0x470, temp_battery_warning + temp_turning_lights, temp_trunklid_open + door_open, backlight, 0x00, temp_check_lamp + temp_clutch_control, temp_keybattery_warning, 0x00, lightmode);
|
||||
|
||||
//Diesel engine
|
||||
CanSend(0x480, 0x00, engine_control, 0x00, 0x00, 0x00, temp_dpf_warning, 0x00, 0x00);
|
||||
|
||||
///Engine
|
||||
//CanSend(0x388, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
|
||||
|
||||
|
||||
//Cruise Control
|
||||
//CanSend(0x289, 0x00, B00000101, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
|
||||
|
||||
pack_counter = 0;
|
||||
}
|
||||
|
||||
//Motorspeed
|
||||
CanSend(0x320, 0x00, (speedL * 100), (speedH * 100), 0x00, 0x00, 0x00, 0x00, 0x00);
|
||||
|
||||
//RPM
|
||||
CanSend(0x280, 0x49, 0x0E, rpmL, rpmH, 0x0E, 0x00, 0x1B, 0x0E);
|
||||
|
||||
//Speed
|
||||
CanSend(0x5A0, 0xFF, speedL, speedH, drive_mode, 0x00, lo8(distance_counter), hi8(distance_counter), 0xad);
|
||||
|
||||
//ABS
|
||||
CanSend(0x1A0, 0x18, speedL, speedH, 0x00, 0xfe, 0xfe, 0x00, 0xff);
|
||||
|
||||
//Airbag
|
||||
CanSend(0x050, 0x00, 0x80, temp_seat_belt, 0x00, 0x00, 0x00, 0x00, 0x00);
|
||||
|
||||
//Wait a time
|
||||
delay(5);
|
||||
}
|
||||
|
||||
void serialEvent() {
|
||||
while (Serial.available()) {
|
||||
char inChar = (char)Serial.read();
|
||||
if (inChar == ';') {
|
||||
stringComplete = true;
|
||||
} else {
|
||||
inputString += inChar;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
String getValue(String data, char separator, int index)
|
||||
{
|
||||
int found = 0;
|
||||
int strIndex[] = { 0, -1 };
|
||||
int maxIndex = data.length() - 1;
|
||||
|
||||
for (int i = 0; i <= maxIndex && found <= index; i++) {
|
||||
if (data.charAt(i) == separator || i == maxIndex) {
|
||||
found++;
|
||||
strIndex[0] = strIndex[1] + 1;
|
||||
strIndex[1] = (i == maxIndex) ? i+1 : i;
|
||||
}
|
||||
}
|
||||
return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
|
||||
}
|
||||
|
39
sketch_jan11a/sketch_jan11a.ino
Normal file
39
sketch_jan11a/sketch_jan11a.ino
Normal file
@ -0,0 +1,39 @@
|
||||
String inputString = ""; // a String to hold incoming data
|
||||
boolean stringComplete = false; // whether the string is complete
|
||||
|
||||
void setup() {
|
||||
// initialize serial:
|
||||
Serial.begin(115200);
|
||||
// reserve 200 bytes for the inputString:
|
||||
inputString.reserve(200);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
// print the string when a newline arrives:
|
||||
if (stringComplete) {
|
||||
Serial.println(inputString);
|
||||
// clear the string:
|
||||
inputString = "";
|
||||
stringComplete = false;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
SerialEvent occurs whenever a new data comes in the hardware serial RX. This
|
||||
routine is run between each time loop() runs, so using delay inside loop can
|
||||
delay response. Multiple bytes of data may be available.
|
||||
*/
|
||||
void serialEvent() {
|
||||
while (Serial.available()) {
|
||||
// get the new byte:
|
||||
char inChar = (char)Serial.read();
|
||||
// add it to the inputString:
|
||||
inputString += inChar;
|
||||
// if the incoming character is a newline, set a flag so the main loop can
|
||||
// do something about it:
|
||||
if (inChar == '\n') {
|
||||
stringComplete = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user