找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2049|回复: 0
收起左侧

STM32单片机简易光控温控系统 HAL库程序+原理图PCB文件

[复制链接]
ID:302883 发表于 2022-5-2 21:20 | 显示全部楼层 |阅读模式
之前做的项目整理了一下,基于STM32(HAL库)简易光控温控系。相互学习,资料仅供参考 谢谢。
        本设计系统虽然是一个简易桌面系统,而且其中硬件功能比较单一,但是其中开发流程还是比较齐全的,过程涉及到软件比较通用,对于想入门的stm32的初学者也是比较友好的。其中涉及,硬件电路设计,程序设计,HAL库使用,STM32CubeMX软件使用。
       作品还有许多可以地方可以完善的,由于个人能力和经验的不足,作品还存在着或多或少的缺陷,比如可添加摄像头功能用于检测坐姿或者是家长监督等。若是与语音模块结合可起到监督小孩坐姿不端正等好处。还可以添加无线模块,能起到远程控制功能等。程序可以加入算法,能更好的达到自动控制效果,程序继续优化可以使作品更稳定些。
制作出来的实物图如下:
51hei.png
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
51hei.png 51hei.png

主程序流程图

51hei.png

单片机源程序如下:
  1. #include "regulation/regulation.h"

  2. /********************************************************
  3.         本文件用于编写有需要进行多个外设联合调控的程序
  4. *********************************************************/

  5. //创建一个温度调控的结构体变量,方便温度调控的配置
  6. Temperature_SetTypeDef Tem_Regula_Set;
  7. //创建一个亮度调控的结构体变量,方便温度调控的配置
  8. Brightness_SetTypeDef Bri_Regula_Set;

  9. /*
  10. 函数名称:Regulation_Init()
  11. 函数功能:初始化需要调控的数据,避免初始值过于混乱
  12. 输入参数:无
  13. 输出参数:无
  14. 备 注  :
  15. */
  16. void Regulation_Init(void)
  17. {
  18.         //温度调控初始化值
  19.         Tem_Regula_Set.Mode = 0;                        //温度调控初始为手动模式
  20.         Tem_Regula_Set.Tem_Low_Limit = 25;        //温度调控的下限值为23
  21.         Tem_Regula_Set.Tem_Up_Limit = 27;        //温度调控的上限值为24
  22.         Tem_Regula_Set.Moto_Pwm_Val = 0;        //输出调控值为0
  23.         
  24.         //亮度调控初始化值
  25.         Bri_Regula_Set.Mode = 0;                        //亮度调控初始化为手动模式
  26.         Bri_Regula_Set.Bri_Low_Limit = 20;        //亮度调控下限值为20
  27.         Bri_Regula_Set.Bri_Up_Limit = 70;        //亮度调控上限值为50
  28.         Bri_Regula_Set.Bri_Median = 50;                //亮度调控的中值为50
  29.         Bri_Regula_Set.LED_Pwm_Val = 0;                //LED照明控制输出为0
  30.         Bri_Regula_Set.Work_Flag = 0;                //复位LED灯的工作状态
  31.         Bri_Regula_Set.Resolution = 1;                //初始化LED控制的分辨率为1
  32.         Bri_Regula_Set.offset = 5;                        //初始化LED的偏移值为5
  33. }
  34.         

  35. /*
  36. 函数名称:Temperature_Set()
  37. 函数功能:用于对温度控制的配置更新
  38. 输入参数:无
  39. 输出参数:无
  40. 备 注  :
  41. */
  42. void Temperature_Set(void)
  43. {
  44.         if(Tem_Regula_Set.Mode == 1)                //手动模式
  45.         {
  46.                 Moto.PwmVal = Tem_Regula_Set.Moto_Pwm_Val;                //将设定好的值赋予到电机的控制变量中
  47.                 Moto_Control_Update();                                                        //刷新电机控制输出的值
  48.         }
  49.         else if(Tem_Regula_Set.Mode == 0)        //自动模式
  50.         {
  51.                 if((DS18B20_Tem.Tem/10) < Tem_Regula_Set.Tem_Low_Limit)                //判断读取到的温度值是否低于下限值
  52.                 {
  53.                         Moto.PwmVal = 0;                        //停止电机的工作
  54.                         Moto_Control_Update();                //刷新电机控制输出的值
  55.                 }
  56.                 else if((DS18B20_Tem.Tem/10) > Tem_Regula_Set.Tem_Up_Limit)        //判断读取到的温度值是否大于上限值
  57.                 {
  58.                         Moto.PwmVal = ((DS18B20_Tem.Tem/10) - Tem_Regula_Set.Tem_Low_Limit) + 6;                //计算电机的输出速度
  59.                         Moto_Control_Update();                //刷新电机控制输出的值
  60.                 }
  61.         }
  62.         if(Tem_Regula_Set.Tem_Low_Limit > Tem_Regula_Set.Tem_Up_Limit)                //判断下限值是否大于上限值
  63.                 Tem_Regula_Set.Tem_Low_Limit = (Tem_Regula_Set.Tem_Up_Limit - 1);
  64. }



  65. /*
  66. 函数名称:Brightness_Set()
  67. 函数功能:用于对亮度调控的配置更新
  68. 输入参数:无
  69. 输出参数:无
  70. 备 注  :
  71. */
  72. void Brightness_Set(void)
  73. {
  74. if(Bri_Regula_Set.Mode == 1)                //手动模式
  75.         {
  76.                 if(Bri_Regula_Set.LED_Pwm_Val != 0)
  77.                         Bri_Regula_Set.LED_Pwm_Val--;
  78.                 LED_Pwm_Val = Bri_Regula_Set.LED_Pwm_Val;                //将设定好的亮度值赋予到LED照明输出端口中
  79.                 LED_PWM_Update();                                                                //刷新LED控制输出的值
  80.         }
  81.         else if(Bri_Regula_Set.Mode == 0)        //自动模式
  82.         {
  83.                 if(brightness.BriVal > Bri_Regula_Set.Bri_Up_Limit)                //判断读取到的亮度值是否高于上限值
  84.                 {
  85.                         Bri_Regula_Set.Work_Flag = 0;        //复位LED灯的工作状态
  86.                         LED_Pwm_Val = 0;                        //停止LED照明的工作
  87.                         LED_PWM_Update();                        //刷新LED照明控制输出的值
  88.                 }
  89.                 else if(brightness.BriVal < Bri_Regula_Set.Bri_Low_Limit)        //判断读取到的亮度值是否小于下限值
  90.                 {
  91.                         Bri_Regula_Set.Work_Flag = 1;        //置位LED灯的工作状态                        
  92.                 }
  93.                 if(Bri_Regula_Set.Work_Flag)                //LED灯处于工作状态
  94.                 {
  95.                         if((Bri_Regula_Set.Bri_Median - brightness.BriVal) > Bri_Regula_Set.offset)                                //判断读取到的亮度值与设置的中间值差大于5(当读取的亮度值小于中间值时)
  96.                                 LED_Pwm_Val+=Bri_Regula_Set.Resolution;                                                                                                                                                //如果读取到的亮度值,小于设置的中间值,那么增加LED的控制端口量(这样做是为了不会在一瞬间使LED的控制值太大)
  97.                         else if((brightness.BriVal - Bri_Regula_Set.Bri_Median) > Bri_Regula_Set.offset)                //判断读取到的亮度值与设置的中间值差大于5(当读取的亮度值大于中间值时)
  98.                                 LED_Pwm_Val-=Bri_Regula_Set.Resolution;                                                                                                                                                //如果读取到的亮度值,大于设置的中间值,那么减少LED的控制端口量(这样做是为了不会在一瞬间直接关闭LED的控制)
  99.                         
  100.                         if(LED_Pwm_Val > 100)                                                                                        //判断LED_Pwm_Val是否超出控制范围
  101.                                 LED_Pwm_Val = 100;
  102.                         if(LED_Pwm_Val < 0)                                                                                                //判断LED_Pwm_Val是否超出控制范围
  103.                                 LED_Pwm_Val = 0;
  104.                         
  105.                         LED_PWM_Update();                        //刷新LED照明控制输出的值
  106.                 }
  107.         }
  108.         if(Bri_Regula_Set.Bri_Low_Limit > Bri_Regula_Set.Bri_Up_Limit)                //判断下限值是否大于上限值(下限值不能大于上限值)
  109.                 Bri_Regula_Set.Bri_Low_Limit = (Bri_Regula_Set.Bri_Up_Limit - 1);
  110.         if(Bri_Regula_Set.Bri_Median > Bri_Regula_Set.Bri_Up_Limit)                        //判断中值是否大于上限值
  111.                 Bri_Regula_Set.Bri_Median = (Bri_Regula_Set.Bri_Up_Limit - 1);
  112.         if(Bri_Regula_Set.Bri_Low_Limit > Bri_Regula_Set.Bri_Median)                        //判断下限值不能大于中间值
  113.                 Bri_Regula_Set.Bri_Low_Limit = (Bri_Regula_Set.Bri_Median - 1);
  114. }
复制代码
  1. #include "task_list/task_list.h"


  2. //创建一个任务结构类型的数组,用于存放不同的任务,方便时间片的计时处理
  3. //在这里添加你需要增加的任务
  4. TASK_StatusTypeDef TaskComps[TASK_NUM] =
  5. {
  6.         {0,50,50,DS18B20_Update},                        //更新DS18B20的数据
  7.         {0,500,500,Brightness_Update},                        //更新亮度的数据
  8.         
  9.         //{0,100,100,Temperature_Set},                        //更新温度调节
  10.         //{0,100,100,Brightness_Set},                        //更新亮度调节
  11.         
  12.         {0,50,50,Dis_Mark},                                                //更新界面的数据
  13. //        {0,200,200,Beep_Toggle},                                //更新蜂鸣器翻转状态
  14.         {0,500,500,LED1_Toggle}                                        //翻转LED1,确认程序一直在工作
  15. //        {0,500,500,LED2_Toggle}
  16.         //在这里添加需要执行的任务,请根据任务的数量修改TASK_NUM的值
  17. };

  18. /*
  19. 函数名称:Init_Sys()
  20. 函数功能:将所有外设需要的初始化放到这个函数底下,方便统一管理
  21.                         本函数在主函数中被调用
  22. 输入参数:无
  23. 输出参数:无
  24. 备 注  :
  25. */
  26. void Init_Sys(void)
  27. {
  28.         
  29.         delay_init(84);                //初始化滴答时钟,使用内部时钟这里设置成84,如果使用外部时钟,这里可设置成12
  30.         
  31.         OLED_Init();                        //初始化OLED,先初始化OLED用于显示初始化的进度
  32.         Flip_Screnn(1);        
  33.         
  34.         LED_Init();                                                        //LED端口初始化
  35.         LED_PWM_Init();
  36.                
  37.         DS18B20_Init();

  38.         Moto_Init();                        //电机初始化

  39.         Beep_GPIO_Init();
  40.         
  41.         Beep_Pwm_Init();                        //初始化蜂鸣器PWM控制
  42. //        Regulation_Init();                        //调控值初始化
  43.         
  44.         Mark_Sign.Interface_Mark = Main_Interface;
  45. }

复制代码

  1. #include "architecture/architecture.h"



  2. /*
  3. 函数名称:Time_Slice()
  4. 函数功能:任务标志位的处理,也是时间片的计时,
  5.                         本函数在计时器中断中被调用,实现
  6.                         一个时间梯度进行一次递减
  7. 输入参数:无
  8. 输出参数:无
  9. 备 注  :
  10. */
  11. void Time_Slice(void)
  12. {
  13.         uint8_t i;                        //定义一个变量用于循环计数来处理不同任务的时间记录
  14.         for(i=0;i<TASK_NUM;i++)                //逐个任务时间处理
  15.         {
  16.                 if(TaskComps[i].Timer)        //判断当前任务的时间片不为0
  17.                 {
  18.                         TaskComps[i].Timer--;                //减去一个节拍
  19.                         if(TaskComps[i].Timer==0)        //如果时间片减到0
  20.                         {
  21.                                 TaskComps[i].Timer = TaskComps[i].ItvTime;        //恢复时间片值,从新下一次计算
  22.                                 TaskComps[i].Run = 1;        //使能任务运行
  23.                         }                        
  24.                 }
  25.         }
  26. }

  27. /*
  28. 函数名称:Task_Process()
  29. 函数功能:任务处理函数,在主函数中被调用,用于判断各个任务是否需要被运行
  30. 输入参数:无
  31. 输出参数:无
  32. 备 注  :
  33. */
  34. void Task_Process(void)
  35. {
  36.         uint8_t i;                //创建一个变量,用于循环任务的计数
  37.         for(i=0;i<TASK_NUM;i++)                //逐个任务处理
  38.         {
  39.                 if(TaskComps[i].Run)        //如果运行标志位不为0
  40.                 {
  41.                         TaskComps[i].TaskHook();        //运行任务
  42.                         TaskComps[i].Run = 0;                //清除标志位
  43.                 }
  44.         }
  45. }
  46. /*
  47. 函数名称:
  48. 函数功能:
  49. 输入参数:
  50. 输出参数:
  51. 备 注  :
  52. */

复制代码
51hei附件下载,仅供参考:
51hei.png

程序设计.7z

6.78 MB, 下载次数: 30, 下载积分: 黑币 -5

程序

硬件设计.rar

4.06 MB, 下载次数: 27, 下载积分: 黑币 -5

硬件

文档 仅供参靠.7z

7.1 MB, 下载次数: 21, 下载积分: 黑币 -5

文件

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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