当前位置:   article > 正文

2024年蓝桥杯物联网省赛

2024年蓝桥杯物联网省赛

                                   #记录第四次蓝桥杯#

一、题目介绍

二、题目分析

2.1外设分析

        通过对题目解读,一共会用到如下外设和资源:GPIO、OLED、LED、Lora模块、矩阵按键、电位器、继电器等。

        软件层面需要使用到:定时器、中断、ADC

        通信协议:IIC(OLED控制)、SPI(Lora通信)

2.2思路

        我个人看到题目之后,是先从NODE.B开始编写的,除了Lora通信控制的部分,我是先写完NODE.B,再去写NODE.A的。先完成两个模块的一些基本功能(比如OLED显示、继电器控制、AD采集、按键等),最后再实现两边的通信。

三、CUBEMX配置

3.1控制器(NODE.A)

3.1.1引脚图

3.1.2时钟树

3.1.3定时器配置

3.1.4IIC配置

3.1.5 SPI配置

3.1.6 中断配置

定时器和外部中断设置好后,一定要记得使能(enable)

3.1.7GPIO配置

3.2采集器(NODE.B)

3.1.1引脚图

3.1.2ADC设置

ADC使用的是通道8和通道9

其余的配置同NODE.A一致,除了GPIO由于多了几个引脚可能配置不一样。

CUBEMX可能有些地方配置有些多余,这里仅供参考。

四、部分代码

这里只展示主函数部分,详细请看压缩包

4.1NODE.A

  1. /* USER CODE END Header */
  2. /* Includes ------------------------------------------------------------------*/
  3. #include "main.h"
  4. #include "i2c.h"
  5. #include "spi.h"
  6. #include "tim.h"
  7. #include "gpio.h"
  8. /* Private includes ----------------------------------------------------------*/
  9. /* USER CODE BEGIN Includes */
  10. #include "stdio.h"
  11. #include "lora.h"
  12. #include "oled.h"
  13. /* USER CODE END Includes */
  14. /* Private typedef -----------------------------------------------------------*/
  15. /* USER CODE BEGIN PTD */
  16. void key_check(void);
  17. void lora_proc(void);
  18. void oled_proc(void);
  19. uint16_t Scan_Col1(void);
  20. uint16_t Scan_Col2(void);
  21. /* USER CODE END PTD */
  22. /* Private define ------------------------------------------------------------*/
  23. /* USER CODE BEGIN PD */
  24. /* USER CODE END PD */
  25. /* Private macro -------------------------------------------------------------*/
  26. /* USER CODE BEGIN PM */
  27. struct key{
  28. uint8_t B1;
  29. uint8_t B2;
  30. uint8_t B4;
  31. uint8_t B5;
  32. }key1;
  33. struct show{
  34. float CV;
  35. float PV;
  36. uint8_t K1;
  37. uint8_t K2;
  38. uint8_t mode;
  39. }show1;
  40. uint8_t Lora_Txbuff[6];
  41. uint8_t Lora_Rxbuff[7];
  42. uint8_t Strbuff[17];
  43. uint8_t key_value;
  44. uint8_t Tx_flag;
  45. /* USER CODE END PM */
  46. /* Private variables ---------------------------------------------------------*/
  47. /* USER CODE BEGIN PV */
  48. /* USER CODE END PV */
  49. /* Private function prototypes -----------------------------------------------*/
  50. void SystemClock_Config(void);
  51. /* USER CODE BEGIN PFP */
  52. /* USER CODE END PFP */
  53. /* Private user code ---------------------------------------------------------*/
  54. /* USER CODE BEGIN 0 */
  55. /* USER CODE END 0 */
  56. /**
  57. * @brief The application entry point.
  58. * @retval int
  59. */
  60. int main(void)
  61. {
  62. /* USER CODE BEGIN 1 */
  63. /* USER CODE END 1 */
  64. /* MCU Configuration--------------------------------------------------------*/
  65. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  66. HAL_Init();
  67. /* USER CODE BEGIN Init */
  68. /* USER CODE END Init */
  69. /* Configure the system clock */
  70. SystemClock_Config();
  71. /* USER CODE BEGIN SysInit */
  72. /* USER CODE END SysInit */
  73. /* Initialize all configured peripherals */
  74. MX_GPIO_Init();
  75. MX_I2C3_Init();
  76. MX_SPI1_Init();
  77. MX_TIM2_Init();
  78. /* USER CODE BEGIN 2 */
  79. //OLED_Init();
  80. HAL_NVIC_DisableIRQ(TIM2_IRQn);
  81. HAL_TIM_Base_Start_IT(&htim2);
  82. LORA_Init();
  83. Write(ROW1,RESET);
  84. Write(ROW2,RESET);
  85. key_value=0;
  86. /* USER CODE END 2 */
  87. /* Infinite loop */
  88. /* USER CODE BEGIN WHILE */
  89. while (1)
  90. {
  91. lora_proc();
  92. key_check();
  93. oled_proc();
  94. /* USER CODE END WHILE */
  95. /* USER CODE BEGIN 3 */
  96. }
  97. /* USER CODE END 3 */
  98. }
  99. /**
  100. * @brief System Clock Configuration
  101. * @retval None
  102. */
  103. void SystemClock_Config(void)
  104. {
  105. RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  106. RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  107. RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
  108. /** Configure the main internal regulator output voltage
  109. */
  110. __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  111. /** Initializes the RCC Oscillators according to the specified parameters
  112. * in the RCC_OscInitTypeDef structure.
  113. */
  114. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  115. RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  116. RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  117. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  118. RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  119. RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_3;
  120. RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2;
  121. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  122. {
  123. Error_Handler();
  124. }
  125. /** Initializes the CPU, AHB and APB buses clocks
  126. */
  127. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  128. |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  129. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  130. RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  131. RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  132. RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  133. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  134. {
  135. Error_Handler();
  136. }
  137. PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_I2C3;
  138. PeriphClkInit.I2c3ClockSelection = RCC_I2C3CLKSOURCE_PCLK1;
  139. if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  140. {
  141. Error_Handler();
  142. }
  143. }
  144. /* USER CODE BEGIN 4 */
  145. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  146. {
  147. static uint16_t ms=0;
  148. static uint8_t s=0;
  149. if(++ms==999)
  150. {
  151. ms=0;
  152. if(++s==3)
  153. {
  154. s=0;
  155. Write(LD5,SET);
  156. HAL_NVIC_DisableIRQ(TIM2_IRQn);
  157. }
  158. }
  159. }
  160. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  161. {
  162. switch(GPIO_Pin)
  163. {
  164. case GPIO_PIN_1:
  165. key_value=Scan_Col1();
  166. while(Read(COL1)==0);
  167. break;
  168. case GPIO_PIN_0:
  169. key_value=Scan_Col2();
  170. while(Read(COL2)==0);
  171. break;
  172. default:
  173. break;
  174. }
  175. }
  176. void key_check(void)
  177. {
  178. if(key_value != 0)
  179. {
  180. switch(key_value)
  181. {
  182. case 1:
  183. key1.B1=1;
  184. break;
  185. case 2:
  186. key1.B2=1;
  187. static uint8_t oled_flag=1;
  188. if(oled_flag==1)
  189. {
  190. OLED_Init();
  191. oled_flag=0;
  192. }
  193. Write(LD5,RESET);
  194. HAL_NVIC_EnableIRQ(TIM2_IRQn);
  195. break;
  196. case 4:
  197. key1.B4=1;
  198. break;
  199. case 5:
  200. key1.B5=1;
  201. break;
  202. default:
  203. break;
  204. }
  205. Tx_flag=1;
  206. key_value=0;
  207. }
  208. }
  209. uint16_t Scan_Col1(void)
  210. {
  211. static uint16_t ucKey_val=0; //设立变量存键值
  212. HAL_GPIO_WritePin(ROW1,GPIO_PIN_SET);//拉高3列的电平
  213. HAL_GPIO_WritePin(ROW2,GPIO_PIN_SET);
  214. //遍历列
  215. for(uint8_t i=0;i<2;i++)
  216. {
  217. HAL_NVIC_DisableIRQ(EXTI0_1_IRQn);//关闭ROW1的中断
  218. switch(i){
  219. case 0:
  220. HAL_GPIO_WritePin(ROW1,GPIO_PIN_RESET);//拉低列1
  221. if(HAL_GPIO_ReadPin(COL1) == 0)//读取键值
  222. ucKey_val = 1;
  223. HAL_GPIO_WritePin(ROW1,GPIO_PIN_SET);//拉高列1
  224. break;
  225. case 1:
  226. HAL_GPIO_WritePin(ROW2,GPIO_PIN_RESET);//拉低列2
  227. if(HAL_GPIO_ReadPin(COL1) == 0)//读取键值
  228. ucKey_val = 4;
  229. HAL_GPIO_WritePin(ROW2,GPIO_PIN_SET);//拉高列2
  230. break;
  231. default:
  232. break;
  233. }
  234. }
  235. //拉低三列的电平
  236. HAL_GPIO_WritePin(ROW1,GPIO_PIN_RESET);
  237. HAL_GPIO_WritePin(ROW2,GPIO_PIN_RESET);
  238. //打开ROW1中断
  239. HAL_NVIC_EnableIRQ(EXTI0_1_IRQn);
  240. return ucKey_val;
  241. }
  242. uint16_t Scan_Col2(void)
  243. {
  244. static uint16_t ucKey_val=0; //设立变量存键值
  245. HAL_GPIO_WritePin(ROW1,GPIO_PIN_SET);//拉高3列的电平
  246. HAL_GPIO_WritePin(ROW2,GPIO_PIN_SET);
  247. //遍历列
  248. for(uint8_t i=0;i<2;i++)
  249. {
  250. HAL_NVIC_DisableIRQ(EXTI0_1_IRQn);//关闭ROW1的中断
  251. switch(i){
  252. case 0:
  253. HAL_GPIO_WritePin(ROW1,GPIO_PIN_RESET);//拉低列1
  254. if(HAL_GPIO_ReadPin(COL2) == 0)//读取键值
  255. ucKey_val = 2;
  256. HAL_GPIO_WritePin(ROW1,GPIO_PIN_SET);//拉高列1
  257. break;
  258. case 1:
  259. HAL_GPIO_WritePin(ROW2,GPIO_PIN_RESET);//拉低列2
  260. if(HAL_GPIO_ReadPin(COL2) == 0)//读取键值
  261. ucKey_val = 5;
  262. HAL_GPIO_WritePin(ROW2,GPIO_PIN_SET);//拉高列2
  263. break;
  264. default:
  265. break;
  266. }
  267. }
  268. //拉低三列的电平
  269. HAL_GPIO_WritePin(ROW1,GPIO_PIN_RESET);
  270. HAL_GPIO_WritePin(ROW2,GPIO_PIN_RESET);
  271. //打开ROW1中断
  272. HAL_NVIC_EnableIRQ(EXTI0_1_IRQn);
  273. return ucKey_val;
  274. }
  275. void lora_proc(void)
  276. {
  277. if(Tx_flag==1)
  278. {
  279. Tx_flag=0;
  280. Lora_Txbuff[0]='Z'; //数据校验
  281. Lora_Txbuff[1]=key1.B1;
  282. Lora_Txbuff[2]=key1.B2;
  283. Lora_Txbuff[3]=key1.B4;
  284. Lora_Txbuff[4]=key1.B5;
  285. Lora_Txbuff[5]='F';
  286. LORA_Tx(Lora_Txbuff,sizeof(Lora_Txbuff));
  287. //清空
  288. key1.B1=0;
  289. key1.B2=0;
  290. key1.B4=0;
  291. key1.B5=0;
  292. }
  293. if(LORA_Rx(Lora_Rxbuff)==6&&Lora_Rxbuff[0]=='Y')
  294. {
  295. show1.CV=(float)Lora_Rxbuff[1]/10;
  296. show1.PV=(float)Lora_Rxbuff[2]/10;
  297. show1.K1=Lora_Rxbuff[3];
  298. show1.K2=Lora_Rxbuff[4];
  299. show1.mode=Lora_Rxbuff[5];
  300. }
  301. }
  302. void oled_proc(void)
  303. {
  304. sprintf((char*)Strbuff," %.1fV - %.1fV ",show1.CV,show1.PV);
  305. OLED_ShowString(0,Strbuff);
  306. sprintf((char*)Strbuff," %d%d%d ",show1.K1,show1.K2,show1.mode);
  307. OLED_ShowString(2,Strbuff);
  308. }

4.2NODE.B

  1. /* Includes ------------------------------------------------------------------*/
  2. #include "main.h"
  3. #include "adc.h"
  4. #include "i2c.h"
  5. #include "spi.h"
  6. #include "tim.h"
  7. #include "gpio.h"
  8. /* Private includes ----------------------------------------------------------*/
  9. /* USER CODE BEGIN Includes */
  10. #include "stdio.h"
  11. #include "stdlib.h"
  12. #include "oled.h"
  13. #include "lora.h"
  14. /* USER CODE END Includes */
  15. /* Private typedef -----------------------------------------------------------*/
  16. /* USER CODE BEGIN PTD */
  17. /* USER CODE END PTD */
  18. /* Private define ------------------------------------------------------------*/
  19. /* USER CODE BEGIN PD */
  20. /* USER CODE END PD */
  21. /* Private macro -------------------------------------------------------------*/
  22. /* USER CODE BEGIN PM */
  23. void get_adc(void); //ADC采样控制
  24. void adc_Prog(void);
  25. void para_Prog(void);
  26. void relay_Prog(void);
  27. void show_Prog(void);
  28. void led_prog(void);
  29. void lora_Prog(void); //Lora通信设置
  30. /* USER CODE END PM */
  31. /* Private variables ---------------------------------------------------------*/
  32. /* USER CODE BEGIN PV */
  33. uint16_t Adc_val[2];
  34. struct Adc{
  35. uint16_t RP1; //RP1电压
  36. uint16_t RP2; //RP2电压
  37. uint16_t CV; //电压差
  38. uint16_t PV; //电压参数
  39. }val;
  40. struct time{
  41. uint16_t us; //定时微秒
  42. uint16_t ms; //定时毫秒
  43. uint16_t s; //定时器秒
  44. }time;
  45. uint8_t Lora_Txbuff[6];
  46. uint8_t Lora_Rxbuff[7];
  47. uint8_t Strbuff[17]; //OLED显示字符串
  48. uint8_t dis_Mode; //模式切换标志位
  49. uint8_t work_Mode; //模式选择
  50. uint8_t adc_flag; //ADC采样控制
  51. uint8_t tx_flag;
  52. /* USER CODE END PV */
  53. /* Private function prototypes -----------------------------------------------*/
  54. void SystemClock_Config(void);
  55. /* USER CODE BEGIN PFP */
  56. /* USER CODE END PFP */
  57. /* Private user code ---------------------------------------------------------*/
  58. /* USER CODE BEGIN 0 */
  59. /* USER CODE END 0 */
  60. /**
  61. * @brief The application entry point.
  62. * @retval int
  63. */
  64. int main(void)
  65. {
  66. /* USER CODE BEGIN 1 */
  67. /* USER CODE END 1 */
  68. /* MCU Configuration--------------------------------------------------------*/
  69. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  70. HAL_Init();
  71. /* USER CODE BEGIN Init */
  72. /* USER CODE END Init */
  73. /* Configure the system clock */
  74. SystemClock_Config();
  75. /* USER CODE BEGIN SysInit */
  76. /* USER CODE END SysInit */
  77. /* Initialize all configured peripherals */
  78. MX_GPIO_Init();
  79. MX_ADC_Init();
  80. MX_I2C3_Init();
  81. MX_TIM2_Init();
  82. MX_SPI1_Init();
  83. /* USER CODE BEGIN 2 */
  84. OLED_Init();
  85. LORA_Init(); //lora初始化
  86. HAL_TIM_Base_Start_IT(&htim2); //打开定时器2
  87. dis_Mode=0;
  88. work_Mode=0;
  89. val.PV=10;
  90. adc_flag=1;
  91. tx_flag=0;
  92. /* USER CODE END 2 */
  93. /* Infinite loop */
  94. /* USER CODE BEGIN WHILE */
  95. while (1)
  96. {
  97. /* USER CODE END WHILE */
  98. /* USER CODE BEGIN 3 */
  99. led_prog();
  100. show_Prog();
  101. relay_Prog();
  102. lora_Prog();
  103. }
  104. /* USER CODE END 3 */
  105. }
  106. /**
  107. * @brief System Clock Configuration
  108. * @retval None
  109. */
  110. void SystemClock_Config(void)
  111. {
  112. RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  113. RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  114. RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
  115. /** Configure the main internal regulator output voltage
  116. */
  117. __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  118. /** Initializes the RCC Oscillators according to the specified parameters
  119. * in the RCC_OscInitTypeDef structure.
  120. */
  121. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  122. RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  123. RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  124. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  125. RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  126. RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_3;
  127. RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2;
  128. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  129. {
  130. Error_Handler();
  131. }
  132. /** Initializes the CPU, AHB and APB buses clocks
  133. */
  134. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  135. |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  136. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  137. RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  138. RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  139. RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  140. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  141. {
  142. Error_Handler();
  143. }
  144. PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_I2C3;
  145. PeriphClkInit.I2c3ClockSelection = RCC_I2C3CLKSOURCE_PCLK1;
  146. if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  147. {
  148. Error_Handler();
  149. }
  150. }
  151. /* USER CODE BEGIN 4 */
  152. /*外部中断*/
  153. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  154. {
  155. if(HAL_GPIO_ReadPin(USER)==0)
  156. if(++dis_Mode==2)
  157. dis_Mode=0;
  158. }
  159. /*定时器中断*/
  160. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  161. {
  162. if(++time.ms==99)
  163. {
  164. time.ms=0;
  165. adc_flag=1;
  166. }
  167. }
  168. void get_adc(void)
  169. {
  170. HAL_ADC_Start(&hadc);
  171. if(HAL_ADC_PollForConversion(&hadc,10)==HAL_OK)
  172. Adc_val[0]=HAL_ADC_GetValue(&hadc);
  173. if(HAL_ADC_PollForConversion(&hadc,10)==HAL_OK)
  174. Adc_val[1]=HAL_ADC_GetValue(&hadc);
  175. val.RP1=(int)(Adc_val[1]*3.3/4095*10);
  176. val.RP2=(int)(Adc_val[0]*3.3/4095*10);
  177. }
  178. /*ADC显示程序*/
  179. void adc_Prog(void)
  180. {
  181. sprintf((char*)Strbuff," RP1:%.1fV ",(float)val.RP1/10);
  182. OLED_ShowString(0,Strbuff);
  183. sprintf((char*)Strbuff," RP2:%.1fV ",(float)val.RP2/10);
  184. OLED_ShowString(2,Strbuff);
  185. }
  186. void para_Prog(void)
  187. {
  188. sprintf((char*)Strbuff," CV:%.1fV ",(float)val.CV/10);
  189. OLED_ShowString(0,Strbuff);
  190. sprintf((char*)Strbuff," PV:%.1fV ",(float)val.PV/10);
  191. OLED_ShowString(2,Strbuff);
  192. }
  193. void relay_Prog(void)
  194. {
  195. if(work_Mode==0)
  196. {
  197. if(val.CV>val.PV)
  198. {
  199. HAL_GPIO_WritePin(Relay1,OFF);
  200. HAL_GPIO_WritePin(Relay2,ON);
  201. }
  202. else
  203. {
  204. HAL_GPIO_WritePin(Relay1,ON);
  205. HAL_GPIO_WritePin(Relay2,OFF);
  206. }
  207. }
  208. }
  209. /*OLED显示*/
  210. void show_Prog(void)
  211. {
  212. if(adc_flag==1)
  213. {
  214. get_adc();
  215. adc_flag=0;
  216. val.CV=abs(val.RP1-val.RP2);
  217. }
  218. if(dis_Mode==0)
  219. adc_Prog();
  220. else
  221. para_Prog();
  222. }
  223. /*LED指示灯*/
  224. void led_prog(void)
  225. {
  226. if(work_Mode==0)
  227. HAL_GPIO_WritePin(LD5,OFF);
  228. else
  229. HAL_GPIO_WritePin(LD5,ON);
  230. }
  231. void lora_Prog(void)
  232. {
  233. if(tx_flag==1)
  234. {
  235. tx_flag=0;
  236. Lora_Txbuff[0]='Y'; //数据校验
  237. Lora_Txbuff[1]=(int)(val.CV);
  238. Lora_Txbuff[2]=(int)(val.PV);
  239. Lora_Txbuff[3]=Read(Relay1);
  240. Lora_Txbuff[4]=Read(Relay2);
  241. Lora_Txbuff[5]=work_Mode;
  242. LORA_Tx(Lora_Txbuff,sizeof(Lora_Txbuff));
  243. }
  244. if(LORA_Rx(Lora_Rxbuff)==6&&Lora_Rxbuff[0]=='Z'&&Lora_Rxbuff[5]=='F')
  245. {
  246. if(Lora_Rxbuff[1]==1)
  247. {
  248. if(++work_Mode==2)
  249. work_Mode=0;
  250. }
  251. if(Lora_Rxbuff[2]==1)
  252. {
  253. tx_flag=1;
  254. }
  255. if(Lora_Rxbuff[3]==1)
  256. {
  257. switch(work_Mode)
  258. {
  259. case 0:
  260. val.PV+=1;
  261. break;
  262. case 1:
  263. HAL_GPIO_TogglePin(Relay1);
  264. break;
  265. default:
  266. break;
  267. }
  268. }
  269. if(Lora_Rxbuff[4]==1)
  270. {
  271. switch(work_Mode)
  272. {
  273. case 0:
  274. val.PV-=1;
  275. break;
  276. case 1:
  277. HAL_GPIO_TogglePin(Relay2);
  278. break;
  279. default:
  280. break;
  281. }
  282. }
  283. }
  284. }
  285. /* USER CODE END 4 */

五、效果

效果还没拍视频,后期再补上

六、总结与感悟

        这是本人第一次写这么多内容的blog,还有本人语文素养比较低。可能有些措辞不当或者语句不通顺的地方,希望能够指正。

        代码总体来说的话,大部分是自己编写的,有一部分是借鉴网上的大佬的代码。由于本人C语言功底比较薄弱,所以有些语法写的很笨。或许有更好更高效的方法,也希望能给我指出一些建议。

        第四次参加蓝桥杯了,之前参加的是单片机和嵌入式组。今年是第一次参加物联网,也是最后一次参加蓝桥杯了。赛前没有很好的准备,赛场上只完成了部分功能,赛后经过不断完善,基本上将所有功能都实现了。虽然没有在赛场上完成全部功能,但是赛后能把所有功能都实现,也算是不给自己留下太多遗憾了。

七、代码及题目链接

夸克网盘:链接:https://pan.quark.cn/s/6e1ee164fceb  提取码:sdSs

百度网盘:链接:https://pan.baidu.com/s/16Qw5IuQn-rivRKj6Fb_RAg?pwd=h8tu 提取码:h8tu

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

闽ICP备14008679号