STM32项目分享:智能台灯体系

打印 上一主题 下一主题

主题 533|帖子 533|积分 1599

目录
一、前言
二、项目简介
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板及元器件图


五、步调设计 

  1. int main(void)
  2. {       
  3.         unsigned char p[16]=" ";
  4.         u8 datatemp[SIZE];       
  5.         unsigned int  STEP=0;                        //步数临时替换值                       
  6.         _Bool Heart_OK = 0;                                //读取到正确心率标志位
  7.         unsigned char Heart = 0;                //心率值
  8.         short temperature = 0;                                 //温度值
  9.        
  10.         STEPS_DIS = 1;
  11.         delay_init();                                    //延时函数初始化          
  12.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);//设置中断优先级分组为组3:2位抢占优先级,2位响应优先级
  13.        
  14.     LED_Init();                                                  //初始化与控制设备连接的硬件接口
  15.         OLED_Init();                                        //OLED初始化
  16.         delay_ms(50);
  17.         OLED_CLS();                                                //清屏
  18.         OLED_ShowCN(32,2,0);                        //万事可期(欢迎使用)
  19.         OLED_ShowCN(32+16,2,1);
  20.         OLED_ShowCN(32+32,2,2);
  21.         OLED_ShowCN(32+32+16,2,3);
  22.         ADXL345_Init();
  23.        
  24.         while(ADXL345_Init())                        //3D加速度传感器初始化       
  25.         {
  26.                 OLED_ShowStr(0,0,"ADXL345 Error",2);
  27.                 delay_ms(200);
  28.                 OLED_ShowStr(0,0,"             ",2);
  29.                 delay_ms(200);
  30.         }
  31.         while(DS18B20_Init())        //DS18B20初始化       
  32.         {
  33.                 OLED_ShowStr(0,0,"DS18B20 Error",2);
  34.                
  35.                 delay_ms(200);
  36.                 OLED_ShowStr(0,0,"             ",2);       
  37.                 delay_ms(200);
  38.         }
  39.         delay_ms(100);
  40.         while(DS18B20_Get_Temp()==850);        //DS18B20刚上电时候 读取的值是850 这里等待 直到不是850才开始下一步               
  41.         delay_ms(5000);
  42.        
  43.         OLED_CLS();                                                //清屏
  44.         Adc_Init();
  45.         TIM3_Int_Init(1999,71);                        //定时2ms中断
  46.        
  47.         uart_init(9600);                                 //串口一初始化为9600
  48.         TIM2_Int_Init(199,7199);                //10Khz的计数频率,计数到500为20ms
  49.         KEY_Init();                                                //IO初始化               
  50.         EXTIX_Init();                                        //外部中断初始化
  51.        
  52.         OLED_CLS();                                                //清屏
  53.         Dis_Init();                                               
  54.         STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)datatemp,SIZE);  //flash中读出步数
  55.        
  56.         STEPS = (datatemp[0]-0x30)*10000+(datatemp[1]-0x30)*1000+(datatemp[2]-0x30)*100+(datatemp[3]-0x30)*10+(datatemp[4]-0x30);//读到值转换为步数
  57.         RTC_Init();
  58.        
  59. //        RTC_Set(2019,8,5,20,43,55);  //设置时间
  60.         while(1)
  61.         {       
  62.                 if(Timer_Flag==1)                                        //500ms到 读取数据
  63.                 {
  64.                         Timer_Flag = 0;                                        //清除标志
  65.                         TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE );                                                 //使能指定的TIM3中断,允许更新中断
  66.                         TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE );                                                 //使能指定的TIM3中断,允许更新中断               
  67.                         temperature=DS18B20_Get_Temp();        //读取温度
  68.                         TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE );                                                 //使能指定的TIM3中断,允许更新中断
  69.                         TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );                                                 //使能指定的TIM3中断,允许更新中断
  70.                         TIM_Cmd(TIM2, ENABLE);                  //使能TIMx       
  71.                         if (QS == true)                                        //读取到了心率信号
  72.                         {                       
  73.                                 QS = false;                                 //清除标志 等待下一次读取
  74.                                 if(BPM>HEART_MIN_ERROR&&BPM<HEART_MAX_ERROR)                //读取到的值再正常心率区间 40-160内
  75.                                 {
  76.                                         Heart_OK = 1;                        //标志位置一
  77.                                         Heart = BPM;                        //心率传递给Heart
  78.                                 }
  79.                                 else
  80.                                 {
  81.                                         Heart_OK = 0;                        //标志位清零
  82.                                         Heart = 0;                                //设置为0
  83.                                 }       
  84.                         }
  85.                 }
  86.                                
  87.                 if(ADXL345_FLAG==1)                                        //20ms到?
  88.                 {
  89.                         ADXL345_FLAG = 0;                                  //清除标志位
  90.                         step_counter();       
  91.                 }
  92. //                printf("三轴加速器: %d \r\n",ADXL345_FLAG);        //串口发送出去
  93.                 delay_ms(20);       
  94.                 if(STEP!=STEPS)                                                //步数发生改变 存储一次
  95.                 {
  96.                         STEP = STEPS;
  97.                         TEXT_Buffer[0]=(u16)STEPS/10000+0x30;
  98.                         TEXT_Buffer[1]=(u16)STEPS%10000/1000+0x30;
  99.                         TEXT_Buffer[2]=(u16)STEPS%10000%1000/100+0x30;
  100.                         TEXT_Buffer[3]=(u16)STEPS%10000%1000%100/10+0x30;
  101.                         TEXT_Buffer[4]=(u16)STEPS%10000%1000%100%10+0x30;
  102.                         STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE);
  103.                 }
  104.                 if(calendar.hour==0&&calendar.min==0&&(calendar.sec==0||calendar.sec==1||calendar.sec==2))                //凌晨00:00:00  清除步数
  105.                 {
  106.                         STEPS = 0;
  107.                         TEXT_Buffer[0]=(u16)STEPS/10000+0x30;
  108.                         TEXT_Buffer[1]=(u16)STEPS%10000/1000+0x30;
  109.                         TEXT_Buffer[2]=(u16)STEPS%10000%1000/100+0x30;
  110.                         TEXT_Buffer[3]=(u16)STEPS%10000%1000%100/10+0x30;
  111.                         TEXT_Buffer[4]=(u16)STEPS%10000%1000%100%10+0x30;
  112.                         STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE);
  113.                         delay_ms(500);
  114.                        
  115.                 }
  116.                 Key_set();                                                        //时间设置
  117.        
  118.                 if(KEY0==0)                                                        //KEY0切换显示按键
  119.                 {
  120.                         while(KEY0==0);                                        //等待松开
  121.                         OLED_CLS();                                                //清屏       
  122.                         if(Dis_mode==0)                                        //如果上一次是显示心率、步数、体温 的 则显示时间
  123.                                 Dis_mode = 1;
  124.                         else                                                         //如果上一次不是显示心率、步数、体温 的 则心率、步数、体温
  125.                         {
  126.                                 Dis_mode = 0;                               
  127.                                 Dis_Init();                                        //显示汉字信息
  128.                         }               
  129.                 }
  130.                 if(KEY2==0)                                                           //清除步数
  131.                 {
  132.                         while(KEY2==0);
  133.                         STEPS = 0;
  134.                         TEXT_Buffer[0]=(u16)'0';
  135.                         TEXT_Buffer[1]=(u16)'0';
  136.                         TEXT_Buffer[2]=(u16)'0';
  137.                         TEXT_Buffer[3]=(u16)'0';
  138.                         TEXT_Buffer[4]=(u16)'0';
  139.                         STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE);                //清除后存储一次数据
  140.                 }
  141.        
  142.                 if(update_flag==1)                                         //2S标志到 发送一次数据到手机APP
  143.                 {
  144.                         update_flag = 0;
  145.                         printf("Step:%5d H:%3d T:%4.1f \r\n",STEPS,Heart,(float)temperature/10);        //串口发送出去
  146.                 }
  147.        
  148.                 switch(Dis_mode)
  149.                 {
  150.                         case 0:                                                                                          //显示传感器数据
  151.                                 if(STEPS_DIS==1)                                                        //刷新计步
  152.                                 {
  153.                                         sprintf((char*)p,":%-5d ",STEPS);                //显示步数
  154.                                         OLED_ShowStr(32,2,p,2);
  155.                                 }
  156.                                 sprintf((char*)p,":%4.1f    ",(float)temperature/10);
  157.                                 OLED_ShowStr(32,4,p,2);                                                //显示温度
  158.                                
  159.                                 if(Heart_OK==1)                                                                //读取到正确心率
  160.                                 {
  161.                                         sprintf((char*)p,":%3dr/min",Heart);        //显示心率
  162.                                         OLED_ShowStr(32,0,p,2);       
  163.                                 }
  164.                                 else
  165.                                 {
  166.                                         sprintf((char*)p,":---r/min");       
  167.                                         OLED_ShowStr(32,0,p,2);
  168.                                 }
  169.                         break;
  170.                         case 1:                                                                                        //显示时间 日期等信息
  171.                                 RTC_Display();                                                                //显示时钟
  172.                         break;
  173.                 }
  174.                
  175.         }       
  176. }
复制代码
六、实验效果 



七、资料内容


项目分享


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

干翻全岛蛙蛙

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表