当前位置:   article > 正文

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

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

目录

一、前言

二、项目简介

1.功能详解

2.主要器件

三、原理图设计

四、PCB硬件设计

1.PCB图 

2.PCB板及元器件图

五、程序设计 

六、实验效果 

七、资料内容

项目分享


一、前言

项目成品图片:

哔哩哔哩视频链接:

https://www.bilibili.com/video/BV1kQ4y1p77V/?share_source=copy_web&vd_source=097fdeaf6b6ecfed8a9ff7119c32faf2

(资料分享见文末) 

二、项目简介

1.功能详解

基于STM32智能台灯系统。

功能如下:

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

六、实验效果 

七、资料内容

项目分享

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/690862
推荐阅读
相关标签
  

闽ICP备14008679号