433M无线收发模块详解
2024/12/3 4:03:07
本文主要是介绍433M无线收发模块详解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
无线通信技术在现代社会中扮演着至关重要的角色,它让我们能够实现便捷的远程控制、智能家居、自动化以及各种物联网应用。无线通信技术包括 WiFi、蓝牙、NFC、Zigbee、5G 等等。
本次我要给大家介绍无线通信技术之一的 433M,从基本概念到工作原理再到实际应用。我们将逐步剖析 433M 模块背后的技术细节。无论您是初学者还是有一定经验的开发者,这篇文章都将为您提供全面的指导和启发,帮助您更好地了解和应用 433M 模块。
1. 源码下载及前置阅读
本文首发 良许嵌入式网 :https://www.lxlinux.net/e/ ,欢迎关注!
本文所涉及的源码及安装包如下(由于平台限制,请点击以下链接阅读原文下载):
https://www.lxlinux.net/e/stm32/433m-tutorial.html
超全的嵌入式入门教程,欢迎小白。
- 手把手让你掌握MDK的使用方式和技巧,助你更高效地进行开发:【一文教你使用MDK开发工具:https://www.lxlinux.net/e/stm32/mdk-development-tool-tutorial.html】
- 使用接收中断+超时判断完成不定长数据的接收:【STM32串口接收不定长数据(空闲中断+DMA):https://www.lxlinux.net/e/stm32/stm32-usart-receive-data-using-idle-dma.html】
- 通俗易懂的 GPIO 介绍与实践:【如何快速成为点灯大师?:https://www.lxlinux.net/e/stm32/stm32-gpio-hal.html】
往期精彩教程,有兴趣的小伙伴可以看看。
-
ESP8266详解,助你成为物联网应用的专家:【手把手教你玩转ESP8266(原理+驱动):https://www.lxlinux.net/e/stm32/esp8266-tutorial.html】
-
简单好用,为你的智能语音项目提供核心支持:【SU-03T语音控制模块详解:https://www.lxlinux.net/e/stm32/SU-03T-tutorial.html】
-
如果想知道自己对嵌入式知识掌握程度:【嵌入式自测题:https://www.lxlinux.net/e/stm32/embedded-self-test.html】
作者简介 |
---|
大家好,我是良许,博客里所有的文章皆为我的原创。 下面是我的一些个人介绍,欢迎交个朋友: · 211工科硕士,国家奖学金获得者; · 深耕嵌入式11年,前世界500强外企高级嵌入式工程师; · 书籍《速学Linux作者》,机械工业出版社专家委员会成员; · 全网60W粉丝,博客分享大量原创成体系文章,全网阅读量累计超4000万; · 靠自媒体连续年入百万,靠自己买房买车。 |
我本科及硕士都是学机械,通过自学成功进入世界500强外企。我已经将自己的学习经验写成了一本电子书,超千人通过此书学习并转行成功。现在将这本电子书免费分享给大家,希望对你们有帮助:
电子书链接:https://www.lxlinux.net/1024.html
2. 433M无线收发模块介绍
无线收发模块 433MHz(或称RF433射频小模块)采用高频射频技术,并结合了全数字技术和 AVR 单片机,成为一种微型收发器。它能够实现高速数据信号传输,并具备打包、检错和纠错处理的功能。
433M 模块采用工业级标准的部件,工作稳定可靠,体积小巧,安装方便。它在各个领域都有广泛的应用,包括安全报警系统、家庭生活、工业自动化、远程遥控以及无线数据传输等。其可靠性和稳定性使得它成为许多无线通信需求下的理想选择。
3. 型号介绍
首先我们知道遥控器上有四个按键,分别对应 433M 模块的四个数据位输出脚 D0、D1、D2、D3。按下按键发射信号,对应的引脚就会输出高电平。
那么,433M 模块一般按照工作模式分类,有三种工作模式:
- M 点动:瞬态输出,相当于自复位开关的状态收到信息输出高电平,无信号时为低电平。
- T 锁存:上电时为低,收到信号输出高电平并锁定高,再次收到信号输出低并锁定低。
- L 自锁:上电时为低,收到信号输出高电平并锁定高,同时将其他输出置低。
比如我的模块是 M4 点动,「4」表示有4个按键,按一下按键 A,D0 将输出一个高电平。
大家购买的时候要看清楚啦,选择合适的工作模式的 433M 模块哦,它们长的都一样,但是工作模式是不能改的。
温馨小贴士:
- 天线对模块的接收效果影响很大,最好接 1/4 波长的天线,一般采用 50 欧姆单芯导线,433M 的天线的长度约为 17 cm
- 天线位置对模块接收效果有影响,安装时,天线尽可能伸直,远离屏蔽体、高压及干扰源的地方。
4. 工作参数及引脚介绍
433M 模块工作参数:
- 工作电压:DC 5V
- 工作电流:4.5mA
- 工作温度:-10 ~ +70℃
- 工作频率:433MHz
遥控器工作参数:
- 工作电压:DC 12V
- 工作电流:10mA
- 发射频率:433MHz
- 调制方式:ASK
- 工作频率:433MHz
接线参考如下:
433M 模块 | STM32 | 说明 |
---|---|---|
GND | G | 接地 |
5V | 5V | 电源正极 |
D0 | 任意一个GPIO口 | 对应遥控器的A |
D1 | 任意一个GPIO口 | 对应遥控器的B |
D2 | 任意一个GPIO口 | 对应遥控器的C |
D3 | 任意一个GPIO口 | 对应遥控器的D |
VT | 任意一个GPIO口 | 输出状态提示,收到有效信号输出高电平 |
5. 编程实战
5.1 通信示意图
我们的实现目标是:遥控器按下A,红灯状态反转;按下B,黄灯状态反转;按下C,绿灯状态反转。
5.2 硬件连接
本教程使用的硬件如下:
- 单片机:STM32F103C8T6
- 433M 模块
- 小灯:三色 LED 灯模块
- 烧录器:ST-LINK V2
433M模块 | STM32 | LED |
---|---|---|
GND | G | |
5V | 5V | |
D0 | A1 | |
D1 | A2 | |
D2 | A3 | |
A5 | R | |
A6 | Y | |
A7 | G | |
G | GND |
烧录的时候接线如下表,如果不会烧录的话可以看我之前的文章【STM32下载程序的五种方法:https://www.lxlinux.net/e/stm32/five-ways-to-flash-program-to-stm32.html】。
ST-Link V2 | STM32 |
---|---|
SWCLK | SWCLK |
SWDIO | SWDIO |
GND | GND |
3.3V | 3V3 |
接好如下图:
开发板使用的是我们自绘的板子。大家也可以用自己的板子,只要是 STM32F103C8T6 主控芯片就行。
5.3 LED初始化
LED 灯的代码简简单单,只要进行一下三个灯的初始化就行。
void led_init(void) { GPIO_InitTypeDef gpio_init_struct; LED1_GPIO_CLK_ENABLE(); /* LED1时钟使能 */ LED2_GPIO_CLK_ENABLE(); /* LED2时钟使能 */ LED3_GPIO_CLK_ENABLE(); /* LED3时钟使能 */ gpio_init_struct.Pin = LED1_GPIO_PIN; /* LED1引脚 */ gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP; /* 推挽输出 */ gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */ gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */ HAL_GPIO_Init(LED1_GPIO_PORT, &gpio_init_struct); /* 初始化LED1引脚 */ gpio_init_struct.Pin = LED2_GPIO_PIN; /* LED2引脚 */ HAL_GPIO_Init(LED2_GPIO_PORT, &gpio_init_struct); /* 初始化LED2引脚 */ gpio_init_struct.Pin = LED3_GPIO_PIN; /* LED3引脚 */ HAL_GPIO_Init(LED3_GPIO_PORT, &gpio_init_struct); /* 初始化LED3引脚 */ LED1(0); /* 关闭 LED1 */ LED2(0); /* 关闭 LED2 */ LED3(0); /* 关闭 LED3 */ }
LED 的 .h文件:
#ifndef _LED_H #define _LED_H #include "sys.h" /******************************************************************************************/ /* 引脚 定义 */ #define LED1_GPIO_PORT GPIOA #define LED1_GPIO_PIN GPIO_PIN_5 #define LED1_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0) /* PA口时钟使能 */ #define LED2_GPIO_PORT GPIOA #define LED2_GPIO_PIN GPIO_PIN_6 #define LED2_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0) /* PA口时钟使能 */ #define LED3_GPIO_PORT GPIOA #define LED3_GPIO_PIN GPIO_PIN_7 #define LED3_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0) /* PA口时钟使能 */ /******************************************************************************************/ /* LED端口定义 */ #define LED1(x) do{ x ? \ HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_SET) : \ HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_RESET); \ }while(0) #define LED2(x) do{ x ? \ HAL_GPIO_WritePin(LED2_GPIO_PORT, LED2_GPIO_PIN, GPIO_PIN_SET) : \ HAL_GPIO_WritePin(LED2_GPIO_PORT, LED2_GPIO_PIN, GPIO_PIN_RESET); \ }while(0) #define LED3(x) do{ x ? \ HAL_GPIO_WritePin(LED3_GPIO_PORT, LED3_GPIO_PIN, GPIO_PIN_SET) : \ HAL_GPIO_WritePin(LED3_GPIO_PORT, LED3_GPIO_PIN, GPIO_PIN_RESET); \ }while(0) /* LED取反定义 */ #define LED1_TOGGLE() do{ HAL_GPIO_TogglePin(LED1_GPIO_PORT, LED1_GPIO_PIN); }while(0) /* 翻转LED1 */ #define LED2_TOGGLE() do{ HAL_GPIO_TogglePin(LED2_GPIO_PORT, LED2_GPIO_PIN); }while(0) /* 翻转LED2 */ #define LED3_TOGGLE() do{ HAL_GPIO_TogglePin(LED3_GPIO_PORT, LED3_GPIO_PIN); }while(0) /* 翻转LED3 */ /******************************************************************************************/ /* 外部接口函数*/ void led_init(void); /* LED初始化 */ #endif
5.4 433M模块代码
代码很简单,就是初始化三个引脚,PA1、PA2、PA3 分别对应 D0、D1、D2。
这次我们采用中断的方式,需要初始化和使能一下 EXTI。
void _433M_gpio_init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOA_CLK_ENABLE(); /*Configure GPIO pins : PA1 PA2 PA3 */ GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; //中断上升沿 GPIO_InitStruct.Pull = GPIO_NOPULL; //无电阻 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* EXTI interrupt init*/ HAL_NVIC_SetPriority(EXTI1_IRQn, 2, 0); /* 抢占2,子优先级0 */ HAL_NVIC_EnableIRQ(EXTI1_IRQn); HAL_NVIC_SetPriority(EXTI2_IRQn, 2, 0); HAL_NVIC_EnableIRQ(EXTI2_IRQn); HAL_NVIC_SetPriority(EXTI3_IRQn, 2, 0); HAL_NVIC_EnableIRQ(EXTI3_IRQn); }
5.5 中断服务函数
设计中断服务函数,调用中断处理公用函数。EXTI1、EXTI2、EXTI3 分别设计到 GPIO_PIN_1、GPIO_PIN_2、GPIO_PIN_3。
void EXTI1_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1); /* 调用中断处理公用函数 清除中断线 的中断标志位 */ __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_1); /* HAL库默认先清中断再处理回调,退出时再清一次中断,避免按键抖动误触发 */ } void EXTI2_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2); /* 调用中断处理公用函数 清除中断线 的中断标志位 */ __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_2); /* HAL库默认先清中断再处理回调,退出时再清一次中断,避免按键抖动误触发 */ } void EXTI3_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3); /* 调用中断处理公用函数 清除中断线 的中断标志位 */ __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_3); /* HAL库默认先清中断再处理回调,退出时再清一次中断,避免按键抖动误触发 */ }
5.6 LED控制
复写「HAL_GPIO_EXTI_Callback」函数,检测到中断上升沿,则表示按键被按下,翻转对应的 LED。
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { switch(GPIO_Pin) { case GPIO_PIN_1: if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_SET) { LED1_TOGGLE(); } break; case GPIO_PIN_2: if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2) == GPIO_PIN_SET) { LED2_TOGGLE(); } break; case GPIO_PIN_3: if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3) == GPIO_PIN_SET) { LED3_TOGGLE(); } break; } }
5.7 效果展示
遥控器按下A,红灯状态反转;按下B,黄灯状态反转;按下C,绿灯状态反转。
下图是按下A、B、C,三灯齐亮的效果。
6. 总结
随着物联网的快速发展和智能化需求的增加,无线通信技术将扮演越来越重要的角色。433M 模块作为一种低功耗、长距离传输的技术,具有广泛的应用前景。从遥控门禁到智能家居自动化,从环境监测到安防系统,433M 模块为各种应用场景带来了便捷和创新。希望本文能够给您带来小小的启发,并激发您在无线通信领域进一步探索和创造的热情。感谢各位看官, peace and love!
另外,想进大厂的同学,一定要好好学算法,这是面试必备的。这里准备了一份 BAT 大佬总结的 LeetCode 刷题宝典,很多人靠它们进了大厂。
刷题 | LeetCode算法刷题神器,看完 BAT 随你挑!
有收获?希望老铁们来个三连击,给更多的人看到这篇文章
推荐阅读:
- 程序员必备编程资料大全
- 程序员必备软件资源
欢迎关注我的博客:良许嵌入式教程网,满满都是干货!
这篇关于433M无线收发模块详解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-24怎么修改Kafka的JVM参数?-icode9专业技术文章分享
- 2024-12-23线下车企门店如何实现线上线下融合?
- 2024-12-23鸿蒙Next ArkTS编程规范总结
- 2024-12-23物流团队冬至高效运转,哪款办公软件可助力风险评估?
- 2024-12-23优化库存,提升效率:医药企业如何借助看板软件实现仓库智能化
- 2024-12-23项目管理零负担!轻量化看板工具如何助力团队协作
- 2024-12-23电商活动复盘,为何是团队成长的核心环节?
- 2024-12-23鸿蒙Next ArkTS高性能编程实战
- 2024-12-23数据驱动:电商复盘从基础到进阶!
- 2024-12-23从数据到客户:跨境电商如何通过销售跟踪工具提升营销精准度?