1 -【第十一届】蓝桥杯物联网试题(模拟题)

题目要求

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

配置过程:

节点1

1.将时钟树频率设置成32MHz

在这里插入图片描述

2.将GPIO引脚做如下配置:

引脚功能

在这里插入图片描述

中断配置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.生成工程代码
4.移植OLED、LoRa库文件

在这里插入图片描述

5.编写逻辑代码

自定义Task_Main.h Task_Main.c工程文件

Task_Main.h
#ifndef _TASK_MAIN_H_
#define _TASK_MAIN_H_

#include "main.h"
#include "stm32l0xx_hal.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "oled.h"
#include "sx127x_lora.h"

void Task_BrdInit(void);
void Task_Main(void);
void recv_buf(void);
void send_buf(void);
void get_cmd(uint8_t *get_data, uint16_t size);

#endif
Task_Main.c
#include "Task_Main.h"

radio_handle_t handle;
#define FREQ			433000000L

bool send_flag = 0;
bool recv_flag = 0;

uint8_t oled_dis_on[4] =  "ON \0";
uint8_t oled_dis_off[4] = "OFF\0";

uint8_t recv_data[256] = {0};
uint16_t recv_data_size = 0;
uint8_t send_data[7] = {0x14,0x02,0x35,0x69,0x41,0x0A,0x01};

void Task_Main(void)
{
    if(send_flag)
    {
        send_flag = 0;
        send_buf();
    }
    if(recv_flag)
    {
        recv_flag = 0;
        recv_buf();
    }
}

void Task_BrdInit(void)
{
    //OLED初始化
    OLED_PowerControl(ENABLE);
    HAL_Delay(200);
    OLED_Init();
    OLED_Clear();
    OLED_ShowString(0, 0, (unsigned char *)"K1-LED:OFF      ", 16);
    OLED_ShowString(0, 2, (unsigned char *)"K2-LED:OFF      ", 16);
  
    //LoRa初始化
    spi_init();
    zm4xx_pin_init();
    handle = radio_zm4xx_inst_init(spi_recv_byte,spi_send_byte,zm4xx_rst_pin_set,zm4xx_sel_pin_set,HAL_Delay,delay_us);
    if(handle != NULL)
    {
      if(RADIO_RET_OK == radio_freq_set(handle, FREQ))
      {
      }
      radio_mode_set(handle, RX_MODE);	//Receive Mode
    }    
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(GPIO_Pin == GPIO_PIN_10)
    {
        recv_flag = 1;
    }
    if(GPIO_Pin == GPIO_PIN_14)
    {
        send_flag = 1;
    }
}

void send_buf(void)
{
    radio_buf_send(handle, send_data, 7);
    radio_mode_set(handle, RX_MODE); 
}

void recv_buf(void)
{
    uint8_t data[256] = {0};
    uint8_t i = 0;
  
    int ret = 0;
    ret = radio_buf_recv(handle, recv_data, &recv_data_size);
    if(ret == RADIO_RET_OK)
    {
        for(i=0; i<recv_data_size; i++)
        {
            data[i] = recv_data[i];
        }
        get_cmd(data, recv_data_size);
    }
}

void get_cmd(uint8_t *get_data, uint16_t size)
{
    if(size == 7)
    {
        if((get_data[0]==0x14)&(get_data[1]==0x02)&(get_data[2]==0x35)&(get_data[3]==0x69)&(get_data[4]==0x42)&(get_data[5]==0x0B))
        {        
            switch(get_data[6])
            {
              case 0x11:
                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
                OLED_ShowString(56, 0, oled_dis_on, 16);
                OLED_ShowString(56, 2, oled_dis_off, 16);
                break;
              case 0x12:
                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); 
                OLED_ShowString(56, 0, oled_dis_off, 16);
                OLED_ShowString(56, 2, oled_dis_on, 16);          
                break;
              case 0x13:
                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);          
                OLED_ShowString(56, 0, oled_dis_off, 16);
                OLED_ShowString(56, 2, oled_dis_off, 16);          
                break;  
              default:
                break;
            }
        }
#if 1
        if((get_data[0]==0x55)&(get_data[1]==0xc6)&(get_data[2]==0x35)&(get_data[3]==0x69)&(get_data[4]==0x42)&(get_data[5]==0x0B))
        {        
            switch(get_data[6])
            {
              case 0x11:
                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
                OLED_ShowString(56, 0, oled_dis_on, 16);
                OLED_ShowString(56, 2, oled_dis_off, 16);
                break;
              case 0x12:
                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); 
                OLED_ShowString(56, 0, oled_dis_off, 16);
                OLED_ShowString(56, 2, oled_dis_on, 16);          
                break;
              case 0x13:
                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);          
                OLED_ShowString(56, 0, oled_dis_off, 16);
                OLED_ShowString(56, 2, oled_dis_off, 16);          
                break;  
              default:
                break;
            }
        }
        if((get_data[0]==0xB8)&(get_data[1]==0xB9)&(get_data[2]==0x35)&(get_data[3]==0x69)&(get_data[4]==0x42)&(get_data[5]==0x0B))
        {      
            switch(get_data[6])
            {
              case 0x11:
                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
                OLED_ShowString(56, 0, oled_dis_on, 16);
                OLED_ShowString(56, 2, oled_dis_off, 16);
                break;
              case 0x12:
                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); 
                OLED_ShowString(56, 0, oled_dis_off, 16);
                OLED_ShowString(56, 2, oled_dis_on, 16);          
                break;
              case 0x13:
                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
                HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);          
                OLED_ShowString(56, 0, oled_dis_off, 16);
                OLED_ShowString(56, 2, oled_dis_off, 16);          
                break;  
              default:
                break;
            }
        }
#endif        
    }     
}
main.c

引入头文件

/* USER CODE BEGIN Includes */
#include "Task_Main.h"
/* USER CODE END Includes */

板级初始化

  /* USER CODE BEGIN 2 */
  Task_BrdInit();
  /* USER CODE END 2 */

主控代码

  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    Task_Main();
  }
  /* USER CODE END 3 */

节点2

1.将时钟树频率设置成32MHz

在这里插入图片描述

2.将GPIO引脚做如下配置:

引脚功能

在这里插入图片描述

中断配置

在这里插入图片描述
在这里插入图片描述

ADC配置

在这里插入图片描述
在这里插入图片描述

使能定时器

在这里插入图片描述
在这里插入图片描述

3.生成工程代码

4.移植OLED、LoRa库文件

在这里插入图片描述

5.编写逻辑代码

自定义Task_Main.h Task_Main.c工程文件

Task_Main.h
#ifndef _TASK_MAIN_H_
#define _TASK_MAIN_H_

#include "main.h"
#include "stm32l0xx_hal.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "oled.h"
#include "sx127x_lora.h"
#include "lptim.h"
#include "adc.h"

void Task_BrdInit(void);
void Task_Main(void);
void recv_buf(void);
void send_buf(uint8_t *data);
void get_cmd(uint8_t *get_data, uint16_t size);
void get_adc(void);

#endif
Task_Main.c
#include "Task_Main.h"

radio_handle_t handle;
#define FREQ			433000000L

uint32_t Period=5000;

bool recv_flag = 0;

uint8_t recv_data[256] = {0};
uint16_t recv_data_size = 0;
uint8_t send_data1[7] = {0x14,0x02,0x35,0x69,0x42,0x0B,0x11};
uint8_t send_data2[7] = {0x14,0x02,0x35,0x69,0x42,0x0B,0x12};
uint8_t send_data3[7] = {0x14,0x02,0x35,0x69,0x42,0x0B,0x13};

uint32_t adc_value[10] = {0};
float vol = 0.0;

int fputc(int ch, FILE *f)
{
    while(((USART2->ISR)&(1<<7))==0);
    USART2->TDR = (uint8_t)ch;
  
    return ch;
}

void Task_Main(void)
{
    if(recv_flag)
    {
        recv_flag = 0;
        recv_buf();
    }
}

void Task_BrdInit(void)
{
    //OLED初始化
    OLED_PowerControl(ENABLE);
    HAL_Delay(200);
    OLED_Init();
    OLED_Clear();
    OLED_ShowString(0, 0, (unsigned char *)"REC:None        ", 16);
    OLED_ShowString(0, 2, (unsigned char *)"ADC:None        ", 16);
  
    //LoRa初始化
    spi_init();
    zm4xx_pin_init();
    handle = radio_zm4xx_inst_init(spi_recv_byte,spi_send_byte,zm4xx_rst_pin_set,zm4xx_sel_pin_set,HAL_Delay,delay_us);
    if(handle != NULL)
    {
      if(RADIO_RET_OK == radio_freq_set(handle, FREQ))
      {
      }
      radio_mode_set(handle, RX_MODE);	//Receive Mode
    } 
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(GPIO_Pin == GPIO_PIN_10)
    {
        recv_flag = 1;
    }
    HAL_ADC_Start_DMA(&hadc, adc_value, 5);
}

void send_buf(uint8_t *data)
{
    radio_buf_send(handle, data, 7);
    radio_mode_set(handle, RX_MODE);    
}

void recv_buf(void)
{
    uint8_t data[256] = {0};
    uint8_t i = 0;
  
    int ret = 0;
    ret = radio_buf_recv(handle, recv_data, &recv_data_size);
    if(ret == RADIO_RET_OK)
    {
        for(i=0; i<recv_data_size; i++)
        {
            data[i] = recv_data[i];
        }
        get_cmd(data, recv_data_size);
    }
}

void get_cmd(uint8_t *get_data, uint16_t size)
{
    if(size == 7)
    {
        if((get_data[0]==0x14)&(get_data[1]==0x02)&(get_data[2]==0x35)&(get_data[3]==0x69)&(get_data[4]==0x41)&(get_data[5]==0x0A)&(get_data[6]==0x01))
        {
            get_adc();
        }
    }   
}

void get_adc(void)
{
    char oled_dis_adc[4] = {0};
  
    vol = ((adc_value[0]+adc_value[1]+adc_value[2]+adc_value[3]+adc_value[4])*3.3)/(4095*5);
    vol = (int)((vol*10)+0.5)/10.0;
    sprintf(oled_dis_adc, "%.1fV", vol);
    OLED_ShowString(32, 0, (uint8_t *)"OK  \0", 16);
    OLED_ShowString(32, 2, (uint8_t *)oled_dis_adc, 16);
    HAL_LPTIM_Counter_Start_IT(&hlptim1, Period);
    if(vol<1.5)
    {
        send_buf(send_data1);  
    }
    else if(vol<2.5)
    {
        send_buf(send_data2);
    }
    else
    {
        send_buf(send_data3);
    }
}

uint8_t g_count = 0;
void HAL_LPTIM_AutoReloadMatchCallback(LPTIM_HandleTypeDef *hlptim)
{
    g_count++;
    if(g_count==100)
    {
        OLED_ShowString(0, 0, (unsigned char *)"REC:None        ", 16);
        OLED_ShowString(0, 2, (unsigned char *)"ADC:None        ", 16);  
        HAL_LPTIM_Counter_Stop_IT(&hlptim1);
        g_count = 0;
    }
}
main.c

引入头文件

/* USER CODE BEGIN Includes */
#include "Task_Main.h"
/* USER CODE END Includes */

板级初始化

  /* USER CODE BEGIN 2 */
  Task_BrdInit();
  /* USER CODE END 2 */

主控代码

  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    Task_Main();
  }
  /* USER CODE END 3 */

实验现象

Node_A初始化画面

在这里插入图片描述

Node_B初始化画面

在这里插入图片描述

Node_A指令画面

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Node_B指令画面

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

T-Y_yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值