技能梳理38@stm32+CC2530+超声波+光敏+oled

2023-05-16

技能梳理38@stm32+CC2530+超声波+光敏+oled

1、项目简介

在这里插入图片描述

2、实现逻辑

#主从机使用zigbee通信
#主机oled显示当前停车场位置图
#从机通过超声波和光敏一起检测是否有车
#当某位置车辆进出,在主机上oled进行提示

3、应用场景

#车辆无线检测
#货架商品有无检测

4、核心代码梳理

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */
	char buf[256];
	uint16_t send_flag = 1;
  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_I2C1_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
#ifdef MASTER
	__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);//open uart1 RXNE
  OLED_Init();			
  OLED_Clear();
  //oled_print(0, 0, "hello");  //first 衿 64是半个屏 second 刿 2是一个错位间跿
	OLED_ShowString(0,0,"---------------",16);
	OLED_ShowString(0,2,"|____|____|____|",16);
	OLED_ShowString(0,4,"|    |    |    |",16);
	OLED_ShowString(0,6,"---------------",16);
	//oled_print(20, 4, "*");
	//oled_print(100, 4, "*");
#endif
  /* USER CODE END 2 */

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

    /* USER CODE BEGIN 3 */
		HAL_Delay(500);
#ifdef SLAVE_CHECK1
			if ((HAL_GPIO_ReadPin(light_GPIO_Port, light_Pin) == GPIO_PIN_RESET) || (HC_SR04_Measure() > 20)) //无车 //
			{
				if(buf[1] == '1')
				{
					send_flag = 1;
					HAL_GPIO_WritePin(led_GPIO_Port, led_Pin, GPIO_PIN_SET);
				}
				sprintf(buf, "10");
			}
			else
			{
				if(buf[1] == '0')
				{
					send_flag = 1;
					HAL_GPIO_WritePin(led_GPIO_Port, led_Pin, GPIO_PIN_RESET);
				}
				sprintf(buf, "11");
			}
		  
			if(send_flag == 1)
			{
				send_flag = 0;
				HAL_UART_Transmit(&huart1, (uint8_t*)buf, strlen(buf), HAL_MAX_DELAY);
			}
			
#endif
		
#ifdef SLAVE_CHECK2
			if ((HAL_GPIO_ReadPin(light_GPIO_Port, light_Pin) == GPIO_PIN_RESET) || (HC_SR04_Measure() > 20)) //无车 //
			{
				if(buf[1] == '1')
				{
					send_flag = 1;
					HAL_GPIO_WritePin(led_GPIO_Port, led_Pin, GPIO_PIN_SET);
				}
				sprintf(buf, "20");
			}
			else
			{
				if(buf[1] == '0')
				{
					send_flag = 1;
					HAL_GPIO_WritePin(led_GPIO_Port, led_Pin, GPIO_PIN_RESET);
				}
				sprintf(buf, "21");
			}
		  
			if(send_flag == 1)
			{
				send_flag = 0;
				HAL_UART_Transmit(&huart1, (uint8_t*)buf, strlen(buf), HAL_MAX_DELAY);
			}
		
#endif
		
#ifdef MASTER
		if(rx_ok)
		{
			rx_ok = 0;
			if(rx_order1 == 1)  //YES
			{
					oled_print(20, 4, "*");
			}
      else 
      {
					oled_print(20, 4, " ");
      }
			
			if(rx_order2 == 1)  //YES
			{
					oled_print(100, 4, "*");
			}
      else 
      {
					oled_print(100, 4, " ");
      }
		}
		
#endif
  }
  /* USER CODE END 3 */
}


void RCC_delay_us(uint32_t udelay)
{

	uint32_t i=0;
	for(i=0;i<udelay;i++){
		__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
	}
}

static void HC_SR04_Start()
{
    /* output high level */
    HAL_GPIO_WritePin(TRIG_GPIO_Port, TRIG_Pin, GPIO_PIN_SET);
    
    /* maintain high level at least 10us */
    RCC_delay_us(10);
    
    /* resume low level */
    HAL_GPIO_WritePin(TRIG_GPIO_Port, TRIG_Pin, GPIO_PIN_RESET);
}

//return cm
double HC_SR04_Measure()
{
    uint32_t tick_us;
    
    
    HC_SR04_Start();
    
    __HAL_TIM_SetCounter(&htim2, 0);
    
    /* waitting for start of the high level through echo pin */
    while (HAL_GPIO_ReadPin(ECHO_GPIO_Port, ECHO_Pin) == GPIO_PIN_RESET);

    /* start the tim and enable the interrupt */
    HAL_TIM_Base_Start(&htim2);
    
    /* waitting for end of the high level through echo pin */
    while (HAL_GPIO_ReadPin(ECHO_GPIO_Port, ECHO_Pin) == GPIO_PIN_SET);
    
    /* stop the tim */
    HAL_TIM_Base_Stop(&htim2);
    
    /* get the time of high level */
    tick_us = __HAL_TIM_GetCounter(&htim2);
    
    /* calc distance in unit cm */
    double dis = (double)(tick_us/1000000.0) * 340.0 / 2.0 *100.0;
    
    return dis;
}

void Delay(__IO uint32_t nCount) {
  while(nCount--) {
  }
}

//oled display
void oled_print(uint8_t x, uint8_t y, char *str)
{
    OLED_ShowString(x,y,str,16);
}

5、部分参考资料

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

6、注意事项

#zigbee模块买的一家现成的模块,比较便宜十几块钱
#zigbee需要一个协调器和两个路由器
#原理图上画出了zigbee即cc2530的详细设计图
#oled上有车时,对应位置使用“*”指代
#主从机程序写到一个工程文件中了,使用宏定义进行区分

视频讲解B站地址

完整可运行项目地址(¥5.9)

或 点击下方"大饼匠人"卡片,关注回复"38"免费下载

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

技能梳理38@stm32+CC2530+超声波+光敏+oled 的相关文章

  • 在地址“0xXXXXXX”处中断,没有可用的调试信息,或在程序代码之外

    配置 使用 Nucleo L476RG 使用 GNU ARM Eclipse 我从 STM32CubeMX 生成了一个极简代码 我已经在我的板载 ST Link 中刷新了 J link 驱动程序 一直在尝试为我的代码运行调试器 但我的程序计
  • 在没有 IDE 的情况下如何使用 CMSIS?

    我正在使用 STM32F103C8T6 并想使用 CMSIS 这本质上只是寄存器定义 没有代码 让我的生活更轻松 同时仍保持在较低水平 问题是我不知道如何安装该库以便在命令行上使用 Makefile 使用 所有文档似乎都与特定于供应商的 I
  • 137-基于stm32单片机智能保温杯控制装置Proteus仿真+源程序

    资料编号 137 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DS18B20传感器 电机 制作一个基于stm32单片机智能保温杯控制装置Proteus仿真 2 通过DS18b20传感器检测当前保温杯水的温度 并且
  • Push_back() 导致程序在进入 main() 之前停止

    我正在为我的 STM32F3 Discovery 板使用 C 进行开发 并使用 std deque 作为队列 在尝试调试我的代码 直接在带有 ST link 的设备上或在模拟器中 后 代码最终在 main 中输入我的代码之前在断点处停止 然
  • STM32F103

    提示 来源正点原子 参考STM32F103 战舰开发指南V1 3PDF资料 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 开发环境硬件普中科技 接线图在g
  • VS Code 有没有办法导入 Makefile 项目?

    正如标题所说 我可以从现有的 Makefile 自动填充 c cpp properties json 吗 Edit 对于其他尝试导入 makefile 的人 我找到了一组脚本 它们完全可以实现我想要实现的目标 即通过 VS Code 管理
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 擦除后无法写入闪存

    所以我不能在擦除后直接写入内部闪存 如果写操作之前没有擦除操作 那么我可以 有什么想法吗 编程函数返回 成功写入 值 但查看内存时 没有写入任何数据 这是代码 uint32 t pageAddress 0x08008000 uint16 t
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • STM32F207 I2C 测试失败

    我正在使用 STM32F207 微控制器在 STM3220G EVAL 板上学习嵌入式开发 我尝试通过连接同一芯片上的两个 I2C2 和 I2C3 模块并发送 接收字符来测试 I2C 接口 这是我当前编写的代码 使用 mdk arm 5 i
  • for循环延时时间计算

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 之前做led点亮的实验 好像是被delay函数影响了 因为delay参数设置的不对
  • 库函数点亮Led

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 例如 随着人工智能的不断发展 机器学习这门
  • STM32H5 Nucleo-144 board开箱

    文章目录 开发板资料下载 目标 点亮LD1 绿 LD2 黄 和LD3 红 三个LED灯 开箱过程 博主使用的是STM32CubeMX配置生成代码 具体操作如下 打开STM32CubeMX File gt New project 选择开发板型
  • 特殊寄存器

    特殊寄存器 文章目录 前言 一 背景 二 2 1 2 2 总结 前言 前期疑问 STM32特殊寄存器到底是什么 特殊寄存器怎么查看和调试代码 本文目标 记录和理解特殊寄存器 一 背景 最近在看ucosIII文章是 里面提到特殊寄存器 这就进
  • systick定时器

    systick定时器 文章目录 前言 一 前期疑惑 二 解答 1 关于systick是阻塞的吗 2 非阻塞 三 软件编写 总结 前言 这边记录systick相关知识点 一 前期疑惑 在学习systick志气啊 其实对于systick还是一脸
  • 从没有中断引脚并且在测量准备好之前需要一些时间的传感器读取数据的最佳方法

    我正在尝试将压力传感器 MS5803 14BA 与我的板 NUCLEO STM32L073RZ 连接 根据 第 3 页 压力传感器需要几毫秒才能准备好读取测量值 对于我的项目 我对需要大约 10 毫秒来转换原始数据的最高分辨率感兴趣 不幸的
  • STM32 上的 ADC 单次转换

    我正在研究 STM32 F103x 上的 ADC 编程 并从最简单的情况 单次转换开始 测量内部温度传感器 连接到 ADC1 的值 并使用 USART 将其发送到 COM 端口 目标似乎很明确 但是当我尝试将源代码下载到闪存时 它不会向 C
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015

随机推荐

  • 第44章 MPU6050传感器—姿态检测—零死角玩转STM32-F429系列

    第44章 MPU6050传感器 姿态检测 全套 200 集视频教程和 1000 页 PDF 教程请到秉火论坛下载 xff1a www firebbs cn 野火视频教程优酷观看网址 xff1a http i youku com firege
  • 通过哪些性能参数选择手持式激光扫描仪?

    选择手持式激光扫描仪 激光主动成像系统有诸多优点 xff0c 譬如抗干扰性强 xff0c 能很好地适应不同的测量现场 xff0c 但是它的图像会受到散斑噪声和其他一些高斯噪声的影响 如图1所示 xff0c 分别用红 蓝激光扫描点距0 1mm
  • 函数使用笔记——ShellExecute

    函数使用笔记 ShellExecute API函数 ShellExecute的功能是运行一个外部程序 xff08 或者是打开一个已注册的文件 打开一个目录 打印一个文件等等 xff09 xff0c 并对外部程序有一定的控制 有几个API函数
  • 使用Selenium和Chrome浏览器获取诗词网站搜索结果

    在进行信息检索时 xff0c 我们通常会使用搜索引擎来查找相关的文章 图片 音乐等资源 而在特定的领域中 xff0c 也有一些针对特定内容的搜索引擎或网站 xff0c 比如古诗文网 诗词库等 在本篇博客中 xff0c 我们将介绍如何使用Py
  • 使用Selenium和Chrome浏览器获取图片网站搜索结果

    在进行信息检索时 xff0c 我们通常会使用搜索引擎来查找相关的文章 图片 音乐等资源 而在特定的领域中 xff0c 也有一些针对特定内容的搜索引擎或网站 xff0c 比如百度图片 Pixabay等 在本篇博客中 xff0c 我们将介绍如何
  • 使用python定时抓取个人邮箱数据(通过邮件数量判断)

    在进行信息收集时 xff0c 我们通常会使用电子邮件来接收最新的消息 文档 数据等资源 而在特定场景下 xff0c 也有一些需要自动化获取和处理邮件数据的需求 在本篇博客中 xff0c 我们将介绍如何使用Python的imaplib库连接到
  • 使用Python从邮件中下载附件和提取元数据

    在本篇博客中 xff0c 我们将解析一段Python代码 xff0c 该代码可以从电子邮件中下载附件并提取发送人 主题和日期等元数据 这段代码包含两个函数 xff1a download file 和 get email title 其中 x
  • 使用python提取噪声信号中的有效信息

    本文算法的原始论文出处 xff1a Algorithms Free Full Text An Efficient Algorithm for Automatic Peak Detection in Noisy Periodic and Qu
  • 射频信号对喇叭的影响

    这个问题是在测试能控器中发现的 当时测试时 xff0c 示波器偶尔会发出声音 xff0c 声音有大有小 xff0c 频率还不一样 xff0c 当时测试环境中还有衰减器 xff0c 用手捂住衰减器 xff0c 声音会变小 xff0c 一度以为
  • Code Composer Studio的配置及下载事项

    SDK版本 xff1a SIMPLELINK CC13X2 26X2 SDK v5 20 0 52 适用场景 xff1a 首次将工程文件配置到本地时 xff1b 有bim工程 oad工程 协处理器程序多个部分混杂 xff1b 异常问题 xf
  • 《无线神经调节的微创技术治疗慢性顽固性疼痛:初步观察报告》

    全文概况 xff1a 该文件讨论了一种新型无线和微创神经调节设备 xff0c 用于治疗之前曾经失败的患者慢性顽固性疼痛 该设备通过经皮植入的电极远程控制 xff0c 进行高频背根节神经刺激或周围神经刺激 该系统对于患有腰腿疼痛的患者有重要潜
  • 第27章 LTDC/DMA2D—液晶显示

    本章参考资料 xff1a STM32F76xxx参考手册 2 STM32F7xx 规格书 库帮助文档 STM32F779xx User Manual chm 关于开发板配套的液晶屏参数可查阅 5 0寸液晶屏数据手册 配套资料获知 27 1
  • GB 9706.1-2020 医用电气设备第1部分:基本安全和基本性能的通用要求-1

    这是份什么文件 这是一份中华人民共和国国家标准 xff0c 具体为GB9706 1 2020 xff0c 标准适用于医用电气设备 xff0c 并规定了医用电气设备基本安全和基本性能的通用要求 主要涵盖了医疗电器设备与患者接触的各种要求 xf
  • 关于图床使用

    安装windows终端 Windows 终端安装 Microsoft Learn 安装oh my posh 安装scoop xff08 后续都使用PowerShell 7 2 10 xff09 xff1a gt Set ExecutionP
  • 关于pyqt的一些用法

    QT原生是C 43 43 xff0c pyqt基于python语言 关于插件 xff1a 安装一个PyUIC xff0c 一个Qt Designer 点击Qt Designer可以出来ui配置页面 xff0c 和qt原生IDE基本一样 上面
  • python从单独的文件中获取配置信息

    可以新建一个configure json文件 xff0c 里面放置json格式的字符串 比如 xff1a deviceMAC1 12412421413 deviceMAC 12413232 name 123123 使用下述程序即可获取jso
  • 解决串口工具串口号改变的问题(借助python和ch344/8)

    串口工具一般在插不同usb口的时候 xff0c 识别出来的串口号不一致 xff0c pl2303可以固定 xff0c 但是更换电脑后也会变化 xff0c 可以借助沁恒家的一款串口一转多的工具 xff0c ch344或ch348 xff0c
  • python将监听到的串口信息实时保存到日志

    尽量在一个单独的线程中运行 stim thread span class token operator 61 span threading span class token punctuation span Thread span clas
  • 技能梳理37@stm32+按键+光耦+锁存+串行转并行+继电器

    技能梳理37 64 stm32 43 按键 43 光耦 43 锁存 43 串行转并行 43 继电器 1 项目简介 2 实现逻辑 3 应用场景 主从机有线控制 开关操作 4 核心代码梳理 span class token comment 根据
  • 技能梳理38@stm32+CC2530+超声波+光敏+oled

    技能梳理38 64 stm32 43 CC2530 43 超声波 43 光敏 43 oled 1 项目简介 2 实现逻辑 主从机使用zigbee通信 主机oled显示当前停车场位置图 从机通过超声波和光敏一起检测是否有车 当某位置车辆进出