项目成品图片:
01
—
项目简介
1.功能详解
基于STM32智能台灯系统。
功能如下:
亮度控制:按键控制照明灯的亮度(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
—
实验效果
全部0条评论
快来发表一下你的评论吧 !