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

news2025/4/5 16:12:02

技能梳理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)

或 点击下方卡片,关注回复"停车场"免费下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/501278.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UWA Pipeline 2.4.2 版本更新说明

UWA Pipeline是一款面向游戏开发团队的本地协作平台&#xff0c;旨在为游戏开发团队搭建专属的DevOps研发交付流水线&#xff0c;提供可视化的CICD操作界面、高可用的自动化测试以及UWA性能保障服务的无缝贴合等实用功能。 在本次2.4.2版本更新中&#xff0c;我们对Pipeline的…

【Java+GS】GeoServer,通过配置自定义样式,实现不同图斑展示不同颜色。附java实现方法

文章目录 客户端发布样式一、[GeoServer中使用SLD样式](https://www.cnblogs.com/tuboshu/p/10752292.html)二、分属性渲染三、客户端操作发布图层 掌握使用java api 发布样式一、前置准备二、发布图层三、发布工具类 设计从数据库字段自定义样式一、数据库设计二、业务逻辑分享…

「容器云架构」K8s 多区域部署介绍

背景 Kubernetes的设计使得单个Kubernetes集群可以跨多个故障区域multiple failure zones运行&#xff0c;通常这些区域&#xff08;zones &#xff09;位于称为区域&#xff08;region&#xff09;的逻辑分组中。主要的云提供商将一个区域定义为一组故障区域 failure zones&am…

Linux高性能服务器编程|阅读笔记:第7章 - Linux服务器程序规范

目录 简介系列笔记7.1 日志7.1.1 Linux系统日志7.1.2 syslog函数7.2 用户信息7.2.1 UID、EUID、GID和EGID7.2.2 切换用户7.3 进程间关系7.3.1 进程组7.3.2 会话7.3.3 用ps命令查看进程关系7.4 系统资源限制7.5 改变工作目录和根目录7.6 服务器程序后台化结语简介 Hello! 非常感…

基于html+css的图展示50

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

【UE】高级载具插件-02-坦克开火

1. 添加开火的操作映射 2. 创建一个actor蓝图类&#xff0c;添加一个静态网格体组件 添加发射物移动组件 设置初始速度和最大速度 发射物重力范围设为0.05 添加音频组件 设置音效 3. 打开炮管的静态网格体 在插槽管理器中创建插槽 将创建的插槽放到炮口位置 4. 打开“BP_BaseT…

《物联网安全关键技术白皮书》解读

物联网技术作为物理世界与信息世界融合的具象体现&#xff0c;有效地连接分离的物理世界和信息空间&#xff0c;囊括了传感器网络、通信网络以及互联网&#xff0c;构建物与物互联、人与物互联、人与人互联的协同共生关系&#xff0c;推进了信息产业的新变革&#xff0c;同时也…

南大通用数据库-Gbase-8a-学习-35-rmt(远程导出数据文件)

目录 一、测试环境 二、引入 三、rmt导出流程 四、Linux环境模拟实验 1、不加rmt导出数据 2、加rmt导出数据 一、测试环境 名称值CPUIntel(R) Core(TM) i5-1035G1 CPU 1.00GHz操作系统CentOS Linux release 7.9.2009 (Core)内存3G逻辑核数2目的端Gbase8a版本8.6.2-R43源…

单词背诵 2023.5.8

preceding dawn sunset segregate restless oblige mature martial vital virtually

PHP+MYSQL——大学生心理健康测试网站源码

一、功能 前台功能&#xff1a; 1、心理百科、心理书籍、心理健康测试 2、用户注册、用户登录、重置密码、退出登录、个人信息修改 3、心理健康测试成绩查看、心理健康状态解决办法 4、预约心理咨询师、预约审批查看 5、留言板 后台功能&#xff1a; 1、后台登录、修改管理员…

【C++】1.语言基础:八股文

心口如一&#xff0c;犹不失为光明磊落丈夫之行也。——梁启超 文章目录 :smirk:1. 语言基础内存分配指针参数传递和引用参数传递四种强制转换面向对象的三大特性并举例#define 和别名 typedef 的区别 :blush:2. 标准库STL介绍频繁调⽤ push_back() 的影响i 和 i 的区别⼤端⼩…

ePWM模块(1)

ePWM模块 ePWM模块内部包含有7个子模块,分别是时间基准子模块TB、比较功能子模块CC,动作限定子模块AQ、死区控制子模块DB、斩波控制子模块PC、事件触发子模块ET和故障捕获子模块TZ。 每个ePWM模块都具有以下功能: 可以输出两路PWM,EPWMxA和EPWMxB两路PWM可以独立输出,也可…

数字座舱带动液晶仪表升级,哪些企业「领跑」前装量产份额

作为人机交互的关键一环&#xff0c;传统汽车机械仪表也在经历数字化、智能化的升级。尤其是整车智能化的升级、电动化的转型&#xff0c;传统仪表存在反应慢、精度低和显示方式单一的缺点&#xff0c;已经不能满足市场要求。 比如&#xff0c;相比于传统机械式仪表&#xff0…

Qt5.9学习笔记-事件(五) 事件调试和排查

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的在读研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三…

vue+node.js高校青年志愿者管理系统

1&#xff0e;系统登录&#xff1a;系统登录是用户访问系统的路口&#xff0c;设计了系统登录界面&#xff0c;包括用户名、密码和验证码&#xff0c;然后对登录进来的用户判断身份信息&#xff0c;判断是管理员用户还是普通用户。 2&#xff0e;系统用户管理&#xff1a;不管是…

软件设计师内容记载

栈和队列 栈是按照 先进后出或者 后进先出&#xff0c;队列是先进先出 栈只能在栈顶进行插入和删除&#xff0c;栈底不动。 队列是在一端插入&#xff0c;一端删除。 允许插入的是队尾&#xff0c;允许删除的是队头。 循环队列&#xff1a; 队头 队尾&#xff1a;队尾指针指向的…

PXI 国产化测试系统中数据采集与分析软件的设计

数据采集与分析系统需求分析和总体设计 数据采集与分析系统是 PXI 测试系统的上位机软件子系统&#xff0c;在系统中有着重 要的作用。本章将首先简要介绍 PXI 测试系统&#xff0c;分析其整体结构与功能&#xff0c;说明数 据分析系统与 PXI 测试系统的关系&#xff…

每天一道算法练习题--Day25 第一章 --算法专题 --- ----------单调栈

单调栈 栈是什么&#xff1f;栈的常用操作栈的常用操作时间复杂度应用及题目推荐 单调栈又是什么&#xff1f;适用场景伪代码代码题目推荐 总结 顾名思义&#xff0c; 单调栈是一种栈。因此要学单调栈&#xff0c;首先要彻底搞懂栈。 栈是什么&#xff1f; 栈是一种受限的数据…

国产安全芯片,请关注他们!

一、华大电子 http://www.hed.com.cn/ 1.1 公司简介 北京中电华大电子设计有限责任公司 &#xff08;简称“华大电子”&#xff09;成立于2002年6月&#xff0c;是国家认定的高新技术企业&#xff0c;是国内最早的集成电路设计企业之一&#xff0c;是中国安全芯片产业的核心…

【ROS】如何让ROS中节点实现数据交换Ⅱ --服务通信

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法…感兴趣就关注我吧&#xff01;你定不会失望。 本章将介绍如何通过服务通信的方式实现节点数据交换以及ROS相关指令 本章将介绍如何通过服务通信的方式实现节点数据交换以及ROS相关指令…