Anusha
Hi this page is Anusha's Page
The following code is RKE implementation
The requirement for RKE is taken from
//RKE & BCM
//Created by Anusha__10/10/22
#define Alarm 4
#define Hazard 5
int beep,driver_door=1,Trunk_door=1,frnt_left=1,back_rght=1,back_left=1;
int Hood=1,driver_knob=1,inside=1,i,vehicle_armed,status;
int diver_door_act,frnt_lft_act,back_rght_act,trunk_lock_act,back_lft_act;
float speed=5;
long timer;
int RKE_ip = 2;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
pinMode(Hazard,OUTPUT);
pinMode(Alarm,OUTPUT);
//=========key inside cylinder or not=======================
int crash_signal=0;
if(inside == 1){
if(driver_door && Trunk_door && frnt_left && back_rght && back_left && Hood == 1)
{
Serial.println("All door closed");
if(driver_knob == 1){
door_lock();
}
if(RKE_ip == 2){ //==>2 for door open
int timer = millis();
while(timer>3000){
panic();
}
}
if(speed > 20){
door_lock();
}
}
if(crash_signal ==1){
emergency_unlock();
}
else if(driver_door == 0){
Serial.println("Driver door open");
}
else if(Trunk_door == 0){
Serial.println("Trunk open");
}
else if(frnt_left== 0){
Serial.println("Front left door open");
}
else if(back_rght== 0){
Serial.println("Back right door open");
}
else if(back_left== 0){
Serial.println("Back left door open");
}
else if(Hood == 0){
Serial.println("Hood is open");
}
else if (driver_door && Trunk_door && frnt_left && back_rght && back_left && Hood != 1)
{
Serial.println("Door is not closed");
beep = 1;
alarm(beep);
}
/*
else {
beep = 900;
alarm();
}*/
}
else if(inside==0){
switch(RKE_ip){
case 1:{ // 1 ==> to lock the door
if(driver_door && Trunk_door && frnt_left && back_rght && back_left && Hood == 1){
door_lock();
status = vehicle_status();
if(status == 0){
theft_alarm();
}
break;
}
else {
Serial.println("Door is not closed_special case");
beep = 5;
hazard_alarm(beep);
break;
}
}
//2==> to unlock
case 2:{
int timer = millis();
//RKE_ip = 2;
while(timer>3000){
if(RKE_ip == 2){
search();
}
}
door_unlock();
break;
while(timer>4500){
if(driver_door && Trunk_door && frnt_left && back_rght && back_left && Hood != 0){
door_lock();
}
}
}
case 3:{
if(RKE_ip == 3){ //3==> to open the trunk
trunk_open();
break;
}
}
/*case 0 :{ // 0=====> theft case, no key pressed
if( driver_door && Trunk_door && frnt_left && back_rght && back_left !=1){
break;
}
}*/
}
}
}
int vehicle_status(){
if(diver_door_act && frnt_lft_act && back_rght_act && back_lft_act == 1){
vehicle_armed = 1;
}
else{
vehicle_armed = 0;
}
return(vehicle_armed);
}
void door_lock(){
Serial.println("Door is locked");
diver_door_act =0;
frnt_lft_act = 1;
back_rght_act =1;
back_lft_act = 1;
trunk_lock_act = 1;
int beep = 1;
hazard_alarm(beep);
return;
}
void door_unlock(){
Serial.println("Door is unlocked");
diver_door_act =0;
frnt_lft_act = 0;
back_rght_act =0;
back_lft_act = 0;
int beep = 2;
hazard_alarm(beep);
/*hazard_lamp(beep);
alarm(beep);*/
return;
}
void theft_alarm(){
int i;
beep = 900;
Serial.println("Theft alarm");
RKE_ip == 0;
if(RKE_ip == 1){
int timer = millis();
while(timer> 3000){
beep = 0;
return;
}
}
else {
for(i=0;i<beep;i++){
Serial.println("hazard");
digitalWrite(Hazard,HIGH);
digitalWrite(Alarm,HIGH);
delay(500);
digitalWrite(Hazard,LOW);
digitalWrite(Alarm,LOW);
}
}
}
// Function Declaration void emergency_unlock(){
diver_door_act =0;
frnt_lft_act = 0;
back_rght_act =0;
back_lft_act = 0;
trunk_lock_act = 0;
beep = 900;
Serial.println("Emergency door unlock");
for(i=0;i<beep;i++){
digitalWrite(Hazard,HIGH);
digitalWrite(Alarm,HIGH);
Serial.println("Hazard lamp and alarm");
delay(500);
digitalWrite(Hazard,LOW);
digitalWrite(Alarm,LOW);
}
}
void hazard_alarm(int beep){
for(i=0;i<beep;i++){
Serial.println("Hazard lamp blink");
Serial.println("Alarm");
digitalWrite(Hazard,HIGH);
digitalWrite(Alarm,HIGH);
delay(500);
digitalWrite(Hazard,LOW);
digitalWrite(Alarm,LOW);
}
return;
}
void trunk_open(){
trunk_lock_act = 0;
Serial.println("Trunk open");
return;
}
void search(){
Serial.println("Search");
beep = 15;
hazard_alarm(beep);
}
void panic(){
Serial.println("panic");
beep= 15;
hazard_alarm(beep);
return;
}
void hazard_lamp(int beep){
int i;
for(i=0;i<beep;i++){
Serial.println("Lamp");
digitalWrite(Hazard,HIGH);
delay(500);
digitalWrite(Hazard,LOW);
}
return;
}
void alarm(int beep){
int i;
for(i=0;i<beep;i++){
Serial.println("Alarm_beep");
digitalWrite(Alarm,HIGH);
delay(500);
digitalWrite(Alarm,LOW);
}
return;
}
RKE with CAN Implementation
#include <SPI.h>
#include <mcp2515.h>
struct can_frame canMsg1;
struct can_frame canMsg2;
struct can_frame canMsg3;
struct can_frame canMsg4;
struct can_frame canMsg5;
struct can_frame canMsg6;
struct can_frame canMsg7;
struct can_frame canMsg8;
struct can_frame canMsg9;
struct can_frame canMsg10;
struct can_frame canMsg11;
struct can_frame canMsg12;
struct can_frame canMsg;
MCP2515 mcp2515(53);
int byte_data[8];
void setup() {
Serial.begin(115200);
canMsg1.can_id = 0x050;
canMsg1.can_dlc = 8;
canMsg2.can_id = 0x055;
canMsg2.can_dlc = 8;
canMsg3.can_id = 0x065;
canMsg3.can_dlc = 8;
canMsg4.can_id = 0x070;
canMsg4.can_dlc = 8;
canMsg5.can_id = 0x075;
canMsg5.can_dlc = 8;
canMsg6.can_id = 0x080;
canMsg6.can_dlc = 8;
canMsg7.can_id = 0x085;
canMsg7.can_dlc = 8;
canMsg8.can_id = 0x060;
canMsg8.can_dlc = 8;
canMsg9.can_id = 0x098;
canMsg9.can_dlc = 8;
canMsg10.can_id = 0x090;
canMsg10.can_dlc = 8;
canMsg11.can_id = 0x095;
canMsg11.can_dlc = 8;
canMsg12.can_id = 0x099;
canMsg12.can_dlc = 8;
mcp2515.reset();
mcp2515.setBitrate(CAN_500KBPS,MCP_8MHZ);
mcp2515.setNormalMode();
pinMode(13,OUTPUT);
Serial.println("------- CAN Read ----------");
Serial.println("ID DLC DATA");
}
//====================NORMAL_LED BLINK ====================
void normal_blink(){
for(int i=0;i<2;i++){
digitalWrite(13,HIGH);
delay(5000);
digitalWrite(13,LOW);
}
return;
}
//======================FAULTY LED BLINK======================================
void faulty_blink(){
for(int i=0;i<3;i++){
digitalWrite(13,HIGH);
delay(250);
digitalWrite(13,LOW);
}
return;
}
void loop() {
/*
if (mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK) {
// Serial.print("CAN ID IS ");
// Serial.println(canMsg.can_id, HEX); // print ID
// Serial.print(" ");
// Serial.print(canMsg.can_dlc, HEX); // print DLC
// Serial.print(" ");
//==============Extracting signal from BCM_1____CANID= 0x045==================
if (canMsg.can_id==0x045){
byte receive_1st_byte;
byte receive_2nd_byte;
byte hazard_signal,turn_left_signal,turn_right_signal,bcm_rain_sensor;
byte battery_charge_systm_warn;
for (int i = 0; i<canMsg.can_dlc; i++) { // print the data
if(i==0)
receive_1st_byte = canMsg.data[0];
if(i==1)
receive_2nd_byte = canMsg.data[1];
hazard_signal = receive_1st_byte & 0b11;
turn_left_signal = receive_1st_byte & 0b1100;
turn_right_signal = receive_1st_byte & 0b110000;
bcm_rain_sensor = receive_1st_byte & 0b11000000;
battery_charge_systm_warn =receive_1st_byte & 0b11;
//======hazard_signal =======================================
Serial.print("hazard_signal ");
Serial.println(hazard_signal, HEX);
switch (hazard_signal){
case 0b00:
digitalWrite(13,LOW);
break;
case 0b01:
Serial.print("hazard_signal NORMAL");
normal_blink();
break;
case 0b10:
Serial.print("hazard_signal FAULTY BLINK");
faulty_blink();
break;
case 0b11:
Serial.print("hazard_signal RESERVED");
digitalWrite(13,HIGH);
}
//=============turn_left_signal=============================
turn_left_signal = turn_left_signal>>2;
Serial.print("turn_left_signal ");
Serial.println(turn_left_signal, HEX);
switch (turn_left_signal){
case 0b00:
digitalWrite(13,LOW);
break;
case 0b01:
Serial.print("turn_left_signal NORMAL");
normal_blink();
break;
case 0b10:
Serial.print("turn_left_signal FAULTY BLINK");
faulty_blink();
break;
case 0b11:
Serial.print("turn_left_signal RESERVED");
digitalWrite(13,LOW);
}
//=========== turn_right_signal==========================
turn_right_signal = turn_right_signal>>4;
Serial.print("turn_right_signal ");
Serial.println(turn_right_signal, HEX);
switch (turn_right_signal){
case 0b00:
digitalWrite(13,LOW);
break;
case 0b01:
Serial.print("turn_right_signal NORMAL");
normal_blink();
break;
case 0b10:
Serial.print("turn_right_signal FAULTY BLINK");
faulty_blink();
break;
case 0b11:
Serial.print("turn_right_signal RESERVED");
digitalWrite(13,LOW);
}
//=========== bcm_rain_sensor====================================
bcm_rain_sensor = bcm_rain_sensor>>6;
Serial.print("bcm_rain_sensor ");
Serial.println(bcm_rain_sensor, HEX);
switch (bcm_rain_sensor){
case 0b00:
digitalWrite(13,LOW);
Serial.print("bcm_rain_sensor OFF");
break;
case 0b01:
Serial.print("bcm_rain_sensor WIPER ON");
normal_blink();
break;
case 0b10:
Serial.print("bcm_rain_sensor LIGHT ON");
faulty_blink();
break;
case 0b11:
Serial.print("bcm_rain_sensor RESERVED");
digitalWrite(13,LOW);
}
//===========================battery_charge_systm_warn===========================
Serial.print("battery_charge_systm_warn ");
Serial.println(battery_charge_systm_warn, HEX);
switch (battery_charge_systm_warn){
case 0b00:
digitalWrite(13,LOW);
break;
case 0b01:
Serial.print("battery_charge_systm_warn NORMAL");
normal_blink();
break;
case 0b10:
Serial.print("battery_charge_systm_warn FAULTY BLINK");
faulty_blink();
break;
case 0b11:
Serial.print("battery_charge_systm_warn RESERVED");
digitalWrite(13,LOW);
}
}
}
//======Extracting signals__BCM_2 ___CAN ID =0X 46 ======================
if (canMsg.can_id==0x046){
byte receive_46_1st_byte;
byte low_fuel_level,vehicle_armed_status,park_brake_lamp,rear_fog_lamp;
byte frnt_fog_lamp;
for (int i = 0; i<canMsg.can_dlc; i++) { // print the data
// Serial.println(canMsg.data[i],HEX);
// Serial.print(" ");
if (i= 0)
receive_46_1st_byte = canMsg.data[0];
frnt_fog_lamp = receive_46_1st_byte & 1;
rear_fog_lamp = receive_46_1st_byte & 2;
park_brake_lamp = receive_46_1st_byte & 4;
vehicle_armed_status = receive_46_1st_byte & 8;
low_fuel_level = receive_46_1st_byte & 16;
//====================frnt_fog_lamp===============================
Serial.print("frnt_fog_lamp ");
Serial.println(frnt_fog_lamp,HEX);
switch (frnt_fog_lamp){
case 0:
Serial.print("frnt_fog_lamp OFF ");
digitalWrite(13,LOW);
break;
case 1:
Serial.print("frnt_fog_lamp ON");
digitalWrite(13,HIGH);
}
//=============rear_fog_lamp=======================
rear_fog_lamp = rear_fog_lamp>>1;
Serial.print("rear_fog_lamp ");
Serial.println(rear_fog_lamp,HEX);
switch (rear_fog_lamp){
case 0:
Serial.print("rear_fog_lamp OFF ");
digitalWrite(13,LOW);
break;
case 1:
Serial.print("rear_fog_lamp ON");
digitalWrite(13,HIGH);
}
//=====================park_brake_lamp=====================
park_brake_lamp = park_brake_lamp>>2;
Serial.print("park_brake_lamp ");
Serial.println(park_brake_lamp,HEX);
switch (park_brake_lamp){
case 0:
Serial.print("park_brake_lamp OFF ");
digitalWrite(13,LOW);
break;
case 1:
Serial.print("park_brake_lamp ON");
digitalWrite(13,HIGH);
}
//===vehicle_armed_status============================================
vehicle_armed_status = vehicle_armed_status>>3;
Serial.print("vehicle_armed_status ");
Serial.println(vehicle_armed_status,HEX);
switch (vehicle_armed_status){
case 0:
Serial.print("vehicle_armed_status OFF ");
digitalWrite(13,LOW);
break;
case 1:
Serial.print("vehicle_armed_status ON");
digitalWrite(13,HIGH);
}
//===========low_fuel_level==========
low_fuel_level = low_fuel_level>>4;
Serial.print("low_fuel_level ");
Serial.println(low_fuel_level,HEX);
switch (low_fuel_level){
case 0:
Serial.print("low_fuel_level OFF ");
digitalWrite(13,LOW);
break;
case 1:
Serial.print("low_fuel_level ON");
digitalWrite(13,HIGH);
}
}
}
//================BCM_3__CAN_ID 0x047_Extracting signals=====
if (canMsg.can_id==0x047){
byte receive_47_1st_byte;
byte fuel_level,head_lamp;
for (int i = 0; i<canMsg.can_dlc; i++) { // print the data
// Serial.println(canMsg.data[i],HEX);
// Serial.print(" ");
if(i == 0)
receive_47_1st_byte = canMsg.data[0];
head_lamp = receive_47_1st_byte & 0b11;
fuel_level = receive_47_1st_byte & 0b1111100;
//=================Head lamp========================
Serial.print("head_lamp ");
Serial.println(head_lamp,HEX);
fuel_level = fuel_level>>2;
Serial.print("fuel_level ");
Serial.println(fuel_level,HEX);
}
}
// }
if (canMsg.can_id==0x048){
byte receive_48_1st_byte;
byte ampient_temperature;
for (int i = 0; i<canMsg.can_dlc; i++) { // print the data
// Serial.println(canMsg.data[i],HEX);
// Serial.print(" ");
if(i == 0)
receive_48_1st_byte = canMsg.data[0];
ampient_temperature = receive_48_1st_byte;
Serial.print("ampient_temperature ");
Serial.println(ampient_temperature,HEX);
}
}
if (canMsg.can_id==0x049){
byte receive_49_1st_byte;
byte trunk_door_status, rear_rgt_door_status,rear_lft_door_status,fuel_lid_status;
byte driver_door_status,passngr_door_status;
for (int i = 0; i<canMsg.can_dlc; i++) { // print the data
// Serial.println(canMsg.data[i],HEX);
// Serial.print(" ");
if(i == 0)
receive_49_1st_byte = canMsg.data[0];
passngr_door_status = receive_49_1st_byte & 1;
driver_door_status = receive_49_1st_byte & 2;
fuel_lid_status = receive_49_1st_byte & 4;
rear_lft_door_status = receive_49_1st_byte & 8;
rear_rgt_door_status = receive_49_1st_byte & 16;
trunk_door_status = receive_49_1st_byte & 32;
Serial.print("passngr_door_status ");
Serial.println(passngr_door_status,HEX);
driver_door_status = driver_door_status >>1;
Serial.print("driver_door_status ");
Serial.println(driver_door_status,HEX);
fuel_lid_status = fuel_lid_status >>2;
Serial.print("fuel_lid_status ");
Serial.println(fuel_lid_status,HEX);
rear_lft_door_status = rear_lft_door_status >>3;
Serial.print("rear_lft_door_status ");
Serial.println(rear_lft_door_status,HEX);
rear_rgt_door_status = rear_rgt_door_status >>4;
Serial.print("rear_rgt_door_status ");
Serial.println(rear_rgt_door_status,HEX);
trunk_door_status = trunk_door_status>> 5;
Serial.print("trunk_door_status ");
Serial.println(trunk_door_status,HEX);
}
}
if (canMsg.can_id==0x025){
byte receive_49_1st_byte;
byte start_stop,check_engine,engine_oil_pressure,water_in_fuel;
byte ect_warn_lamp,glow_plug;
for (int i = 0; i<canMsg.can_dlc; i++) { // print the data
// Serial.println(canMsg.data[i],HEX);
// Serial.print(" ");
if (i== 0)
receive_49_1st_byte = canMsg.data[0];
glow_plug = receive_49_1st_byte & 1;
ect_warn_lamp = receive_49_1st_byte & 2;
water_in_fuel = receive_49_1st_byte & 4;
engine_oil_pressure = receive_49_1st_byte & 8;
check_engine = receive_49_1st_byte & 16;
start_stop = receive_49_1st_byte & 32;
Serial.print("glow_plug ");
Serial.println(glow_plug,HEX);
ect_warn_lamp = ect_warn_lamp >>1;
Serial.print("ect_warn_lamp ");
Serial.println(ect_warn_lamp,HEX);
water_in_fuel = water_in_fuel>>2;
Serial.print("water_in_fuel ");
Serial.println(water_in_fuel,HEX);
engine_oil_pressure = engine_oil_pressure>>3;
Serial.print("engine_oil_pressure ");
Serial.println(engine_oil_pressure,HEX);
check_engine = check_engine >>4;
Serial.print("check_engine ");
Serial.println(check_engine,HEX);
start_stop = start_stop >>5;
Serial.print("start_stop ");
Serial.println(start_stop,HEX);
}
}
if (canMsg.can_id==0x030){
byte receive_30_1st_byte;
byte OBD_check,cruise_indicator;
for (int i = 0; i<canMsg.can_dlc; i++) { // print the data
// Serial.println(canMsg.data[i],HEX);
// Serial.print(" ");
if (i ==0)
receive_30_1st_byte =canMsg.data[0];
cruise_indicator = receive_30_1st_byte & 1;
OBD_check = receive_30_1st_byte & 2;
Serial.print("cruise_indicator ");
Serial.println(cruise_indicator,HEX);
OBD_check = OBD_check >> 1;
Serial.print("OBD_check ");
Serial.println(OBD_check ,HEX);
}
}
if (canMsg.can_id==0x32){
byte receive_32_1st_byte,receive_32_2nd_byte;
int engine_speed;
for (int i = 0; i<canMsg.can_dlc; i++) { // print the data
// Serial.println(canMsg.data[i],HEX);
// Serial.print(" ");
if (i== 0)
receive_32_1st_byte = canMsg.data[0];
if (i== 1)
receive_32_2nd_byte = canMsg.data[1];
engine_speed = receive_32_2nd_byte;
engine_speed = engine_speed <<8;
engine_speed = engine_speed | receive_32_1st_byte;
Serial.print("engine_speed ");
Serial.println(engine_speed ,HEX);
}
}
if (canMsg.can_id==0x35){
byte receive_35_1st_byte;
byte EPS_warn_lamp;
for (int i = 0; i<canMsg.can_dlc; i++) { // print the data
// Serial.println(canMsg.data[i],HEX);
// Serial.print(" ");
if(i == 0)
receive_35_1st_byte = canMsg.data[0];
EPS_warn_lamp = receive_35_1st_byte & 1;
Serial.print("EPS_warn_lamp ");
Serial.println(EPS_warn_lamp ,HEX);
}
}
if (canMsg.can_id==0x020){
byte receive_20_1st_byte;
byte receive_20_3rd_byte;
byte receive_20_4th_byte;
byte ESP_warn_lamp,ESP_OFF,ABS_malfunctn;
int vehicle_speed;
for (int i = 0; i<canMsg.can_dlc; i++) { // print the data
// Serial.println(canMsg.data[i],HEX);
// Serial.print(" ");
if(i == 0)
byte receive_20_1st_byte = canMsg.data[0];
if(i == 2)
byte receive_20_3rd_byte = canMsg.data[2];
if(i == 3)
byte receive_20_4th_byte = canMsg.data[4];
ESP_warn_lamp = receive_20_1st_byte & 0b11;
ESP_OFF = receive_20_1st_byte & 0b100;
ABS_malfunctn = receive_20_1st_byte & 0b1000;
vehicle_speed = receive_20_4th_byte;
vehicle_speed = vehicle_speed << 8;
vehicle_speed = vehicle_speed |receive_20_3rd_byte;
Serial.print("ESP_warn_lamp ");
Serial.println(ESP_warn_lamp ,HEX);
ESP_OFF = ESP_OFF >>2;
Serial.print("ESP_OFF ");
Serial.println(ESP_OFF,HEX);
ABS_malfunctn = ESP_OFF >>3;
Serial.print("ABS_malfunctn ");
Serial.println(ABS_malfunctn,HEX);
Serial.print("vehicle_speed ");
Serial.println(vehicle_speed,HEX);
}
}
if (canMsg.can_id==0x021){
byte receive_21_1st_byte;
byte receive_21_2nd_byte;
byte receive_21_3rd_byte;
byte receive_21_4th_byte;
byte receive_21_5th_byte;
byte receive_21_6th_byte;
byte receive_21_7th_byte;
byte receive_21_8th_byte;
int frnt_left_wheel_speed,frnt_rght_wheel_speed,rear_left_wheel_speed;
int rear_rght_wheel_speed;
for (int i = 0; i<canMsg.can_dlc; i++) { // print the data
// Serial.println(canMsg.data[i],HEX);
// Serial.print(" ");
if(i == 0)
receive_21_1st_byte = canMsg.data[0];
if(i == 1)
receive_21_2nd_byte = canMsg.data[1];
if(i == 2)
receive_21_3rd_byte = canMsg.data[2];
if(i == 3)
receive_21_4th_byte = canMsg.data[3];
if(i == 4)
receive_21_5th_byte = canMsg.data[4];
if(i == 5)
receive_21_6th_byte = canMsg.data[5];
if(i == 6)
receive_21_7th_byte = canMsg.data[6];
if(i == 7)
receive_21_8th_byte = canMsg.data[7];
frnt_left_wheel_speed = receive_21_2nd_byte;
frnt_left_wheel_speed = frnt_left_wheel_speed << 8;
frnt_left_wheel_speed = frnt_left_wheel_speed | receive_21_1st_byte;
frnt_rght_wheel_speed = receive_21_4th_byte;
frnt_rght_wheel_speed = frnt_rght_wheel_speed << 8;
frnt_rght_wheel_speed = frnt_rght_wheel_speed | receive_21_3rd_byte;
rear_left_wheel_speed = receive_21_6th_byte;
rear_left_wheel_speed = rear_left_wheel_speed << 8;
rear_left_wheel_speed = rear_left_wheel_speed | receive_21_5th_byte;
rear_rght_wheel_speed = receive_21_8th_byte;
rear_rght_wheel_speed = rear_rght_wheel_speed << 8;
rear_rght_wheel_speed = rear_rght_wheel_speed | receive_21_7th_byte;
Serial.print("frnt_left_wheel_speed ");
Serial.println(frnt_left_wheel_speed,HEX);
Serial.print("frnt_rght_wheel_speed ");
Serial.println(frnt_rght_wheel_speed,HEX);
Serial.print("rear_left_wheel_speed ");
Serial.println(rear_left_wheel_speed,HEX);
Serial.print("rear_rght_wheel_speed ");
Serial.println(rear_rght_wheel_speed,HEX);
}
}
if (canMsg.can_id==0x042){
byte receive_42_1st_byte;
byte RKE_unlock,RKE_trunk_open,RKE_search,RKE_panic,RKE_mute_unmute;
byte RKE_lock,RKE_fuel_lid_open;
for (int i = 0; i<canMsg.can_dlc; i++) { // print the data
// Serial.println(canMsg.data[i],HEX);
// Serial.print(" ");
if(i == 0)
receive_42_1st_byte =canMsg.data[0];
RKE_fuel_lid_open = receive_42_1st_byte & 1;
RKE_lock = receive_42_1st_byte & 2;
RKE_mute_unmute = receive_42_1st_byte & 4;
RKE_panic = receive_42_1st_byte & 8;
RKE_search = receive_42_1st_byte & 16;
RKE_trunk_open = receive_42_1st_byte & 32;
RKE_unlock = receive_42_1st_byte & 64;
Serial.print("RKE_fuel_lid_open ");
Serial.println(RKE_fuel_lid_open,HEX);
RKE_lock = RKE_lock >>1;
Serial.print("RKE_lock ");
Serial.println(RKE_lock,HEX);
RKE_mute_unmute = RKE_mute_unmute >>2;
Serial.print("RKE_mute_unmute");
Serial.println(RKE_mute_unmute,HEX);
RKE_panic= RKE_panic >>3;
Serial.print("RKE_panic ");
Serial.println(RKE_panic,HEX);
RKE_search = RKE_search >>4;
Serial.print("RKE_search");
Serial.println(RKE_search,HEX);
RKE_trunk_open = RKE_trunk_open >>5;
Serial.print("RKE_trunk_open ");
Serial.println(RKE_trunk_open,HEX);
RKE_unlock = RKE_unlock >>6;
Serial.print(" RKE_unlock ");
Serial.println( RKE_unlock,HEX);
}
}
if (canMsg.can_id==0x040){
byte receive_40_1st_byte;
byte RPASS_sensor;
for (int i = 0; i<canMsg.can_dlc; i++) { // print the data
// Serial.println(canMsg.data[i],HEX);
// Serial.print(" ");
if(i = 0)
receive_40_1st_byte = canMsg.data[0];
RPASS_sensor = receive_40_1st_byte & 0b11111;
Serial.print(" RPASS_sensor ");
Serial.println( RPASS_sensor,HEX);
}
}
if (canMsg.can_id==0x010){
byte receive_10_1st_byte;
byte SRS_Belt_Warn;
for (int i = 0; i<canMsg.can_dlc; i++) { // print the data
// Serial.println(canMsg.data[i],HEX);
// Serial.print(" ");
if(i == 0)
receive_10_1st_byte = canMsg.data[0];
SRS_Belt_Warn = receive_10_1st_byte & 1;
Serial.print(" SRS_Belt_Warn ");
Serial.println( SRS_Belt_Warn,HEX);
}
}
if (canMsg.can_id==0x015){
byte receive_15_1st_byte;
byte SRS_Airbag_Warn_lamp;
for (int i = 0; i<canMsg.can_dlc; i++) { // print the data
// Serial.println(canMsg.data[i],HEX);
// Serial.print(" ");
if(i == 0)
receive_15_1st_byte = canMsg.data[0];
SRS_Airbag_Warn_lamp = receive_15_1st_byte & 1;
Serial.print(" SRS_Airbag_Warn_lamp ");
Serial.println( SRS_Airbag_Warn_lamp,HEX);
}
}
if (canMsg.can_id==0x038){
byte receive_38_1st_byte;
byte Gear_position_sensor;
for (int i = 0; i<canMsg.can_dlc; i++) { // print the data
// Serial.println(canMsg.data[i],HEX);
// Serial.print(" ");
if(i == 0)
receive_38_1st_byte = canMsg.data[0];
Gear_position_sensor = receive_38_1st_byte & 0b11;
Serial.print(" Gear_position_sensor ");
Serial.println(Gear_position_sensor,HEX);
}
}
if (canMsg.can_id==0x039){
byte receive_39_1st_byte;
byte receive_39_2nd_byte;
byte receive_39_3rd_byte;
byte receive_39_4th_byte;
byte receive_39_5th_byte;
byte receive_39_6th_byte;
byte receive_39_7th_byte;
byte receive_39_8th_byte;
byte tyre_press_left_frnt,tyre_press_left_bck,tyre_press_rght_bck;
byte tyre_press_rght_frnt,tyre_temp_back_left,tyre_temp_bck_rght,tyre_temp_frnt_left,
byte tyre_temp_frnt_rght;
for (int i = 0; i<canMsg.can_dlc; i++) { // print the data
// Serial.println(canMsg.data[i],HEX);
// Serial.print(" ");
if(i == 0)
receive_39_1st_byte = canMsg.data[0];
if(i == 1)
receive_39_2nd_byte = canMsg.data[1];
if(i == 2)
receive_39_3rd_byte = canMsg.data[2];
if(i == 3)
receive_39_4th_byte = canMsg.data[3];
if(i == 4)
receive_39_5th_byte = canMsg.data[4];
if(i == 5)
receive_39_6th_byte = canMsg.data[5];
if(i == 6)
receive_39_7th_byte = canMsg.data[6];
if(i == 7)
receive_39_8th_byte = canMsg.data[7];
tyre_press_left_frnt = receive_39_1st_byte & 0b11111111;
tyre_press_left_bck = receive_39_2nd_byte & 0b11111111;
tyre_press_rght_bck = receive_39_3rd_byte & 0b11111111;
tyre_press_rght_frnt = receive_39_4th_byte & 0b11111111;
tyre_temp_back_left = receive_39_5th_byte & 0b11111111;
tyre_temp_bck_rght = receive_39_6th_byte & 0b11111111;
tyre_temp_frnt_left = receive_39_7th_byte & 0b11111111;
tyre_temp_frnt_rght = receive_39_8th_byte & 0b11111111;
Serial.print(" tyre_press_left_frnt ");
Serial.println(tyre_press_left_frnt,HEX);
Serial.print(" tyre_press_left_bck ");
Serial.println(tyre_press_left_bck,HEX);
Serial.print(" tyre_press_rght_bck ");
Serial.println(tyre_press_rght_bck,HEX);
Serial.print(" tyre_press_rght_frnt ");
Serial.println(tyre_press_rght_frnt,HEX);
Serial.print(" tyre_temp_back_left ");
Serial.println(tyre_temp_back_left,HEX);
Serial.print(" tyre_temp_bck_rght ");
Serial.println(tyre_temp_bck_rght,HEX);
Serial.print(" tyre_temp_frnt_left ");
Serial.println(tyre_temp_frnt_left,HEX);
Serial.print(" tyre_temp_frnt_rght ");
Serial.println(tyre_temp_frnt_rght,HEX);
}
}
if (canMsg.can_id==0x041){
byte receive_41_1st_byte;
byte Tiretronics;
for (int i = 0; i<canMsg.can_dlc; i++) { // print the data
// Serial.println(canMsg.data[i],HEX);
// Serial.print(" ");
if(i == 0)
receive_41_1st_byte = canMsg.data[0];
Tiretronics = receive_41_1st_byte & 0b11;
Serial.print(" Tiretronics ");
Serial.println(Tiretronics,HEX);
}
}
}*/
//=====CAN Message - Transmitting signal==========
byte Turn_lft,Turn_rgt,Hazard,Vehicle_Arm_status,Rear_FOG;
byte Frnt_Fog_lamp,Park_Engine_lamp,LOW_fuel_level,Door_frnt_left_status;
byte Door_Trunk_Status,Door_frnt_Right_status,Door_lid_status;
byte Door_Rear_Lft_status,Door_Rear_Rgt_status;
byte Head_Lamp,Battery_Charge_Warning,Rain_Light_Sensor
byte Ampient_Temperature,Glow_Plug_indicator,Cruise_Indicator;
byte Water_in_Fuel_Pump,LOW_EOP_Warn,OBD_Chck_LAMP,Start_Stop_Lamp,Engine_check;
byte DPF_Warn_Lamp;
//==================BCM_1 __0x050===================
Turn_lft = 0b01;
Turn_rgt = 0b01;
Hazard = 0b01;
Vehicle_Arm_status = 0b1;
Rear_FOG = 0b1;
Turn_rgt = Turn_rgt << 2;
Hazard = Hazard << 4;
Vehicle_Arm_status = Vehicle_Arm_status <<6;
Rear_FOG = Rear_FOG << 7;
canMsg1.data[0] = Rear_FOG | Vehicle_Arm_status | Hazard |Turn_rgt | Turn_lft;
Serial.println("Message sent");
Frnt_Fog_lamp = 0b1;
Park_Engine_lamp = 0b1;
LOW_fuel_level = 0b01011;
Door_frnt_left_status = 0b1;
canMsg1.data[1] = Frnt_Fog_lamp | Park_Engine_lamp<<1 |LOW_fuel_level<<2
|Door_frnt_left_status <<7 ;
Door_Trunk_Status = 0b1;
Door_frnt_Right_status = 0b1;
Door_lid_status = 0b1;
Door_Rear_Lft_status = 0b1;
Door_Rear_Rgt_status = 0b1;
Head_Lamp = 0b01;
Battery_Charge_Warning = 0b1;
canMsg1.data[2] = Door_Trunk_Status |Door_frnt_Right_status <<1
| Door_lid_status << 2 |Door_Rear_Lft_status << 3 | Door_Rear_Rgt_status<<4
|Head_Lamp <<5 | Battery_Charge_Warning << 7 ;
Rain_Light_Sensor = 0b101;
canMsg1.data[3] = Rain_Light_Sensor & 0b111;
delay(100);
mcp2515.sendMessage(&canMsg1);
//===========CAN_ID_ 0x055=================
Ampient_Temperature = 0x85;
canMsg2.data[0] = Ampient_Temperature & 0xFF;
mcp2515.sendMessage(&canMsg2);
delay(50);
//===========CAN_ID_ 0x065============================
Glow_Plug_indicator = 0b1;
Cruise_Indicator = 0b1;
Water_in_Fuel_Pump = 0b1;
LOW_EOP_Warn =0b1;
OBD_Chck_LAMP = 0b1;
DPF_Warn_Lamp = 0b1;
Start_Stop_Lamp = 0b1;
Engine_check = 0b1;
canMsg3.data[0] = Glow_Plug_indicator | Cruise_Indicator << 1
|Water_in_Fuel_Pump << 2 | LOW_EOP_Warn << 3 |OBD_Chck_LAMP << 4 |DPF_Warn_Lamp<< 5
| Start_Stop_Lamp << 6 | Engine_check << 7 ;
byte Reduced_Power_Warn = 0b1;
byte DEF_idicator = 0b1;
byte ECT_lamp = 0b1;
canMsg3.data[1] = ECT_lamp| DEF_idicator << 1 |Reduced_Power_Warn << 2;
mcp2515.sendMessage(&canMsg3);
delay(50);
//==============CAN_ID_ 0x070====================================================
int Engine_speed = random(0,3000);
canMsg4.data[0] = Engine_speed & 0xFF;
canMsg4.data[1] = (Engine_speed>>8) & 0xFF;
mcp2515.sendMessage(&canMsg4);
delay(50);
//=====================CAN_ID 0x75=================================
byte EPS_WARN = 0b1;
canMsg5.data[0] = EPS_WARN & 0b1;
mcp2515.sendMessage(&canMsg5);
delay(50);
//================CAN_ID 0x80===============================
byte EPS_Warn_Lamp = 0b01;
byte ESP_OFF = 0b1;
byte Over_Speed_Warning = 0b1;
byte ABS_Malfunction_Lamp =0b1;
int Vehicle_Speed = random(0,120);
canMsg6.data[0] = EPS_Warn_Lamp | ESP_OFF <<2 |Over_Speed_Warning <<3
|ABS_Malfunction_Lamp <<4 ;
canMsg6.data[1] = Vehicle_Speed & 0xFF;
canMsg6.data[2] = (Vehicle_Speed>>8) & 0xFF;
mcp2515.sendMessage(&canMsg6);
delay(50);
//======================CAN_ID 0x085===========================
int Front_Right_Wheel =random (0,120);
int Front_Left_Wheel =random (0,120);
int Rear_Left_Wheel =random (0,120);
int Rear_Right_Wheel =random (0,120);
canMsg7.data[0] = Front_Right_Wheel & 0xFF;
canMsg7.data[1] = (Front_Right_Wheel>>8) & 0xFF;
canMsg7.data[2] = Front_Left_Wheel & 0xFF;
canMsg7.data[3] = (Front_Left_Wheel>>8) & 0xFF;
canMsg7.data[4] = Rear_Left_Wheel & 0xFF;
canMsg7.data[5] = (Rear_Left_Wheel>>8) & 0xFF;
canMsg7.data[6] = Rear_Right_Wheel & 0xFF;
canMsg7.data[7] = (Rear_Right_Wheel>>8) & 0xFF;
mcp2515.sendMessage(&canMsg7);
delay(50);
//============CAN_ID 0x060=======================================
byte SRS_WARN_Lamp = 0b1;
byte Seat_Belt = 0b1;
canMsg8.data[0] = Seat_Belt |SRS_WARN_Lamp << 1;
mcp2515.sendMessage(&canMsg8);
delay(50);
//================CAN_ID 0x098========================
byte Transfer_CASE_ECU = 0b1;
canMsg9.data[0] = Transfer_CASE_ECU & 0xFF;
mcp2515.sendMessage(&canMsg9);
delay(50);
//======================CAN_ID 0x090=====================
byte RKE_UNLOCK =0b1;
byte RKE_TRUNK_OPEN = 0b1;
byte RKE_SEARCH = 0b1;
byte RKE_PANIC = 0b1;
byte RKE_MUTE_UNMUTE = 0b1;
byte RKE_LOCK = 0b1;
byte RKE_FUEL_LID_OPEN = 0b1;
canMsg10.data[0] = RKE_FUEL_LID_OPEN | RKE_LOCK<<1 |RKE_MUTE_UNMUTE <<2
|RKE_PANIC <<3|RKE_SEARCH << 4 |RKE_TRUNK_OPEN << 5|RKE_UNLOCK <<6;
mcp2515.sendMessage(&canMsg10);
delay(50);
//=====================CAN_ID 0x095================
byte GEAR_POSITION_SENSOR = 0b01;
canMsg11.data[0] = GEAR_POSITION_SENSOR & 0x03;
mcp2515.sendMessage(&canMsg11);
delay(50);
//========================CAN_ID 0x099=============================
byte TIREtronics= 0b1;;
int Tyre_Pressure_Frnt_Lft = random(0,49);
int Tyre_Pressure_Frnt_Right = random(0,49);
int Tyre_Pressure_Rear_Lft = random(0,49);
int Tyre_Pressure_Rear_Right =random(0,49);
int Tyre_Temp_Frnt_Lft = random(-11,90);;
int Tyre_Temp_Frnt_Right = random(-11,90);
int Tyre_Temp_Rear_Lft = random(-11,90);;
int Tyre_Temp_Rear_Right = random(-11,90);;
canMsg12.data[0] =TIREtronics<<7|Tyre_Pressure_Frnt_Lft & 0x7F;
canMsg12.data[1] =Tyre_Pressure_Frnt_Right & 0xFF;
canMsg12.data[2] = Tyre_Pressure_Rear_Lft & 0xFF;
canMsg12.data[3] = Tyre_Pressure_Rear_Right & 0xFF;
canMsg12.data[4] = Tyre_Temp_Frnt_Lft & 0xFF;
canMsg12.data[5] = Tyre_Temp_Frnt_Right & 0xFF;
canMsg12.data[6] = Tyre_Temp_Rear_Lft & 0xFF;
canMsg12.data[7] = Tyre_Temp_Rear_Right & 0xFF;
mcp2515.sendMessage(&canMsg12);
delay(50);
}
Seat Belt Reminder Logic:
//SEATBELT
//Anusha M S___26/10/22
The requirement for seat belt logic is taken from
float vehicle_speed=6;
bool Driver_sw =0,Passenger_sw=0,Pod_dr=1,Pod_ps= 0,state,status;
int ignition_key_cylinder =3,beep,timer;
bool seat_belt_warn_lamp,Buzzer;
//=============================
int initialarm(int b){
Buzzer = 1;
for(int i = 0;i< b;i++){
seat_belt_warn_lamp = 1;
Serial.println("Seatbelt indicator and buzzer on");
delay(20);
Buzzer = 0;
delay(280);
seat_belt_warn_lamp = 0;
delay(300);
}
return;
}
//=====================================================
int alarm_off(){
seat_belt_warn_lamp = Buzzer = 0;
Serial.println("Buzzer and Warn_Lamp OFF");
}
//================================================================================================
int slow_beep(){
do{
seat_belt_warn_lamp = Buzzer = 1;
Serial.println("Slow Beep");
delay(650);
seat_belt_warn_lamp = Buzzer = 0;
delay(350);
if(vehicle_speed >5)
break;
}while ( Driver_sw & Passenger_sw == 0);
}
int fast_beep(){
do{
seat_belt_warn_lamp = Buzzer = 1;
Serial.println("Fast Beep");
delay(220);
seat_belt_warn_lamp = Buzzer = 0;
delay(110);
}while ( Driver_sw & Passenger_sw == 0);
}
int slow_chime(){
seat_belt_warn_lamp = Buzzer = 1;
Serial.println("Slow chime");
delay(650);
seat_belt_warn_lamp = Buzzer = 0;
delay(554);
}
//===========================================
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
if (ignition_key_cylinder == 2){
beep= 2;
initialarm(beep);
}
else if(ignition_key_cylinder == 3 ){
status = check_seat();
if (status == 0){
millis();
while (millis() < 6000){
slow_chime();
}
if (millis() > 6000){
if(vehicle_speed < 5){
slow_beep();
}
else if(vehicle_speed > 5){
fast_beep();
}
}
}
else if (status == 1){
alarm_off();
}
}
/*
if( Driver_sw==1 & Passenger_sw ==1 & Rear_lft_blt_sw == 1 & Rear_lft_blt_sw == 1 & Rear_middle_sw == 1){
Serialprintln("Seatbelt_buckled");
alarm_off();
}*/
}
int check_seat(){
if (Pod_dr & Pod_ps == 1){
if (Driver_sw & Passenger_sw == 1) {
int state = 1;
return(state);
}
else
int state = 0;
return(state);
}
else if (Pod_dr & Pod_ps == 0){
if (Pod_dr & Driver_sw == 1 ){
int state = 1;
return(state);
}
else if (Pod_dr & Driver_sw == 0 ){
int state = 0;
return(state);
}
}
}
CAN Communication Matrix
CAN Communication Matrix is prepared using CANdB++