先前看到很多報導有關緊急煞車的時後煞車燈會自動閃爍的系統 可有效提醒後方駕駛注意

 
後來仿間也出現了很多類似的產品
 
最簡單的大概就是用ne555了吧 透過簡單的設定加上可relay 就可以完成了…
 
 
若是單單使用NE555的話,變成每次踩煞車都會閃爍,之後驗車會有問題,而且也不合乎所謂的緊急煞車閃爍,因此後來電路上就會變成加上個G-senor來判斷車子狀況
電路的部分,懶的用protel畫,就先用手劃個簡單圖來看看吧
 
簡單來說就是用mcu+gsenor來判斷車子是否為緊急煞車! 當G值大於0.6時轉為閃爍狀態 !
g-sensor模組目前網路上都買的到現成的,一塊也才100塊左右
而輸出控製的部分,就不用relay了,不然每次聽到relay機械作動聲都覺得有點煩,因此,在這裡就利用電晶體來做一個開關電路來控制
....
 
IMG_20150913_110650  
 
程式的部分 就很簡單,讀i2c, 判斷是否有大於0.6G, 是否有break訊號
內容可能有些不完整,目前還在整理中,待完成後再放上完整版給各位
 
/**************************************************/

#include <16F690.h>
#include <math.h>
#use delay (clock = 4000000)

#use i2c(master, sda=PIN_B4, scl=PIN_B6)

 


int adxl345_read(int add){
int retval;
i2c_start();
i2c_write(W_DATA);
i2c_write(add);
i2c_start();
i2c_write(R_DATA);
retval=i2c_read(0);
i2c_stop();
return retval;
}

long x,y,z;
int i=0;

int1 indicator=0;

//Function declearation
void initialize();
void readRegister(int max);

 


#define BLINKTIME 50
#define range 70
void main() {

unsigned lightState= 0;
signed int16 tempx,tempy,tempz;
unsigned int16 blinkcounter = BLINKTIME;
char enFlag =0;
float Heading;
volatile unsigned char BreakFlag;
int x=10;
int i=0;
signed int16 tmp[3];

output_high(PIN_B7);

adxl345_init();

BreakFlag=input(PIN_A2);
tmp[0]=0,tmp[1]=12;tmp[2]=248;
BASIC[0]=0,BASIC[1]=12;BASIC[2]=248;



while(1){
output_low(PIN_C2);
A_data[0]=adxl345_read(0x32); //Read X axis(LSB)
A_data[1]=adxl345_read(0x33); //Read X axis(MSB)
A_data[2]=adxl345_read(0x34); //Read Y axis(LSB)
A_data[3]=adxl345_read(0x35); //Read Y axis(MSB)
A_data[4]=adxl345_read(0x36); //Read Z axis(LSB)
A_data[5]=adxl345_read(0x37); //Read Z axis(MSB)

Xa=make16(A_data[1],A_data[0]);//Converting two 8 bit integer to one 16 bit integer
Ya=make16(A_data[3],A_data[2]);
Za=make16(A_data[5],A_data[4]);

Heading = atan2((signed int16)Ya,(signed int16)Xa)* 180 / pi + 180;

 

if(i>0)
if(Heading >0.6& BreakFlak)
{
enFlag = 1;

}
else
{

}

//output_high(PIN_C2);
for(i = 0;i<30;i++){
if(enFlag ==1 && blinkcounter >0)
{
if(lightState ==1)
{
lightState=0;
// output_low(PIN_C2);
output_low(PIN_B7);

}
else if(lightState ==0)
{
// output_high(PIN_C2);
output_high(PIN_B7);
lightState=1;

}
blinkcounter --;
if(blinkcounter <=1)
{

output_high(PIN_B7);
blinkcounter =BLINKTIME;
enFlag =0;
}

}
delay_ms(150);
}


}

/**************************************************************************/

 
未完待續...
arrow
arrow

    Mr Sitdownplz 發表在 痞客邦 留言(0) 人氣()