你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于stm32 FreeRtos的智能台灯控制

[复制链接]
STMCU小助手 发布时间:2022-12-7 16:03
FreeRtos的引入
FreeRTOS是一个操作系统内核,提供操作系统最重要的特性:任务调度操作系统允许多个任务同时运行,这个叫做多任务。实际上,一个处理器核心在某一时刻只能运行一个任务。 操作系统中任务调度器的责任就是决定在某一时刻究竟运行哪个任务, 任务调度在各个任务之间的切换非常快!
像 FreeRTOS 这种传统的 RTOS 类操作系统是由用户给每个任务分配一个任务优先级, 任务调度器就可以根据此优先级来决定下一刻应该运行哪个任务

单片机引入RTOS,可以将各个功能模块分别设计为单独的任务,每个任务都是一个死循环,就好比有多个人在同时干活,这样CPU的利用率就提高了,并且可以处理一些并行逻辑。
单片机只有一个CPU(核),那怎么让多个人同时干活呢?其实每个子任务虽然都是死循环,但并不是每个子任务一直都在执行,每个子任务在执行期间,可能需要延时,也可能需要等另一个任务的数据到来,所有,在某个任务在等待的时候,CPU就可以停止此任务,然后切换到其它任务执行,这样看起来就是多个人在同时干活了

db5c1cb268b94d57aaa705f72b76ba20.png

想了解更多FreeRtos的知识需要的小伙伴可以去我专栏里面看哦,有基础实验测试,自己可以试试从移值开始,这个工程的话都是移值好了FreeRtos 直接用就行了。

一、题目说明


3ee95b3d09b849d2b6a7764bb291dc1f.jpg

二、功能说明

使用说明:
1.按键模式 也是上电默认的功能 在该功能下
PB6 直接用来控制灯的亮灭 第一次按下开灯 再次按下关灯
PB7 PB8 用来进行灯的亮度等级调节 一个变亮 一个变暗
PB9 按下后为定时模式 默认为定时5s时间到后会关闭灯光 并通过蜂鸣器进行5次提示
在定时模式的时候 PB6 PB7则为进行时间的调节  按键模式下为亮度的调节(PB6 PB7为两种功能的控制)

2、光敏模式:在该模式下灯光可以跟随环境的变化而自动调节

3、红外模式: 通过检测距离来进行灯光的控制

4、定时模式:到一定时间后自动关闭灯光 并以蜂鸣器实行进行提示
5、实时检测当前电压
6、超时波测距模式:也是通过距离的检测来控制灯光(该功能屏蔽了)
注意:按键是没有模式切换的只有按键 和定时可以控制所有进行其他模式切换时是以蓝牙控制
通过手机来控制的,语音同样可以进行模式切换和亮度控制

简单的焊接了一个方便调试

4b9dc044c9a843f3bbf7ce224ba9ad97.png

由于在进行OLED显示时刷新有点问题,所以将各模式下数据通过蓝牙发送到手机上了,以两种形式进行显示,实时电压值在手机上会一直打印 ,其他显示只有在进行相应功能切换时才打印

c63d467d05f94e86a073f1eb4afd1cf9.jpg

三、硬件部分

ON0U48XNGQKMA42I{]~@(E1.png

1.stm32f103c8t6

668308c112b246259e32bd62dcdbfba4.png

2.oled显示屏

6e3ca64307344ec786abf9e752ad228e.jpg

3.su-03t语音模块

7b8e8569348f491fa2bcef5e79a093bb.png

4.红外模块

f16afa62900d4f028a8e6b0ed5d8f59d.jpg

5.超声波模块

80258b5e830f4c5194ffea79f31744b6.png

6.光敏模块

b6e2d067b95c40e4a18f524d37f89030.png

7.蓝牙模块

5554d64a98994fa2b5fea2cbe0d735c9.png

8.蜂鸣器

d93dbbd18696412e87ae7850ae4ef68e.png

四、硬件接线

1.PB6 PB7 PB8 PB9 接四个按键
2.oled PB13--CLK  PB14--DIN
3.光敏 A0---PA4
4.LED -- PB5
5.超声波 Trig--PB10  ECHO--PB11
6.蜂鸣器 -- PC14
7.红外模块--PB4
8.电压 ---PA5
9.蓝牙-- TX-PA3 RX--PA2  
10.语音 TX-PA10 RX--PA9

五、软件部分

下面代码为主函数内容

  1. /*=============================基于FreeRtos的智能台灯======================

  2. @Author;小殷童鞋
  3. @Date:2022-11-25

  4. ===========================================================================*/

  5. /**********************************引脚接线**********************************
  6. 按键 PB6 PB7 PB8 PB9
  7. OLED GND VCC  PB13-CLK PB14-DIN
  8. 光敏 PA4
  9. LED PB5
  10. 超声波 gnd vcc  Trig--PB10 Echo--PB11
  11. 蜂鸣器  PC14
  12. 蓝牙  TX--PA3(PA10)   RX--PA2(PA9)  
  13. 红外模块 PB4
  14. 电压  一端接PA5  一端接电源正极
  15. ******************************************************************************/


  16. /*=====================================功能说明=================================
  17. 1.默认界面显示按键模式  PB6 直接开关灯  PB7 PB8进行亮度调高调低  PB9为定时模式
  18. 按下PB9后 PB7 PB8的功能变为进行时间的加减  (这里PB7 PB8按键有两种功能)
  19. 2.光敏模式  界面只显示光敏界面
  20. 3.定时模式  显示时间 到时自动熄灭
  21. 4.红外距模式  
  22. 5.实时电压显示
  23. 注意:蓝牙和语音与其他模式互不影响
  24. ================================================================================*/

  25. #include "sys.h"
  26. #include "delay.h"
  27. #include "usart.h"
  28. #include "led.h"
  29. #include "FreeRTOS.h"
  30. #include "task.h"
  31. #include "key.h"
  32. #include "semphr.h"
  33. #include "string.h"
  34. #include "HC_SR04.h"
  35. #include "beep.h"
  36. #include "timer.h"
  37. #include "ldr.h"
  38. #include "infrared.h"
  39. #include "oled.h"
  40. #include "adc1.h"



  41. /*================单独功能调试时只改变下面宏开关的值即可代码不动==================*/
  42. //开关宏定义   1打开  0关闭

  43. #define   USART_START           1
  44. #define   CLOCK_START           1
  45. #define   CSB_START             0           //超声波检测时有问题 暂时没用
  46. #define   LDR_START             1
  47. #define   KEY_START             1
  48. #define   INFRARED_START        1
  49. #define   INTERFACE_START       1

  50. /*=================================任务宏定义====================================*/

  51. //任务优先级
  52. #define START_TASK_PRIO                1
  53. //任务堆栈大小        
  54. #define START_STK_SIZE                 512  
  55. //任务句柄
  56. TaskHandle_t StartTask_Handler;
  57. //任务函数
  58. void start_task(void *pvParameters);


  59. //按键任务
  60. //任务优先级
  61. #define BUTTON_TASK_PRIO                5
  62. //任务堆栈大小        
  63. #define BUTTON_STK_SIZE                 128  
  64. //任务句柄
  65. TaskHandle_t BUTTONTask_Handler;
  66. //任务函数
  67. void button_task(void *pvParameters);





  68. //超声波任务
  69. //任务优先级
  70. #define CSB_TASK_PRIO                5
  71. //任务堆栈大小        
  72. #define CSB_STK_SIZE                 100  
  73. //任务句柄
  74. TaskHandle_t CSBTask_Handler;
  75. //任务函数
  76. void csb_task(void *pvParameters);




  77. //串口数据处理任务
  78. //任务优先级
  79. #define USART_TASK_PRIO                6
  80. //任务堆栈大小        
  81. #define USART_STK_SIZE                 128  
  82. //任务句柄
  83. TaskHandle_t USARTTask_Handler;
  84. //任务函数
  85. void usart_task(void *pvParameters);



  86. //定时任务
  87. //任务优先级
  88. #define CLOCK_TASK_PRIO                4
  89. //任务堆栈大小        
  90. #define  CLOCK_STK_SIZE                 50  
  91. //任务句柄
  92. TaskHandle_t  CLOCKTask_Handler;
  93. //任务函数
  94. void clock_task(void *pvParameters);



  95. //光敏任务
  96. //任务优先级
  97. #define LDR_TASK_PRIO                2
  98. //任务堆栈大小        
  99. #define  LDR_STK_SIZE                 50  
  100. //任务句柄
  101. TaskHandle_t LDRTask_Handler;
  102. //任务函数
  103. void ldr_task(void *pvParameters);




  104. //红外任务
  105. //任务优先级
  106. #define INFARED_TASK_PRIO                4
  107. //任务堆栈大小        
  108. #define  INFARED_STK_SIZE                 50  
  109. //任务句柄
  110. TaskHandle_t INFAREDTask_Handler;
  111. //任务函数
  112. void  infrared_task(void *pvParameters);



  113. //界面显示任务
  114. //任务优先级
  115. #define INTERFACE_TASK_PRIO                3
  116. //任务堆栈大小        
  117. #define  INTERFACE_STK_SIZE                 50  
  118. //任务句柄
  119. TaskHandle_t INTERFACETask_Handler;
  120. //任务函数
  121. void  interface_task(void *pvParameters);






  122. //========================================变量定义================================*/

  123. #define Dis      50                    //实时距离小于DIS的时候灯打开
  124. #define Set_Dis  20                    //距离预设  可根据实际情况进行修改
  125. unsigned char Usart1_cmd = 0;           //用来接收蓝牙和语音的指令
  126. unsigned int current_duty = 0;        //当前占空比 默认关闭
  127. unsigned char clock_start = 0;            //功能模式
  128. unsigned char sec;                      //秒
  129. unsigned char min;                      //分
  130. unsigned char hour;                     //时
  131. unsigned int count,clock_flag = 0;      //计数变量   时间到标志
  132. unsigned int set_time = 5;              //默认为5s
  133. unsigned char time[6];                  //存储时间转换后的值
  134. unsigned char adcx; //光敏值 0-100
  135. unsigned char work_mode = 1,send_flag = 1; //模式变量  发送到蓝牙的标志
  136. float voltage = 0.0;                     //电压
  137. char str[24];                           //存储信息字符串的形式显示
  138. void Buzzer_Voice(void);                //蜂鸣器提示声音
  139. void Init_interface(void);              //初始化界面
  140. void Time_Display(void);                 //定时显示界面
  141. void KEY_Display(void);                  //按键显示界面
  142. void Infrared_Display(void);             //红外显示界面
  143. void LDR_Display(void);                  //光敏界面
  144. void VoltageDisplay(void);               //电压显示


  145. /*==================================功能界面显示函数===============================*/
  146. //初始化界面
  147. void Init_interface(void)
  148. {
  149.                 OLED_ShowCHinese(6,0,0);//智
  150.                 OLED_ShowCHinese(26,0,1);//能
  151.                 OLED_ShowCHinese(46,0,2);//台
  152.                 OLED_ShowCHinese(66,0,3);//灯
  153.                 OLED_ShowCHinese(86,0,4);//系
  154.                 OLED_ShowCHinese(106,0,5);//统         
  155.                 OLED_ShowNum(6,4,2022,4,16);
  156.                 OLED_ShowCHinese_TWO(40,4,0);//年
  157.                 OLED_ShowNum(60,4,11,2,16);
  158.                 OLED_ShowCHinese_TWO(74,4,1);//月
  159.                 OLED_ShowNum(92,4,17,2,16);
  160.                 OLED_ShowCHinese_TWO(108,4,2);//日
  161. }

  162. //定时模式显示定时的时间
  163. void Time_Display(void)
  164. {

  165.          OLED_ShowCHinese(26,0,12);//定
  166.          OLED_ShowCHinese(46,0,13);//时
  167.          OLED_ShowCHinese(66,0,14);//模
  168.          OLED_ShowCHinese(86,0,15);//式
  169.          OLED_ShowNum(30,3,time[0],2,4);
  170.          OLED_ShowNum(38,3,time[1],2,4);
  171.          OLED_ShowChar(46,3,':',4);
  172.          OLED_ShowNum(52,3,time[2],2,4);
  173.          OLED_ShowNum(60,3,time[3],2,4);
  174.          OLED_ShowChar(68,3,':',4);
  175.          OLED_ShowNum(74,3,time[4],2,4);
  176.          OLED_ShowNum(82,3,time[5],2,4);        
  177.    //电压显示
  178.          OLED_ShowString(10,6,(unsigned char *)str,8);
  179. }

  180. //按键模式
  181. void KEY_Display(void)
  182. {
  183.          OLED_ShowCHinese(26,3,10);//按
  184.          OLED_ShowCHinese(46,3,11);//键
  185.          OLED_ShowCHinese(66,3,14);//模
  186.          OLED_ShowCHinese(86,3,15);//式
  187.           //电压显示
  188.          OLED_ShowString(10,6,(unsigned char *)str,8);
  189. }

  190. //光敏模式模式
  191. void LDR_Display(void)
  192. {
  193.          OLED_ShowCHinese(26,3,6);//光
  194.          OLED_ShowCHinese(46,3,7);//敏
  195.          OLED_ShowCHinese(66,3,14);//模
  196.          OLED_ShowCHinese(86,3,15);//式
  197.           //电压显示
  198.          OLED_ShowString(10,6,(unsigned char *)str,8);
  199. }

  200. //红外模式
  201. void Infrared_Display(void)
  202. {
  203.          OLED_ShowCHinese(26,3,8);//红
  204.          OLED_ShowCHinese(46,3,9);//外
  205.          OLED_ShowCHinese(66,3,14);//模
  206.          OLED_ShowCHinese(86,3,15);//式
  207.           //电压显示
  208.          OLED_ShowString(10,6,(unsigned char *)str,8);
  209. }


  210. //电压显示
  211. void VoltageDisplay(void)
  212. {
  213. //         OLED_ShowCHinese(26,5,20);//当
  214. //         OLED_ShowCHinese(46,5,21);//前
  215. //         OLED_ShowCHinese(66,5,22);//电
  216. //         OLED_ShowCHinese(86,5,23);//压
  217.           OLED_ShowString(10,6,(unsigned char *)str,8);
  218. }



  219. /*=====================================主函数及功能函数================================*/

  220. int main(void)
  221. {
  222.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4         
  223.         
  224.         delay_init();                                                  //延时函数初始化         
  225.         Init_Usart();                                                 //初始化串口
  226.         LED_Init();                                                               //初始化LED
  227.         KEY_GPIO_INIT();               //按键初始化
  228.         HC_SR04_init();                //超声波初始化
  229.         init_timer4_exti();            //定时器中断
  230.         Buzzer_GPIO_Init();            //蜂鸣器初始化
  231.         Lsens_Init();                  //光敏初始化
  232.         Infrared_Init();               //红外初始化
  233.         Power_init();                  //ADC1初始化  测电压
  234.         OLED_Init();                                     //初始化OLED  
  235.         OLED_Clear(0);        
  236.         TIM3_PWM_Init(100-1,7200-1);        //pwm控制初始化 1hkz  计数到100为10ms         
  237.         Init_interface();                                                  //初始化界面只显示一次
  238.         delay_ms(1000);        

  239.         //printf("----------------测试---------------\r\n");
  240.          
  241.         //创建开始任务
  242.     xTaskCreate((TaskFunction_t )start_task,            //任务函数
  243.                 (const char*    )"start_task",          //任务名称
  244.                 (uint16_t       )START_STK_SIZE,        //任务堆栈大小
  245.                 (void*          )NULL,                  //传递给任务函数的参数
  246.                 (UBaseType_t    )START_TASK_PRIO,       //任务优先级
  247.                 (TaskHandle_t*  )&StartTask_Handler);   //任务句柄              
  248.     vTaskStartScheduler();          //开启任务调度
  249. }

  250. //开始任务任务函数
  251. void start_task(void *pvParameters)
  252. {
  253.     taskENTER_CRITICAL();           //进入临界区
  254.         

  255. #if KEY_START
  256.     //创建按键任务
  257.     xTaskCreate((TaskFunction_t )button_task,            
  258.                 (const char*    )"button_task",           
  259.                 (uint16_t       )BUTTON_STK_SIZE,
  260.                 (void*          )NULL,                                
  261.                 (UBaseType_t    )BUTTON_TASK_PRIO,        
  262.                 (TaskHandle_t*  )&BUTTONTask_Handler);     
  263. #endif
  264.         
  265. #if CSB_START
  266.         
  267.                 //创建超声波任务
  268.                 xTaskCreate((TaskFunction_t )csb_task,     
  269.                 (const char*    )"csb_task",   
  270.                 (uint16_t       )CSB_STK_SIZE,
  271.                 (void*          )NULL,
  272.                 (UBaseType_t    )CSB_TASK_PRIO,
  273.                 (TaskHandle_t*  )&CSBTask_Handler);   
  274. #endif



  275. #if USART_START
  276.                                                                
  277.                         //创建串口处理任务
  278.                 xTaskCreate((TaskFunction_t )usart_task,     
  279.                 (const char*    )"usart_task",   
  280.                 (uint16_t       )USART_STK_SIZE,
  281.                 (void*          )NULL,
  282.                 (UBaseType_t    )USART_TASK_PRIO,
  283.                 (TaskHandle_t*  )&USARTTask_Handler);  
  284. #endif
  285.                                                                
  286. #if CLOCK_START                                                        
  287.                 //创建定时处理任务
  288.                 xTaskCreate((TaskFunction_t )clock_task,     
  289.                 (const char*    )"clock_task",   
  290.                 (uint16_t       )CLOCK_STK_SIZE,
  291.                 (void*          )NULL,
  292.                 (UBaseType_t    )CLOCK_TASK_PRIO,
  293.                 (TaskHandle_t*  )&CLOCKTask_Handler);  
  294. #endif

  295. #if LDR_START                                                                 
  296.                                 //创建光敏处理任务
  297.                 xTaskCreate((TaskFunction_t )ldr_task,     
  298.                 (const char*    )"ldr_task",   
  299.                 (uint16_t       )LDR_STK_SIZE,
  300.                 (void*          )NULL,
  301.                 (UBaseType_t    )LDR_TASK_PRIO,
  302.                 (TaskHandle_t*  )&LDRTask_Handler);  
  303. #endif


  304. #if INFRARED_START                                                                 
  305.                                 //创建光敏处理任务
  306.                 xTaskCreate((TaskFunction_t )infrared_task,     
  307.                 (const char*    )"infrared_task",   
  308.                 (uint16_t       )INFARED_STK_SIZE,
  309.                 (void*          )NULL,
  310.                 (UBaseType_t    )INFARED_TASK_PRIO,
  311.                 (TaskHandle_t*  )&INFAREDTask_Handler);  
  312. #endif


  313. #if INTERFACE_START                                                                 
  314.                                 //创建界面现实处理任务
  315.                 xTaskCreate((TaskFunction_t )interface_task,     
  316.                 (const char*    )"interface_task",   
  317.                 (uint16_t       )INTERFACE_STK_SIZE,
  318.                 (void*          )NULL,
  319.                 (UBaseType_t    )INTERFACE_TASK_PRIO,
  320.                 (TaskHandle_t*  )&INTERFACETask_Handler);  
  321. #endif

  322.     vTaskDelete(StartTask_Handler); //删除开始任务
  323.     taskEXIT_CRITICAL();            //退出临界区
  324. }



  325. //按键声响声音  m每次按下按键会有一声按键声响
  326. void Buzzer_Voice(void)
  327. {
  328.                   Buzzer_ON();
  329.                         delay_ms(200);
  330.                   Buzzer_OFF();                        
  331.             delay_ms(200);
  332. }


  333. #if KEY_START
  334. //按键任务函数
  335. void button_task(void *pvParameters)
  336. {
  337.         u8 key = 0;
  338.         static u8 flag = 0;
  339.         while(1)
  340.     {
  341.                         if(work_mode == 1)
  342.                         {
  343.                                  //需要进行调试的时候可将其打开串口观察是否运行
  344.                         //        printf("==================按键模式==================\r\n");
  345.                                 key = KEY_Scan();
  346.                                 //进行定时模式
  347.                                 if(key == KEY0_Value)  //PB9  KEY0_Value
  348.                                 {
  349.                                                 Buzzer_Voice();            //按键提示音
  350.                                                 clock_start = 1;// 开始计时
  351.                                                 hour = 0,min = 0,sec = 0;  //每次都从0开始
  352.                                                 
  353.                                 }
  354.                                 
  355.                                 //clock_start 为0 时表示进行灯光占空比的控制 为1时为时间的控制
  356.                                 if(clock_start == 0)
  357.                                 {
  358.                                                 //亮度调高
  359.                                          if(key == KEY1_Value)
  360.                                                 {
  361.                                                          Buzzer_Voice();            //按键提示音
  362.                                                         //调整亮度 变量
  363.                                                         current_duty += 20;                     //可根据实际效果进行修改
  364.                                                         printf("current_duty = %d\r\n",current_duty);
  365.                                                         //printf("this is key1 = %d\r\n",key);  //需要进行按键检测调试时可将其打开                                       
  366.                                                 }               
  367.                                                 //亮度调低
  368.                                                 else if(key == KEY2_Value)
  369.                                                 {
  370.                                                         Buzzer_Voice();            //按键提示音
  371.                                                         //调整亮度  变暗
  372.                                                         current_duty -= 20;
  373.                                                         printf("current_duty = %d\r\n",current_duty);
  374.                                                         //printf("this is key2 = %d\r\n",key);  //需要进行按键检测调试时可将其打开
  375.                                                         
  376.                                                 }               
  377.                                         }
  378.                                 
  379.                                 
  380.                                 else if(clock_start == 1)
  381.                                 {
  382.                                         if(key == KEY1_Value)
  383.                                                 {
  384.                                                          Buzzer_Voice();            //按键提示音
  385.                                                         //调整时间  ++
  386.                                                         set_time += 5;                     //可根据实际效果进行修改
  387.                                                         //printf("this is key1 = %d\r\n",key);  //需要进行按键检测调试时可将其打开                                       
  388.                                                 }               
  389.                                                 //亮度调低
  390.                                                 else if(key == KEY2_Value)
  391.                                                 {
  392.                                                         Buzzer_Voice();            //按键提示音
  393.                                                         //时间 --
  394.                                                         set_time -= 5;
  395.                                                         //printf("this is key2 = %d\r\n",key);  //需要进行按键检测调试时可将其打开
  396.                                                 }               
  397.                                 }
  398.                         
  399.                                        
  400.                                        
  401.                                                 //直接控制LED的亮灭 第一次按下亮 再次按下熄灭
  402.                                          if(key == KEY3_Value)
  403.                                                 {
  404.                                                         Buzzer_Voice();            //按键提示音
  405.                                                         if(flag == 0)
  406.                                                         {
  407.                                                                 flag = 1;
  408.                                                                 current_duty = 100;   //占空比最大亮
  409.                                                         }
  410.                                                         else if(flag == 1)
  411.                                                         {
  412.                                                                  flag = 0;
  413.                                                                  current_duty = 0;    //占空比最小 熄灭
  414.                                                         }
  415.                                                         printf("current_duty = %d\r\n",current_duty);
  416.                                                         //printf("this is key2 = %d\r\n",key);  //需要进行按键检测调试时可将其打开                                
  417.                                                 }
  418.                                         }
  419.                                        
  420.       vTaskDelay(120);
  421.     }
  422. }   
  423. #endif


  424. #if LDR_START         
  425. //光敏任务函数
  426. void ldr_task(void *pvParameters)
  427. {
  428.                 while(1)
  429.                 {
  430.                         if(work_mode ==2)
  431.                         {
  432.                                  //需要进行调试的时候可将其打开串口观察是否运行
  433.                                 //printf("==================光敏模式==================\r\n");
  434.                                 adcx = Lsens_Get_Val();
  435.                                 //根据光敏强度自动调节灯光的亮度  这里分为5个等级
  436.                                 if(adcx > 0  && adcx < 20 )
  437.                                 {
  438.                                         current_duty = 100;
  439.                                        
  440.                                 }
  441.                                 else if(adcx >= 20 && adcx < 40)
  442.                                 {
  443.                                         current_duty = 80;
  444.                                 }
  445.                                 else if(adcx >= 40 && adcx < 60)
  446.                                 {
  447.                                         current_duty = 60;
  448.                                 }
  449.                                 else if(adcx >= 60 && adcx < 80)
  450.                                 {
  451.                                         current_duty = 40;
  452.                                 }
  453.                                 else if(adcx >= 80 && adcx < 100)
  454.                                 {
  455.                                         current_duty = 20;
  456.                                 }
  457.                                 TIM_SetCompare2(TIM3,current_duty);
  458.                                 printf("adcx = %d\r\n",adcx);
  459.                         }
  460.                          vTaskDelay(40);
  461.                 }
  462. }
  463. #endif



  464. #if CSB_START
  465. //超声波任务函数
  466. void csb_task(void *pvParameters)
  467. {
  468.         float distance = 0;
  469.         unsigned char i = 0;
  470.         while(1)
  471.     {
  472.                                 if(work_mode == 5)
  473.                                 {
  474.                                  distance = Get_HS_Length_Value();
  475.                                  if(distance < Set_Dis)   //SSet_Dis 宏定义可自己更改数值
  476.                                  {
  477.                                          for(i = 0;i<5;i++)
  478.                                          {
  479.                                                  Buzzer_Voice();       //报警声响
  480.                                          }               
  481.                                  }
  482.                                  
  483.                                  //处于开灯的范围
  484.                                  if(distance < Dis)
  485.                                  {
  486.                                          current_duty = 100;
  487.                                         }
  488.                                   printf("distance = %.2f\r\n",distance);  //进行串口调试的时候将其打开
  489.                                 }
  490.                                 vTaskDelay(80);
  491.     }
  492. }   
  493. #endif


  494. #if USART_START

  495. //串口功能接收函数

  496. //注意下面 cmd_temp 后面的十六进制可根据自己的指令来更改

  497. void usart_task(void *pvParameters)
  498. {
  499.          unsigned char cmd_temp = 0;
  500.                 while(1)
  501.                 {
  502.                         //后面的命令有根据自己来进行调节最后写十六进制
  503.                         cmd_temp = Usart1_cmd;
  504.                         Usart1_cmd = 0;   //清除
  505.                
  506.                         if(cmd_temp == 0x01)   //板载LED PC13
  507.                         {
  508.                                 LED = 0;             //PC13 打开
  509.                         }
  510.                         else if(cmd_temp == 0x02)
  511.                         {
  512.                                 LED = 1;             //PC13 关闭
  513.                                 
  514.                         }               
  515.                         
  516.                         /*==========================下面指令是控制我们用的LED (PWM控制)===========================*/
  517.                         else if(cmd_temp == 0x03)     //直接打开 最亮 占空比百分百
  518.                         {
  519.                                  current_duty = 100;
  520.                         }
  521.                         else if(cmd_temp == 0x04)     //直接关闭 最暗  占空比最小 0
  522.                         {
  523.                                  current_duty = 0;
  524.                         }
  525.                         else if(cmd_temp == 0x05)    //占空比控制 加加
  526.                         {
  527.                                  current_duty += 20;       //这里的数字可根据实际效果写大或者写小
  528.                         }
  529.                         else if(cmd_temp == 0x06)     //占空比控制 --
  530.                         {
  531.                                 current_duty -= 20;        //这里的数字可根据实际效果写大或者写小
  532.                         }
  533.                         
  534.                         
  535.                         //==========================模式切换命令============================
  536.                         else if(cmd_temp == 0xea)
  537.                         {
  538.                                  work_mode = 1;   //按键模式               
  539.                                  send_flag = 1;
  540.                         }
  541.                         else if(cmd_temp == 0xeb)
  542.                         {                        
  543.                                 work_mode = 2;   //光敏模式
  544.                                 send_flag = 2;
  545.                         }
  546.                         //在时间设置模式下才能进行时间的修改
  547.                         else if(cmd_temp == 0xec)
  548.                         {
  549.                                 work_mode = 3;
  550.                                 send_flag = 3;
  551.                                 clock_start = 1;// 开始计时
  552.                                 hour = 0,min = 0,sec = 0;  //每次都从0开始
  553.                                 //时间增加 每次加5s  可自己修改数值
  554.                         }
  555.                         //红外
  556.                         else if(cmd_temp == 0xed)
  557.                         {
  558.          work_mode = 4;
  559.                                  send_flag = 4;
  560.                                 
  561.                         }
  562.                         //超声波
  563.                         else if(cmd_temp == 0xff)
  564.                         {
  565.          work_mode = 5;
  566.                                  send_flag = 5;
  567.                                 
  568.                         }

  569.                         else if(cmd_temp == 0x07)     
  570.                         {
  571.                                  set_time += 5;
  572.                                 //        printf("set_time = %d\r\n",set_time);
  573.                         }
  574.                                 
  575.                         //时间--每次-5s  可自己修改数值
  576.                         else if(cmd_temp == 0x08)  
  577.                         {
  578.                                 set_time -= 5;
  579.                         //        printf("set_time = %d\r\n",set_time);
  580.                         }
  581.                         TIM_SetCompare2(TIM3,current_duty);
  582.                         printf("current_duty = %d\r\n",current_duty);
  583.                         vTaskDelay(120);
  584.         }
  585. }
  586. #endif

  587. #if CLOCK_START
  588. //定时任务函数
  589. void clock_task(void *pvParameters)
  590. {
  591.         unsigned char i = 0;
  592.         while(1)
  593.         {
  594.         
  595.                         //定时时间到了 灯自动熄灭 蜂鸣器给个提示音
  596.                         if(clock_flag == 1)
  597.                         {
  598.                                          //需要进行调试的时候可将其打开串口观察是否运行
  599.                                         //printf("==================定时模式==================\r\n");
  600.                                         printf("==============时间到了==============\r\n");
  601.                                   USART_Send_String(USART2,"time over");
  602.                                   clock_flag = 0;   //重新置0  等待下一次
  603.                                         current_duty = 0;
  604.                                         for(i = 0;i< 5;i++)
  605.                                         {
  606.                                                 Buzzer_Voice();
  607.                                         }
  608.                                        
  609.                         }
  610.                          vTaskDelay(50);
  611.     }
  612. }   

  613. #endif


  614. #if INFRARED_START
  615. //红外人体感应功能测试
  616. //感应到人体输出高电平,离开感应区域输出低电平
  617. void infrared_task(void *pvParameters)
  618. {
  619.         
  620.         while(1)
  621.         {
  622.                         //定时时间到了 灯自动熄灭 蜂鸣器给个提示音
  623.                         if(work_mode == 4)
  624.                         {
  625.                                  //需要进行调试的时候可将其打开串口观察是否运行
  626.                                 //printf("==================红外模式==================\r\n");
  627.                                 if(Read_STATE() == RESET)  //检测到人了 开灯
  628.                                 {
  629.                                         current_duty = 100;
  630.                                 }
  631.                                 else
  632.                                 {
  633.                                         current_duty = 0;
  634.                                 }
  635.                                 
  636.                         }
  637.                         TIM_SetCompare2(TIM3,current_duty);        
  638.                          vTaskDelay(50);
  639.     }
  640. }

  641. #endif


  642. #if INTERFACE_START


  643. //下面发送到蓝牙放的数据可根据自己需求 也可以屏蔽掉
  644. void interface_task(void *pvParameters)
  645. {
  646.         static unsigned char temp_mode = 1;
  647.         while(1)
  648.         {
  649.                         if(temp_mode != work_mode)
  650.                         {
  651.                                 OLED_Clear(0);
  652.                                 temp_mode = work_mode;
  653.                         }
  654.                         if(work_mode == 1)
  655.                         {
  656.                                 //按键模式
  657.                                 KEY_Display();
  658.                                 if(send_flag ==1)
  659.                                 {
  660.                                         send_flag = 0;
  661.                                   USART_Send_String(USART2,"========按键模式=======\r\n");
  662.                                 }
  663.                         }
  664.                         else if(work_mode == 2)
  665.                         {
  666.                                  //光敏模式
  667.                                  LDR_Display();
  668.                                 if(send_flag == 2)
  669.                                 {
  670.                                         send_flag = 0;
  671.                                         USART_Send_String(USART2,"========光敏模式=======\r\n");
  672.                                 }
  673.                         }
  674.                         else if(work_mode == 3)
  675.                         {
  676.                                 //定时模式
  677.                                 Time_Display();
  678.                                 if(send_flag == 3)
  679.                                 {
  680.                                         send_flag = 0;
  681.                                   USART_Send_String(USART2,"========定时模式=======\r\n");
  682.                                 }
  683.                         }
  684.                         else if(work_mode == 4)
  685.                         {
  686.                                 //红外模式
  687.                                 Infrared_Display();
  688.                                 if(send_flag == 4)
  689.                                 {
  690.                                         send_flag = 0;
  691.                                         USART_Send_String(USART2,"========红外模式=======\r\n");
  692.                                 }               
  693.                         }        
  694.                          vTaskDelay(200);
  695.     }
  696. }

  697. #endif

  698. /*-------------------------------串口中断服务函数-------------------------*/
  699. //串口1接收  PA9 PA10   语音模块
  700. void USART1_IRQHandler(void)
  701. {
  702.         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断
  703.         {
  704.                 Usart1_cmd = USART_ReceiveData(USART1);
  705.                 USART_SendData(USART1,Usart1_cmd);
  706.                 USART_ClearFlag(USART1, USART_FLAG_RXNE);
  707.         }
  708. }


  709. //l蓝牙 RX-  PA2  TX-PA3
  710. void USART2_IRQHandler(void)
  711. {
  712.     if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET)
  713.     {
  714.        Usart1_cmd = USART_ReceiveData(USART2);                                
  715.                          USART_ClearFlag(USART2, USART_FLAG_RXNE);
  716.     }
  717. }





  718. void TIM3_IRQHandler(void)   //TIM3中断
  719. {
  720.         static unsigned int volt_t = 0;          //控制电压检测时间 2s检测一下电压
  721.         char str_t[24];                          //发送时间到蓝牙
  722.         if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
  723.                 {
  724.                                 TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志  //10ms
  725.                                 volt_t++;
  726.                         if(volt_t == 200)
  727.                         {
  728.                                 volt_t = 0;   //计数清零
  729.                                 voltage = Power_Get_VBAT();
  730.                                 sprintf(str,"volt:%.2f\r\n",voltage);
  731.                                 USART_Send_String(USART2,str);
  732.                                 //printf("voltage = %.2f\r\n",voltage);  //需要用串口进行观察时将其打开
  733.                         }
  734.                           if(clock_start == 1)  //定时模式 开始进行计时
  735.                                 {
  736.                                         count++;
  737.                                         if(count == 100)
  738.                                         {
  739.                                                 count = 0;
  740.                                        
  741.                                                 sec++;
  742.                                                 if(sec == 60)
  743.                                                 {
  744.                                                         sec = 0;
  745.                                                         min++;
  746.                                                         if(min== 60)
  747.                                                         {
  748.                                                                 min = 0;
  749.                                                                 hour++;
  750.                                                                 if(hour == 24)
  751.                                                                 {
  752.                                                                         hour = 0;
  753.                                                                 }
  754.                                                         }
  755.                                                 }
  756.                                         sprintf(str_t,"%02d:%02d:%02d\r\n",hour,min,sec);
  757.                                         USART_Send_String(USART2,str_t);
  758.                                         //        printf("%2d:%2d:%2d\r\n",hour,min,sec);
  759.                                         }
  760.                                         time[0] = hour/10; //获取小时的十位
  761.                                         time[1] = hour%10;//获取小时的个位
  762.                                         time[2] = min/10; //获取分钟的十位
  763.                                         time[3] = min%10;//获取分钟的个位
  764.                                         time[4] = sec/10; //获取秒的十位
  765.                                         time[5] = sec%10; //获取秒的个位
  766.                                         if(hour *24 + min *60 + sec == set_time)   //计时时间与我们设定的时间相等
  767.                                         {
  768.                                                  clock_flag = 1;           //标志置1
  769.                                                   clock_start = 0;          //停止计时                                
  770.                                         }        
  771.                                        
  772.                                 }
  773.                         }
  774. }
复制代码


————————————————
版权声明:@slow-walker

收藏 评论0 发布时间:2022-12-7 16:03

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版