6 -【第十三届】蓝桥杯物联网试题 (省赛题)

这篇具有很好参考价值的文章主要介绍了6 -【第十三届】蓝桥杯物联网试题 (省赛题)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

设计题

6 -【第十三届】蓝桥杯物联网试题 (省赛题)
6 -【第十三届】蓝桥杯物联网试题 (省赛题)
6 -【第十三届】蓝桥杯物联网试题 (省赛题)
6 -【第十三届】蓝桥杯物联网试题 (省赛题)

节点1

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

6 -【第十三届】蓝桥杯物联网试题 (省赛题)

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

引脚功能

6 -【第十三届】蓝桥杯物联网试题 (省赛题)

使能中断

6 -【第十三届】蓝桥杯物联网试题 (省赛题)
6 -【第十三届】蓝桥杯物联网试题 (省赛题)
6 -【第十三届】蓝桥杯物联网试题 (省赛题)

打开串口通信2

6 -【第十三届】蓝桥杯物联网试题 (省赛题)

3.生成工程代码

6 -【第十三届】蓝桥杯物联网试题 (省赛题)

4.移植OLED、LoRa库文件

6 -【第十三届】蓝桥杯物联网试题 (省赛题)

5.编写逻辑代码

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 "usart.h"

void Task_BrdInit(void);
void Task_Main(void);
void key_fun(void);
void led_fun(void);
void oled_dis(void);

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

radio_handle_t handle;
#define FREQ			445000000L

bool key_flag = 0;
bool lora_flag = 0;
uint8_t LD2=0, LD3=0, LD5=0;

uint32_t count = 0;
uint8_t data[10] = {0};
uint8_t uart_recv_buf[256] = {0};

uint8_t ID = 97;
char lora_send_buf[23] = "ID:97,LD2:0,LD3:0,LD5: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(key_flag)
	{
		key_flag = 0;
		key_fun();
	}
	/*指示灯状态检测*/
	led_fun();
	/*OLED显示更新*/
	oled_dis();
}

void Task_BrdInit(void)
{
    //OLED初始化
    OLED_PowerControl(ENABLE);
    HAL_Delay(200);
    OLED_Init();
    OLED_Clear();
	OLED_ShowString(0, 0, (unsigned char *)"      RX:      ", 16);
	OLED_ShowString(0, 2, (unsigned char *)"     NUM:0     ", 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
    } 
	__HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);
	HAL_UART_Receive_IT(&huart2, uart_recv_buf, 1);
	
	data[0] = '\0';
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == GPIO_PIN_14)
	{
		key_flag = 1;
	}
	if(GPIO_Pin == GPIO_PIN_10)
	{
		lora_flag = 1;
	}
}

void key_fun(void)
{
	sprintf(lora_send_buf, "ID:%2d,LD2:%c,LD3:%c,LD5:%c", ID, LD2, LD3, LD5);
	radio_buf_send(handle, (uint8_t *)lora_send_buf, 23);
	radio_mode_set(handle, RX_MODE);
}

void led_fun(void)
{
	if(LD2)
	{
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
	}
	else
	{
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);		
	}
	if(LD3)
	{
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
	}
	else
	{
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);		
	}
	if(LD5)
	{
		HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_RESET);
	}
	else
	{
		HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET);		
	}	
}

void oled_dis(void)
{
	char dis1[16] = {0};
	char dis2[16] = {0};	
	
	sprintf(dis1, "      RX:%c", data[0]);
	sprintf(dis2, "     NUM:%d", count);
	
	OLED_ShowString(0, 0, (uint8_t *)dis1, 16);
	OLED_ShowString(0, 2, (uint8_t *)dis2, 16);	
}

stm32l0xx_it.c
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN TD */
extern uint8_t data[10];
extern uint32_t count;
extern uint8_t LD2, LD3, LD5;

/* USER CODE END TD */
/**
  * @brief This function handles USART2 global interrupt / USART2 wake-up interrupt through EXTI line 26.
  */
void USART2_IRQHandler(void)
{
  /* USER CODE BEGIN USART2_IRQn 0 */
	
	if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_RXNE)==SET)
	{
		data[0] = USART2->RDR;
		switch(data[0])
		{
			case '@':
				if(LD5)
				{
					LD5 = 0;
				}
				else
				{
					LD5 = 1;
				}
				count++;
				break;
			case '#':
				if(LD2)
				{
					LD2 = 0;
				}
				else
				{
					LD2 = 1;
				}	
				count++;
				break;
			case '$':
				if(LD3)
				{
					LD3 = 0;
				}
				else
				{
					LD3 = 1;
				}
				count++;
				break;
			default:
		HAL_UART_Transmit(&huart2, (uint8_t *)"error", 5, 50);				
				break;
		}
	}
  /* USER CODE END USART2_IRQn 0 */
  HAL_UART_IRQHandler(&huart2);
  /* USER CODE BEGIN USART2_IRQn 1 */

  /* USER CODE END USART2_IRQn 1 */
}
main.c
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "Task_Main.h"
/* USER CODE END Includes */
  /* USER CODE BEGIN 2 */
	Task_BrdInit();
  /* USER CODE END 2 */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

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

节点2

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

6 -【第十三届】蓝桥杯物联网试题 (省赛题)

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

引脚功能

6 -【第十三届】蓝桥杯物联网试题 (省赛题)

使能中断

6 -【第十三届】蓝桥杯物联网试题 (省赛题)
6 -【第十三届】蓝桥杯物联网试题 (省赛题)
6 -【第十三届】蓝桥杯物联网试题 (省赛题)

3.生成工程代码

6 -【第十三届】蓝桥杯物联网试题 (省赛题)

4.移植LoRa、OLED库文件

6 -【第十三届】蓝桥杯物联网试题 (省赛题)文章来源地址https://www.toymoban.com/news/detail-401972.html

5.编写逻辑代码

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 "adc.h"

void Task_BrdInit(void);
void Task_Main(void);
void get_adc(void);
void oled_dis(void);
void oled_flush(void);
void lora_recv(void);
void get_cmd(void);
void led_fun(void);
	
#endif

Task_Main.c
#include "Task_Main.h"

radio_handle_t handle;
#define FREQ			445000000L

bool key_flag = 0;
bool lora_flag = 0;
bool oled_mode = 0;

uint32_t ADC_Value[20] = {0};
uint8_t LD2=0, LD3=0, LD5=0;
uint32_t num = 0;

uint8_t lora_recv_buf[256] = {0};
uint16_t lora_recv_buf_size = 0;

float vol1 = 3.1;
float vol2 = 0.8;

void Task_Main(void)
{
	/*按键检测*/
	if(key_flag)
	{
		key_flag = 0;
		oled_mode = !oled_mode;
		oled_flush();
	}
	/*ADC检测*/
	get_adc();
	/*oled显示刷新*/
	oled_dis();
	/*lora接收检测*/
	if(lora_flag)
	{
		lora_flag = 0;
		lora_recv();
	}
	/*led状态更新*/
	led_fun();
}

void Task_BrdInit(void)
{
    //OLED初始化
    OLED_PowerControl(ENABLE);
    HAL_Delay(200);
    OLED_Init();
    OLED_Clear();
	OLED_ShowString(0, 0, (unsigned char *)"    RP1:3.1V    ", 16);
	OLED_ShowString(0, 2, (unsigned char *)"    RP2:0.8V    ", 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_14)
	{
		key_flag = 1;
	}
	if(GPIO_Pin == GPIO_PIN_10)
	{
		lora_flag = 1;
	}
}

void get_adc(void)
{
	HAL_ADC_Start_DMA(&hadc, ADC_Value, 10);
	vol2 = ((ADC_Value[0]+ADC_Value[2]+ADC_Value[4]+ADC_Value[6]+ADC_Value[8])*3.3)/(4095*5);
	vol1 = ((ADC_Value[1]+ADC_Value[3]+ADC_Value[5]+ADC_Value[7]+ADC_Value[9])*3.3)/(4095*5);	
	vol1 = (int)(vol1*10 + 0.5) * 0.1;
	vol2 = (int)(vol2*10 + 0.5) * 0.1;
}

void oled_dis(void)
{
	char dis_vol1[3] = {0};
	char dis_vol2[3] = {0};
	char dis_num[6] = {0};
	
	if(!oled_mode)
	{
		sprintf(dis_vol1, "%3.1f", vol1);
		sprintf(dis_vol2, "%3.1f", vol2);		

		OLED_ShowString(64, 0, (uint8_t *)dis_vol1, 16);
		OLED_ShowString(64, 2, (uint8_t *)dis_vol2, 16);	
	}
	else
	{
		sprintf(dis_num, "%d", num);
		OLED_ShowString(72, 0, (uint8_t *)dis_num, 16);	
		if(LD2&LD3)
		{
			OLED_ShowString(64, 2, (unsigned char *)"ON ", 16);
		}
		else
		{
			OLED_ShowString(64, 2, (unsigned char *)"OFF", 16);
		}		
	}
}

void oled_flush(void)
{
	char oled_fl1[16] = {0};
	char oled_fl2[16] = {0};	
	
	if(!oled_mode)
	{
		sprintf(oled_fl1, "    RP1:%3.1fV    ", vol1);
		sprintf(oled_fl2, "    RP1:%3.1fV    ", vol2);	
		
		OLED_ShowString(0, 0, (uint8_t *)oled_fl1, 16);
		OLED_ShowString(0, 2, (uint8_t *)oled_fl2, 16);		
	}
	else
	{
		sprintf(oled_fl1, "     NUM:%d", num);
		OLED_ShowString(0, 0, (uint8_t *)"                ", 16);
		OLED_ShowString(0, 0, (uint8_t *)oled_fl1, 16);		
		if(LD2&LD3)
		{
			OLED_ShowString(0, 2, (unsigned char *)"    STA:ON      ", 16);
		}
		else
		{
			OLED_ShowString(0, 2, (unsigned char *)"    STA:OFF     ", 16);
		}
		
	}	
}

void lora_recv(void)
{
	int ret = -1;
	
	ret = radio_buf_recv(handle, lora_recv_buf, &lora_recv_buf_size);
	if((ret== RADIO_RET_OK)&&(lora_recv_buf_size==23))
	{
		get_cmd();
	}
}

void get_cmd(void)
{
	if((lora_recv_buf[3]=='9')&&(lora_recv_buf[4]=='7'))
	{
		LD2 = lora_recv_buf[10];
		LD3 = lora_recv_buf[16];
		LD5 = lora_recv_buf[22];	
		num++;
	}
}

void led_fun(void)
{
	if(LD2==1)
	{
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
	}
	else
	{
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);		
	}
	if(LD3==1)
	{
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
	}
	else
	{
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);		
	}
	if(LD5==1)
	{
		HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_RESET);
	}
	else
	{
		HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET);		
	}	
}

main.c
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "Task_Main.h"
/* USER CODE END Includes */
  /* USER CODE BEGIN 2 */
	Task_BrdInit();
  /* USER CODE END 2 */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

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

实验现象

Node_A

Node_B

到了这里,关于6 -【第十三届】蓝桥杯物联网试题 (省赛题)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第十三届蓝桥杯省赛Python 组

    本次所有代码均存放于仓库: Github :GxlHus/Algorithm at 蓝桥杯 (github.com) Gitee :Algorithm: 算法解题 - Gitee.com 原题目:第十三届蓝桥杯大赛软件赛省赛_PB.pdf · AYO/Algorithm - Gitee.com 本次省赛题目总体来说不难,总体质量比较高,尤其是后边几道题,虽然能轻易做出来,但是想跑通所

    2023年04月17日
    浏览(47)
  • 第十三届蓝桥杯省赛 python B组复盘

    😎🥳😎 备战蓝桥杯第一弹–复盘 思路 (当时第一次参加蓝桥杯,当时现场心里小鹿乱撞,用排序输出了还每个字母数数验证一番(滑稽)) 字符串转列表 列表排序 列表转字符串 代码 思路 当时在现场程序没跑出来 想着那个数取余2余1,取余4余1,取余8余1可以只看取余8余1的,

    2023年04月20日
    浏览(45)
  • 【蓝桥杯Web】第十三届蓝桥杯(Web 应用开发)省赛真题

    第十三届蓝桥杯全国软件和信息技术专业人才大赛(软件类)新开了Web应用开发比赛,本文介绍第十三届蓝桥杯Web应用开发的省赛题目以及解析。 题目描述:使用Flex属性快速完成布局。 题目分析:主要涉及的是Flex弹性布局的知识,主要包括主轴方向和是否换行。 题目代码:

    2023年04月10日
    浏览(51)
  • 第十三届蓝桥杯大赛软件赛省赛(C++研究生组)

    可以证明,只要首先裁剪最外围的 4 4 4 条边,之后无论怎样裁剪,次数都是最少。对于 n n n 行 m m m 列的二维码,至少需要裁剪 n m + 3 nm + 3 nm + 3 次,因此答案为 20 × 22 + 3 = 443 20times 22+3=443 20 × 22 + 3 = 443 。 证明:只需证明裁掉边界后至少还需裁剪 n m − 1 nm-1 nm − 1 次。 n

    2023年04月10日
    浏览(47)
  • 【蓝桥杯嵌入式】第十三届蓝桥杯嵌入式省赛客观题以及详细题解

    题解:   概念题。 MCO引脚,是单片机对外提供时钟的引脚。 HSE,高速外部时钟信号,时钟源由外部晶体/陶瓷谐振器与外部时钟; HSI,高速的内部时钟,由内部8MHz的RC振荡器产生,可直接作为系统时钟或在2分频后作为PLL输入; SYSCLK,是系统时钟; HSE/2,对高速外部时钟进

    2023年04月16日
    浏览(166)
  • 第十三届蓝桥杯 Java C组省赛 C 题——纸张尺寸(AC)

    在 ISO 国际标准中定义了 A0 纸张的大小为 1189mm × 841mm, 将 A0 纸 沿长边对折后为 A1 纸, 大小为 841mm × 594mm, 在对折的过程中长度直接取 下整 (实际裁剪时可能有损耗)。将 A1 纸沿长边对折后为 A2 纸, 依此类推。 输入纸张的名称, 请输出纸张的大小。 输入一行包含一个字符串表示

    2024年02月11日
    浏览(42)
  • 第十三届蓝桥杯 C++ B组省赛 C 题——刷题统计(AC)

    小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天 做 a a a 道题目, 周六和周日每天做 b b b 道题目。请你帮小明计算, 按照计划他将在 第几天实现做题数大于等于 n n n 题? 输入一行包含三个整数 a , b a,b a , b 和 n n n . 输出一个整数代表天数。 10 20 99 8 1 ≤

    2024年01月20日
    浏览(36)
  • 看看去年蓝桥考了什么,第十三届蓝桥杯省赛(C/C++ 大学B组)题解

    本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 九进制正整数 (2022)9 转换成十进制等于多少? 最大运行时间:1s 最大运行内存: 512M 这是一道经典的进制转换题目,具体可以点进链接看看这篇文章。进制转换点击这里!!! 本题为填空题,只

    2024年02月02日
    浏览(54)
  • 第十三届蓝桥杯 Java B 组省赛 D 题—— 最少刷题数(AC)

    小蓝老师教的编程课有 N N N 名学生, 编号依次是 1 … N 1…N 1 … N 。第 i i i 号学生这学期 刷题的数量是 A i A_{i} A i ​ 。 对于每一名学生, 请你计算他至少还要再刷多少道题, 才能使得全班刷题 比他多的学生数不超过刷题比他少的学生数。 第一行包含一个正整数 N N N 。 第二

    2023年04月09日
    浏览(43)
  • 2022 第十三届蓝桥杯大赛软件赛省赛(第二场),C/C++ 大学B组题解

    2022 第十三届蓝桥杯大赛软件赛省赛(第二场),C/C++ 大学B组题解 补题链接:地址 第1题 —— 练习 (5分) 题意:过了样例交上去0分,问可能是ABC的哪一种 显然都是,答案:ABC 第2题 —— 三角回文数 (5分) 题意:求第一个大于某2e8的数的回文数,且满足他可以等于1+2+…

    2023年04月09日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包