目录
一、前言
二、项目简介
1.功能详解
2.主要器件
三、原理图设计
四、PCB硬件设计
1.PCB图
2.PCB板及元器件图
五、步调设计
六、实验效果
七、资料内容
项目分享
一、前言
项目制品图片:
哔哩哔哩视频链接:
https://www.bilibili.com/video/BV1kQ4y1p77V/?share_source=copy_web&vd_source=097fdeaf6b6ecfed8a9ff7119c32faf2
(资料分享见文末)
二、项目简介
1.功能详解
基于STM32智能台灯体系。
功能如下:
- 亮度控制:按键控制照明灯的亮度(5挡亮度)
- 计时功能:按键启动计时,累计台灯运行时间(作息时间)
- OLED表现:表现当前模式、环境光强、超声波距离
- 控制模式:通过按键控制照明灯为手动模式/自动模式
- 蓝牙APP控制:通过蓝牙APP控制照明灯模式选取、亮度调治、计时等功能
- 智能调光:自动模式下根据外界光线变化,LED照明灯自动调治亮度
- 人体姿态提醒:超声波距离近于5cm触发蜂鸣器报警,提醒纠正人体姿态
2.主要器件
- STM32F103C8T6最小体系板
- OLED表现屏(4针I2C协议)
- 光敏传感器
- 大功率LED照明灯模块
- HC-SR04超声波传感器
- HC-SR501人体红外传感器
- 蓝牙模块(BT04-A)
- 蜂鸣器
三、原理图设计
四、PCB硬件设计
1.PCB图
2.PCB板及元器件图
五、步调设计
- 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<HEART_MAX_ERROR) //读取到的值再正常心率区间 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)) //凌晨00:00:00 清除步数
- {
- 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;
- }
-
- }
- }
复制代码 六、实验效果
七、资料内容
项目分享
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |