找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2627|回復(fù): 0
收起左側(cè)

STM32單片機(jī)簡(jiǎn)易光控溫控系統(tǒng) HAL庫(kù)程序+原理圖PCB文件

[復(fù)制鏈接]
ID:302883 發(fā)表于 2022-5-2 21:20 | 顯示全部樓層 |閱讀模式
之前做的項(xiàng)目整理了一下,基于STM32(HAL庫(kù))簡(jiǎn)易光控溫控系。相互學(xué)習(xí),資料僅供參考 謝謝。
        本設(shè)計(jì)系統(tǒng)雖然是一個(gè)簡(jiǎn)易桌面系統(tǒng),而且其中硬件功能比較單一,但是其中開(kāi)發(fā)流程還是比較齊全的,過(guò)程涉及到軟件比較通用,對(duì)于想入門的stm32的初學(xué)者也是比較友好的。其中涉及,硬件電路設(shè)計(jì),程序設(shè)計(jì),HAL庫(kù)使用,STM32CubeMX軟件使用。
       作品還有許多可以地方可以完善的,由于個(gè)人能力和經(jīng)驗(yàn)的不足,作品還存在著或多或少的缺陷,比如可添加攝像頭功能用于檢測(cè)坐姿或者是家長(zhǎng)監(jiān)督等。若是與語(yǔ)音模塊結(jié)合可起到監(jiān)督小孩坐姿不端正等好處。還可以添加無(wú)線模塊,能起到遠(yuǎn)程控制功能等。程序可以加入算法,能更好的達(dá)到自動(dòng)控制效果,程序繼續(xù)優(yōu)化可以使作品更穩(wěn)定些。
制作出來(lái)的實(shí)物圖如下:
51hei.png
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
51hei.png 51hei.png

主程序流程圖

51hei.png

單片機(jī)源程序如下:
  1. #include "regulation/regulation.h"

  2. /********************************************************
  3.         本文件用于編寫有需要進(jìn)行多個(gè)外設(shè)聯(lián)合調(diào)控的程序
  4. *********************************************************/

  5. //創(chuàng)建一個(gè)溫度調(diào)控的結(jié)構(gòu)體變量,方便溫度調(diào)控的配置
  6. Temperature_SetTypeDef Tem_Regula_Set;
  7. //創(chuàng)建一個(gè)亮度調(diào)控的結(jié)構(gòu)體變量,方便溫度調(diào)控的配置
  8. Brightness_SetTypeDef Bri_Regula_Set;

  9. /*
  10. 函數(shù)名稱:Regulation_Init()
  11. 函數(shù)功能:初始化需要調(diào)控的數(shù)據(jù),避免初始值過(guò)于混亂
  12. 輸入?yún)?shù):無(wú)
  13. 輸出參數(shù):無(wú)
  14. 備 注  :
  15. */
  16. void Regulation_Init(void)
  17. {
  18.         //溫度調(diào)控初始化值
  19.         Tem_Regula_Set.Mode = 0;                        //溫度調(diào)控初始為手動(dòng)模式
  20.         Tem_Regula_Set.Tem_Low_Limit = 25;        //溫度調(diào)控的下限值為23
  21.         Tem_Regula_Set.Tem_Up_Limit = 27;        //溫度調(diào)控的上限值為24
  22.         Tem_Regula_Set.Moto_Pwm_Val = 0;        //輸出調(diào)控值為0
  23.         
  24.         //亮度調(diào)控初始化值
  25.         Bri_Regula_Set.Mode = 0;                        //亮度調(diào)控初始化為手動(dòng)模式
  26.         Bri_Regula_Set.Bri_Low_Limit = 20;        //亮度調(diào)控下限值為20
  27.         Bri_Regula_Set.Bri_Up_Limit = 70;        //亮度調(diào)控上限值為50
  28.         Bri_Regula_Set.Bri_Median = 50;                //亮度調(diào)控的中值為50
  29.         Bri_Regula_Set.LED_Pwm_Val = 0;                //LED照明控制輸出為0
  30.         Bri_Regula_Set.Work_Flag = 0;                //復(fù)位LED燈的工作狀態(tài)
  31.         Bri_Regula_Set.Resolution = 1;                //初始化LED控制的分辨率為1
  32.         Bri_Regula_Set.offset = 5;                        //初始化LED的偏移值為5
  33. }
  34.         

  35. /*
  36. 函數(shù)名稱:Temperature_Set()
  37. 函數(shù)功能:用于對(duì)溫度控制的配置更新
  38. 輸入?yún)?shù):無(wú)
  39. 輸出參數(shù):無(wú)
  40. 備 注  :
  41. */
  42. void Temperature_Set(void)
  43. {
  44.         if(Tem_Regula_Set.Mode == 1)                //手動(dòng)模式
  45.         {
  46.                 Moto.PwmVal = Tem_Regula_Set.Moto_Pwm_Val;                //將設(shè)定好的值賦予到電機(jī)的控制變量中
  47.                 Moto_Control_Update();                                                        //刷新電機(jī)控制輸出的值
  48.         }
  49.         else if(Tem_Regula_Set.Mode == 0)        //自動(dòng)模式
  50.         {
  51.                 if((DS18B20_Tem.Tem/10) < Tem_Regula_Set.Tem_Low_Limit)                //判斷讀取到的溫度值是否低于下限值
  52.                 {
  53.                         Moto.PwmVal = 0;                        //停止電機(jī)的工作
  54.                         Moto_Control_Update();                //刷新電機(jī)控制輸出的值
  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;                //計(jì)算電機(jī)的輸出速度
  59.                         Moto_Control_Update();                //刷新電機(jī)控制輸出的值
  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. 函數(shù)名稱:Brightness_Set()
  67. 函數(shù)功能:用于對(duì)亮度調(diào)控的配置更新
  68. 輸入?yún)?shù):無(wú)
  69. 輸出參數(shù):無(wú)
  70. 備 注  :
  71. */
  72. void Brightness_Set(void)
  73. {
  74. if(Bri_Regula_Set.Mode == 1)                //手動(dòng)模式
  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;                //將設(shè)定好的亮度值賦予到LED照明輸出端口中
  79.                 LED_PWM_Update();                                                                //刷新LED控制輸出的值
  80.         }
  81.         else if(Bri_Regula_Set.Mode == 0)        //自動(dòng)模式
  82.         {
  83.                 if(brightness.BriVal > Bri_Regula_Set.Bri_Up_Limit)                //判斷讀取到的亮度值是否高于上限值
  84.                 {
  85.                         Bri_Regula_Set.Work_Flag = 0;        //復(fù)位LED燈的工作狀態(tài)
  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燈的工作狀態(tài)                        
  92.                 }
  93.                 if(Bri_Regula_Set.Work_Flag)                //LED燈處于工作狀態(tài)
  94.                 {
  95.                         if((Bri_Regula_Set.Bri_Median - brightness.BriVal) > Bri_Regula_Set.offset)                                //判斷讀取到的亮度值與設(shè)置的中間值差大于5(當(dāng)讀取的亮度值小于中間值時(shí))
  96.                                 LED_Pwm_Val+=Bri_Regula_Set.Resolution;                                                                                                                                                //如果讀取到的亮度值,小于設(shè)置的中間值,那么增加LED的控制端口量(這樣做是為了不會(huì)在一瞬間使LED的控制值太大)
  97.                         else if((brightness.BriVal - Bri_Regula_Set.Bri_Median) > Bri_Regula_Set.offset)                //判斷讀取到的亮度值與設(shè)置的中間值差大于5(當(dāng)讀取的亮度值大于中間值時(shí))
  98.                                 LED_Pwm_Val-=Bri_Regula_Set.Resolution;                                                                                                                                                //如果讀取到的亮度值,大于設(shè)置的中間值,那么減少LED的控制端口量(這樣做是為了不會(huì)在一瞬間直接關(guān)閉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. }
復(fù)制代碼
  1. #include "task_list/task_list.h"


  2. //創(chuàng)建一個(gè)任務(wù)結(jié)構(gòu)類型的數(shù)組,用于存放不同的任務(wù),方便時(shí)間片的計(jì)時(shí)處理
  3. //在這里添加你需要增加的任務(wù)
  4. TASK_StatusTypeDef TaskComps[TASK_NUM] =
  5. {
  6.         {0,50,50,DS18B20_Update},                        //更新DS18B20的數(shù)據(jù)
  7.         {0,500,500,Brightness_Update},                        //更新亮度的數(shù)據(jù)
  8.         
  9.         //{0,100,100,Temperature_Set},                        //更新溫度調(diào)節(jié)
  10.         //{0,100,100,Brightness_Set},                        //更新亮度調(diào)節(jié)
  11.         
  12.         {0,50,50,Dis_Mark},                                                //更新界面的數(shù)據(jù)
  13. //        {0,200,200,Beep_Toggle},                                //更新蜂鳴器翻轉(zhuǎn)狀態(tài)
  14.         {0,500,500,LED1_Toggle}                                        //翻轉(zhuǎn)LED1,確認(rèn)程序一直在工作
  15. //        {0,500,500,LED2_Toggle}
  16.         //在這里添加需要執(zhí)行的任務(wù),請(qǐng)根據(jù)任務(wù)的數(shù)量修改TASK_NUM的值
  17. };

  18. /*
  19. 函數(shù)名稱:Init_Sys()
  20. 函數(shù)功能:將所有外設(shè)需要的初始化放到這個(gè)函數(shù)底下,方便統(tǒng)一管理
  21.                         本函數(shù)在主函數(shù)中被調(diào)用
  22. 輸入?yún)?shù):無(wú)
  23. 輸出參數(shù):無(wú)
  24. 備 注  :
  25. */
  26. void Init_Sys(void)
  27. {
  28.         
  29.         delay_init(84);                //初始化滴答時(shí)鐘,使用內(nèi)部時(shí)鐘這里設(shè)置成84,如果使用外部時(shí)鐘,這里可設(shè)置成12
  30.         
  31.         OLED_Init();                        //初始化OLED,先初始化OLED用于顯示初始化的進(jìn)度
  32.         Flip_Screnn(1);        
  33.         
  34.         LED_Init();                                                        //LED端口初始化
  35.         LED_PWM_Init();
  36.                
  37.         DS18B20_Init();

  38.         Moto_Init();                        //電機(jī)初始化

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

復(fù)制代碼

  1. #include "architecture/architecture.h"



  2. /*
  3. 函數(shù)名稱:Time_Slice()
  4. 函數(shù)功能:任務(wù)標(biāo)志位的處理,也是時(shí)間片的計(jì)時(shí),
  5.                         本函數(shù)在計(jì)時(shí)器中斷中被調(diào)用,實(shí)現(xiàn)
  6.                         一個(gè)時(shí)間梯度進(jìn)行一次遞減
  7. 輸入?yún)?shù):無(wú)
  8. 輸出參數(shù):無(wú)
  9. 備 注  :
  10. */
  11. void Time_Slice(void)
  12. {
  13.         uint8_t i;                        //定義一個(gè)變量用于循環(huán)計(jì)數(shù)來(lái)處理不同任務(wù)的時(shí)間記錄
  14.         for(i=0;i<TASK_NUM;i++)                //逐個(gè)任務(wù)時(shí)間處理
  15.         {
  16.                 if(TaskComps[i].Timer)        //判斷當(dāng)前任務(wù)的時(shí)間片不為0
  17.                 {
  18.                         TaskComps[i].Timer--;                //減去一個(gè)節(jié)拍
  19.                         if(TaskComps[i].Timer==0)        //如果時(shí)間片減到0
  20.                         {
  21.                                 TaskComps[i].Timer = TaskComps[i].ItvTime;        //恢復(fù)時(shí)間片值,從新下一次計(jì)算
  22.                                 TaskComps[i].Run = 1;        //使能任務(wù)運(yùn)行
  23.                         }                        
  24.                 }
  25.         }
  26. }

  27. /*
  28. 函數(shù)名稱:Task_Process()
  29. 函數(shù)功能:任務(wù)處理函數(shù),在主函數(shù)中被調(diào)用,用于判斷各個(gè)任務(wù)是否需要被運(yùn)行
  30. 輸入?yún)?shù):無(wú)
  31. 輸出參數(shù):無(wú)
  32. 備 注  :
  33. */
  34. void Task_Process(void)
  35. {
  36.         uint8_t i;                //創(chuàng)建一個(gè)變量,用于循環(huán)任務(wù)的計(jì)數(shù)
  37.         for(i=0;i<TASK_NUM;i++)                //逐個(gè)任務(wù)處理
  38.         {
  39.                 if(TaskComps[i].Run)        //如果運(yùn)行標(biāo)志位不為0
  40.                 {
  41.                         TaskComps[i].TaskHook();        //運(yùn)行任務(wù)
  42.                         TaskComps[i].Run = 0;                //清除標(biāo)志位
  43.                 }
  44.         }
  45. }
  46. /*
  47. 函數(shù)名稱:
  48. 函數(shù)功能:
  49. 輸入?yún)?shù):
  50. 輸出參數(shù):
  51. 備 注  :
  52. */

復(fù)制代碼
51hei附件下載,僅供參考:
51hei.png

程序設(shè)計(jì).7z

6.78 MB, 下載次數(shù): 30, 下載積分: 黑幣 -5

程序

硬件設(shè)計(jì).rar

4.06 MB, 下載次數(shù): 27, 下載積分: 黑幣 -5

硬件

文檔 僅供參靠.7z

7.1 MB, 下載次數(shù): 21, 下載積分: 黑幣 -5

文件

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表