項目成品圖片:
01
—
項目簡介
1.功能詳解
功能如下:
亮度控制:按鍵控制照明燈的亮度(5擋亮度)
計時功能:按鍵啟動計時,累計臺燈運行時間(作息時間)
OLED顯示:顯示當前模式、環境光強、超聲波距離
控制模式:通過按鍵控制照明燈為自動模式/手動模式
藍牙APP控制:通過藍牙APP控制照明燈模式選取、亮度調節、計時功能
智能調光:自動模式下根據外界光線變化,LED照明燈自動調節亮度
人體姿態提醒:超聲波距離近于5cm觸發蜂鳴器報警,提醒糾正人體姿態
2.材料清單
STM32F103C8T6最小系統板
OLED顯示屏(4針I2C協議)
光敏傳感器
大功率LED照明燈模塊
HC-SR04超聲波傳感器
HC-SR501人體紅外傳感器
藍牙模塊(BT04-A)
蜂鳴器
02
—
原理圖設計
03
—
PCB硬件設計
1.PCB圖
2.PCB板及元器件圖
04
—
程序設計
int main(void){ unsigned char p[16]=" "; u8 datatemp[SIZE]; unsigned int STEP=0; //步數臨時替換值 _Bool Heart_OK = 0; //讀取到正確心率標志位 unsigned char Heart = 0; //心率值 short temperature = 0;
//溫度值 STEPS_DIS = 1; delay_init(); //延時函數初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
//設置中斷優先級分組為組3:2位搶占優先級,2位響應優先級 LED_Init(); //初始化與控制設備連接的硬件接口 OLED_Init(); //OLED初始化 delay_ms(50); OLED_CLS();
//清屏 OLED_ShowCN(32,2,0); //萬事可期(歡迎使用) OLED_ShowCN(32+16,2,1); OLED_ShowCN(32+32,2,2); OLED_ShowCN(32+32+16,2,3); ADXL345_Init(); while(ADXL345_Init()) //3D加速度傳感器初始化
{ OLED_ShowStr(0,0,"ADXL345 Error",2); delay_ms(200); OLED_ShowStr(0,0," ",2);
delay_ms(200); } while(DS18B20_Init()) //DS18B20初始化 { OLED_ShowStr(0,0,"DS18B20 Error",2);
delay_ms(200); OLED_ShowStr(0,0," ",2); delay_ms(200); } delay_ms(100); while(DS18B20_Get_Temp()==850); //DS18B20剛上電時候 讀取的值是850 這里等待 直到不是850才開始下一步 delay_ms(5000); OLED_CLS(); //清屏 Adc_Init(); TIM3_Int_Init(1999,71);
//定時2ms中斷 uart_init(9600); //串口一初始化為9600 TIM2_Int_Init(199,7199); //10Khz的計數頻率,計數到500為20ms KEY_Init();
//IO初始化 EXTIX_Init(); //外部中斷初始化 OLED_CLS(); //清屏 Dis_Init(); STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)datatemp,SIZE); //flash中讀出步數 STEPS = (datatemp[0]-0x30)*10000+(datatemp[1]-0x30)*1000+(datatemp[2]-0x30)*100+(datatemp[3]-0x30)*10+(datatemp[4]-0x30);
//讀到值轉換為步數 RTC_Init(); // RTC_Set(2019,8,5,20,43,55);
//設置時間 while(1) { if(Timer_Flag==1)
//500ms到 讀取數據 { Timer_Flag = 0; //清除標志 TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE ); //使能指定的TIM3中斷,允許更新中斷 TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE );
//使能指定的TIM3中斷,允許更新中斷 temperature=DS18B20_Get_Temp(); //讀取溫度 TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中斷,允許更新中斷 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );
//使能指定的TIM3中斷,允許更新中斷 TIM_Cmd(TIM2, ENABLE); //使能TIMx if (QS == true) //讀取到了心率信號 { QS = false; //清除標志 等待下一次讀取 if(BPM>HEART_MIN_ERROR&&BPM
//讀取到的值再正常心率區間 40-160內 { Heart_OK = 1; //標志位置一 Heart = BPM; //心率傳遞給Heart } else { Heart_OK = 0; //標志位清零 Heart = 0; //設置為0 } } }
if(ADXL345_FLAG==1) //20ms到? { ADXL345_FLAG = 0; //清除標志位 step_counter(); }// printf("三軸加速器: %d \r\n",ADXL345_FLAG);
//串口發送出去 delay_ms(20); if(STEP!=STEPS) //步數發生改變 存儲一次 { STEP = STEPS; TEXT_Buffer[0]=(u16)STEPS/10000+0x30; TEXT_Buffer[1]=(u16)STEPS%10000/1000+0x30; TEXT_Buffer[2]=(u16)STEPS%10000%1000/100+0x30; TEXT_Buffer[3]=(u16)STEPS%10000%1000%100/10+0x30; TEXT_Buffer[4]=(u16)STEPS%10000%1000%100%10+0x30;
STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE); } if(calendar.hour==0&&calendar.min==0&&(calendar.sec==0||calendar.sec==1||calendar.sec==2)) //凌晨0000 清除步數 { STEPS = 0; TEXT_Buffer[0]=(u16)STEPS/10000+0x30; TEXT_Buffer[1]=(u16)STEPS%10000/1000+0x30; TEXT_Buffer[2]=(u16)STEPS%10000%1000/100+0x30; TEXT_Buffer[3]=(u16)STEPS%10000%1000%100/10+0x30; TEXT_Buffer[4]=(u16)STEPS%10000%1000%100%10+0x30; STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE); delay_ms(500); } Key_set();
//時間設置 if(KEY0==0) //KEY0切換顯示按鍵 { while(KEY0==0); //等待松開 OLED_CLS();
//清屏 if(Dis_mode==0) //如果上一次是顯示心率、步數、體溫 的 則顯示時間 Dis_mode = 1; else //如果上一次不是顯示心率、步數、體溫 的 則心率、步數、體溫 { Dis_mode = 0; Dis_Init(); //顯示漢字信息 } } if(KEY2==0) //清除步數 { while(KEY2==0); STEPS = 0; TEXT_Buffer[0]=(u16)'0';
TEXT_Buffer[1]=(u16)'0'; TEXT_Buffer[2]=(u16)'0'; TEXT_Buffer[3]=(u16)'0'; TEXT_Buffer[4]=(u16)'0'; STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE); //清除后存儲一次數據 } if(update_flag==1) //2S標志到 發送一次數據到手機APP { update_flag = 0; printf("Step:%5d H:%3d T:%4.1f \r\n",STEPS,Heart,(float)temperature/10); //串口發送出去 } switch(Dis_mode) { case 0: //顯示傳感器數據 if(STEPS_DIS==1) //刷新計步 { sprintf((char*)p,":%-5d ",STEPS); //顯示步數 OLED_ShowStr(32,2,p,2);
} sprintf((char*)p,":%4.1f ",(float)temperature/10); OLED_ShowStr(32,4,p,2); //顯示溫度 if(Heart_OK==1) //讀取到正確心率 { sprintf((char*)p,":%3dr/min",Heart);
//顯示心率 OLED_ShowStr(32,0,p,2); } else { sprintf((char*)p,":---r/min"); OLED_ShowStr(32,0,p,2); } break; case 1: //顯示時間 日期等信息 RTC_Display(); //顯示時鐘 break; } } }
05
—
實驗效果
-
STM32
+關注
關注
2270文章
10900瀏覽量
356005 -
智能臺燈
+關注
關注
9文章
83瀏覽量
21034 -
系統
+關注
關注
1文章
1017瀏覽量
21344
發布評論請先 登錄
相關推薦
評論