先前看到很多報導有關緊急煞車的時後煞車燈會自動閃爍的系統 可有效提醒後方駕駛注意
後來仿間也出現了很多類似的產品
最簡單的大概就是用ne555了吧 透過簡單的設定加上可relay 就可以完成了…
若是單單使用NE555的話,變成每次踩煞車都會閃爍,之後驗車會有問題,而且也不合乎所謂的緊急煞車閃爍,因此後來電路上就會變成加上個G-senor來判斷車子狀況
電路的部分,懶的用protel畫,就先用手劃個簡單圖來看看吧
簡單來說就是用mcu+gsenor來判斷車子是否為緊急煞車! 當G值大於0.6時轉為閃爍狀態 !
g-sensor模組目前網路上都買的到現成的,一塊也才100塊左右
而輸出控製的部分,就不用relay了,不然每次聽到relay機械作動聲都覺得有點煩,因此,在這裡就利用電晶體來做一個開關電路來控制
....
程式的部分 就很簡單,讀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);
}
}
/**************************************************************************/
未完待續...