一、項目介紹
隨著科技的發展,人們對低碳環保的認知和需求不斷提高。騎自行車既能夠低碳環保,又能夠鍛煉身體,成為了很多人出行的首選。然而,由于自行車本身沒有帶指示燈,比如剎車指示燈等,所以自行車的安全性并不是很好,如果人們在騎自行車時緊急剎車,后車無法及時判斷前方自行車的行為,容易造成交通事故。因此,設計一款自動剎車燈系統具有十分重要的意義。
本項目實現了通過安裝ADXL345陀螺儀和四枚LED燈還有STM32F103C8T6主控芯片來實現自行車自動剎車燈的功能。當自行車上安裝了該設備后,ADXL345通過IIC通信協議將X,Y,Z三軸的加速度實時值發送給SMT32F103C8T6主控芯片,并結合STM32高級定時器的PWM功能,輸出不同占空比的脈沖,控制不同的LED燈輸出多種亮度等級,從而控制不同的LED的開關以及明暗,并且通過不同亮度的紅光和綠光混合,能夠得到黃色的LED燈光。這樣,在自行車急剎或者加速時,實時地控制LED燈的亮度和顏色,讓后方車輛能夠更清楚地了解前方自行車的行為,從而做出快速的反應,保障騎行者以及后車的安全。同時,該系統也能夠提高自行車的可見性,并且對于追求低碳環保的人群來說,讓自行車既能低碳環保,又能夠鍛煉身體。
二、設計思路
2.1 項目目標
本項目通過安裝ADXL345陀螺儀和四枚LED燈還有STM32F103C8T6主控芯片來實現自行車自動剎車燈的功能,使得自行車在急剎或者加速時,實時地控制LED燈的亮度和顏色,提高其可見性,降低交通事故的風險。同時,該系統還能夠使自行車既能低碳環保,又能夠鍛煉身體。
2.2 項目硬件構成
(1)自行車:作為安裝系統的物體,需要有一個固定的位置來安裝ADXL345陀螺儀和四枚LED燈。
(2)ADXL345陀螺儀:通過IIC通信協議與STM32F103C8T6主控芯片通信,并將X、Y、Z三軸的加速度實時值發送給SMT32F103C8T6主控芯片。
(3)四枚LED燈:使用不同亮度的紅光和綠光混合,能夠得到黃色的LED燈光。通過控制其亮度和顏色來提高自行車的可見性。
(4)STM32F103C8T6主控芯片:根據接收到的ADXL345數據,結合STN32的高級定時器的PWM功能,輸出不同占空比的脈沖,控制不同的LED燈輸出多種亮度等級。
2.3 項目功能實現
(1)自行車加速度監測:ADXL345陀螺儀通過IIC通信協議與STM32F103C8T6主控芯片通信,實時地感知自行車的加速度變化。
(2)LED燈亮度和顏色控制:STM32F103C8T6主控芯片運用高級定時器的PWM功能,能夠輸出不同占空比的脈沖,并控制不同的LED燈輸出多種亮度等級,通過不同亮度的紅光和綠光混合,能夠得到黃色的LED燈光,提高自行車的可見性。
(3)系統安裝和調試:需要將ADXL345陀螺儀和四枚LED燈與STM32F103C8T6主控芯片連接起來,并進行系統測試和調試。
三、系統測試
3.1 功能樣機安裝與焊接
繪制好電路原理圖之后,按照原理圖將自動剎車燈系統的各個模塊安裝在事先購買好的洞洞板上,然后用導線將他們連接在一起,最后再焊接在一起,做成完整的自動剎車燈電路板。
3.2 ADXL345模塊調試
當上電后,將自動剎車燈電路的串口2外設引腳連接至PC端,將加速度解算后的實際值發送至PC端,通過PC端串口調試助手顯示出具體數值,再觀察數值是否符合常理。
通過顯示的數據信息,可以推測出ADXL345陀螺儀能夠正常工作。
3.3 實物調試
最后階段,將對自行車自動剎車燈進行實物調試,確定其基本功能能夠正常實現。
當系統上電后,左右各一枚LED發出低亮黃色燈光,如下圖。
靜置30S后,所有LED均熄滅,如下圖。
當檢測到震動后,重新亮起兩盞黃色LED燈,如下圖。
當檢測到剎車時,四枚LED燈均以高亮發出紅色燈光,如下圖。
結合自行車自動剎車燈的功能需求和實物調試結果,可以發現,調試結果完全符合自動剎車燈的預期功能。
四、代碼設計
4.1 主函數
#include "stm32f10x.h"
#include "usart.h"
#include "led.h"
#include "RTC_Time.h"
#include < stdio.h >
#include "delay.h"
#include "sys.h"
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#include "adxl345.h"
int main(void)
{
u32 flag=0;
short x, y, z;
float accelerated;
LED_GPIO_Config();//初始化LED
USART2_Config();
delay_init(); //延時函數初始化
PWM_LED_INIT(); //PWM PA8-9
LED_Init(); //PB7 LED-R
PBout(7) = 1;
ADXL345_Init(); //PB 10,11
ADXL345_Read_Average(&x, &y, &z, 20);
ADXL345_AUTO_Adjust((char *)&x, (char *)&y, (char *)&z);
TIM_SetCompare1(TIM1, 50); //設置TIMx捕獲比較1寄存器(通道1)值(脈沖寬度) 占空比%20
TIM_SetCompare2(TIM1, 50); //設置TIMx捕獲比較2寄存器(通道2)值(脈沖寬度) 占空比%20
while (1)
{
ADXL345_Read_Average(&x, &y, &z, 5); //讀加速度值
accelerated=(x*3.9/1000*9.8); //加速度實際值
printf("X=%4.1f Y=%4.1f Z=%4.1f
",accelerated,(y*3.9/1000*9.8),(z*3.9/1000*9.8));
while(flag >425)
{
TIM_SetCompare1(TIM1, 0); //通道2 占空比%0
TIM_SetCompare2(TIM1, 0); //通道2 占空比%0
ADXL345_Read_Average(&x, &y, &z, 5);
accelerated=(x*3.9/1000*9.8);
if(accelerated< -5||accelerated >5)
{
break;
}
}
flag++;
if(accelerated< -4)
{
//四個LED低電平導通
TIM_SetCompare1(TIM1, 0); //GREEN不亮
TIM_SetCompare2(TIM1, 1000); //RED高亮
PBout(7) = 0;
flag=0;
}
if(accelerated >0)
{
PBout(7) = 1;
TIM_SetCompare1(TIM1, 50); //RED低亮
TIM_SetCompare2(TIM1, 50