433、315通信、ev1527、2262编码

目录

  • ASK介绍
  • EV1527编码芯片介绍
  • 模块介绍
  • 无线发射芯片
  • 无线接收芯片
  • 解码程序
  • 发射电路原理图

ASK介绍

ASK是幅移键控,通过调幅将数据发送出去,所以发送与接收都是多位二进制数。

ASK如何区分0和1?

0:发送 433.92Mhz 无线波形(载波频率)振幅低
1:发送 433.92Mhz 无线波形(载波频率)振幅高

OOK 如何区分 0 和 1?(OOK 是 ASK 的一种特殊形式)
0:不发送数据(振幅为0)
1:发送 433.92Mhz 无线波形(载波频率)

EV1527编码芯片介绍

编码芯片是硬件编码,MCU是软件编码,都是输出数据到无线发射芯片
20个位元,可组成不同的编码
4个按键输入,最多可组合15个按键
内含振荡电路,无需外接晶振,通过外接电阻的阻值选择振荡频率
图片中LCK应该是CLK
1
24个二进制才算一个完整的数据帧,前20位是地址或者叫ID,后4位是按键数据
一次完整的输出需要先输出同步信号,再输出一个数据帧
同步起始信号是4个CLK时间的高电平+124CLK时间的低电平
信号1是12个CLK的高电平+4个CLK的低电平
信号0是4个CLK的高电平+12个CLK的低电平
网上关于CLK的时间均不同,但是应当满足高低电平的比值,具体时间根据容错率决定

模块介绍

模块
遥控器发射,右边接收模块。
遥控器里有发射芯片,功能是编码加按键
接收模块有接收芯片和MCU,二者之间通过某引脚通信,MCU输出各路开关信号,此模块有学习功能,将遥控器的键值存储在MCU中

重点:

  • 编码格式:ev1527或其他
  • 发射频率:由晶振频率决定,具体看数据手册

这种键值是没有加密的,传送的都是明文,所以保密性不高,通常用于遥控开关,家具等。当用到安全比较高的场合,这种编码就不可靠了。往往针对这些,我们需要用到其他编码以及数据组合形式。例如曼切斯特编码,has,xxtea,aes等加密方式进行通信。

无线发射芯片

WS4460 是一款集成编码器的真正单晶圆全新一代 OOK 发射 SOC 芯片,可完全兼容 1527 编码产品,支持常用的 315Mhz/433.92Mhz 频率,拥有 4 个独立按键和 6 个组合按键。另外,有一些12路遥控器是通过MCU编码,无线发射芯片调制后发射。按键比较少的遥控器用的是集成IO的无线发射芯片。

编码+无线发射

无线接收芯片

WS490H 是一款高集成度、低功耗的单片 ASK/OOK 射频接收芯片。自动接收并解调信号,通过DO引脚与MCU通信。由MCU解码二进制数据,并输出各路开关量。有些模块上MCU有解码程序,并带学习功能,即将遥控器按键码值存储到MCU中。

编码+无线接收
1

解码程序

EV1527.c

/*** @file EV1527.c* @author cyWu (1917507415@qq.com)* @brief EV1527解码框架,定时器中断的方式解码,使用80us的定时器,直接放中断服务函数就可以,适用于所有单片机。* @version 0.1* @date 2024-03-28* @copyright Copyright (c) 2024* */
#include "EV1527.h"// 定时周期
#define TIME_CYCLE 80// 定义引导码的最小和最大持续时间(单位:us)
#define MIN_LEAD_CODE (5600 / TIME_CYCLE)
#define MAX_LEAD_CODE (16000 / TIME_CYCLE)// 定义数据位持续时间的最小和最大范围(单位:us)
#define MIN_BIT_DURATION (80 / TIME_CYCLE)
#define MAX_BIT_DURATION (2400 / TIME_CYCLE)// 定义功能字节在接收缓冲区中的索引位置
#define FUNCTION_BYTE_INDEX 2// 定义功能值
#define FUNCTION_1 0x08
#define FUNCTION_2 0x04
#define FUNCTION_3 0x02// 定义数据解码状态枚举
typedef enum
{LEAD_CODE,       // 引导码状态HIGH_BIT,        // 高位数据位状态LOW_BIT,         // 低位数据位状态DATA_PROCESS,    // 数据处理状态FUNCTION_PROCESS // 功能处理状态
} Decode_State_t;// 定义全局变量和缓冲区
static uint32_t Lead_Code_Count = 0;               // 引导码计数
static uint32_t High_Bit_Count = 0;                // 高位数据位计数
static uint32_t Low_Bit_Count = 0;                 // 低位数据位计数
static uint32_t High_Bit_Duration = 0;             // 高位数据位持续时间
static uint32_t Low_Bit_Duration = 0;              // 低位数据位持续时间
static uint8_t Received_Buffer[ARRAY_SIZE] = {0};  // 接收数据缓冲区
static uint8_t lastDataArray[ARRAY_SIZE] = {0};    // 上一次接收数据缓冲区
static uint8_t Received_Byte_Count = 0;            // 接收数据字节计数
static uint8_t consecutiveEqualCount = 0;          // 数据接收相同计数
static uint8_t Bit_Count = 0;                      // 接收数据位计数
static uint8_t Received_Data = 0;                  // 接收到的数据
static Decode_State_t RF_Decode_State = LEAD_CODE; // 数据解码状态void Decode_Data(void);
void Execute_Function(void);
void Reset_Decode_Parameters(void);/**----------------------------------------------------------------------------------------------****函数名  :EV1527端口配置**功能说明:初始化IO口,不同单片机的配置输入模式不一样,自行修改。**----------------------------------------------------------------------------------------------**/
void EV1527_Init(void)
{DATA_433_GPIO_CLK_ENABLE();GPIO_InitTypeDef GPIO_InitStruct;// 配置上拉输入GPIO_InitStruct.Pin = DATA_433_PIN;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;HAL_GPIO_Init(DATA_433_GPIO_PORT, &GPIO_InitStruct);
}/**----------------------------------------------------------------------------------------------****函数名  :RF信号解码函数**功能说明:解码从433MHz接收到的信号,并根据解码结果执行相应功能**调用说明:80us调用一次**----------------------------------------------------------------------------------------------**/
void RF_Signal_Decode(void)
{switch (RF_Decode_State){case LEAD_CODE: // 引导码// 判断是否低电平if (HAL_GPIO_ReadPin(DATA_433_GPIO_PORT, DATA_433_PIN) == GPIO_PIN_RESET){Lead_Code_Count++;}else // 高电平判断范围{// 判断引导码范围是否合法if (Lead_Code_Count >= MIN_LEAD_CODE && Lead_Code_Count <= MAX_LEAD_CODE){Lead_Code_Count = 0;Reset_Decode_Parameters();  // 重置解码参数RF_Decode_State = HIGH_BIT; // 进入高位数据位判断状态}else{Reset_Decode_Parameters(); // 引导码范围不合法,重置解码参数}}break;case HIGH_BIT:// 判断是否高电平if (HAL_GPIO_ReadPin(DATA_433_GPIO_PORT, DATA_433_PIN) == GPIO_PIN_SET){High_Bit_Count++;}else // 低电平判断范围{// 判断高位数据位范围是否合法if (High_Bit_Count >= MIN_BIT_DURATION && High_Bit_Count <= MAX_BIT_DURATION){High_Bit_Duration = High_Bit_Count; // 保存计数值,用于区分0和1High_Bit_Count = 0;RF_Decode_State = LOW_BIT; // 进入低位数据位判断状态}else{Reset_Decode_Parameters(); // 高位数据位范围不合法,重置解码参数}}break;case LOW_BIT:// 判断是否低电平if (HAL_GPIO_ReadPin(DATA_433_GPIO_PORT, DATA_433_PIN) == GPIO_PIN_RESET){Low_Bit_Count++;}else // 高电平判断范围{// 判断低位数据位范围是否合法if (Low_Bit_Count >= MIN_BIT_DURATION && Low_Bit_Count <= MAX_BIT_DURATION){Low_Bit_Duration = Low_Bit_Count; // 保存计数值,用于区分0和1Low_Bit_Count = 0;RF_Decode_State = DATA_PROCESS; // 进入数据处理状态}else{Reset_Decode_Parameters(); // 低位数据位范围不合法,重置解码参数}}break;case DATA_PROCESS:Decode_Data(); // 解码数据if (Received_Byte_Count == 3){// 接收到全部数据,包括地址和数据RF_Decode_State = FUNCTION_PROCESS;  }else{                               // 数据没接收完RF_Decode_State = HIGH_BIT; // 继续解码数据}break;case FUNCTION_PROCESS:Execute_Function();        // 执行功能Reset_Decode_Parameters(); // 重置解码参数break;default:Reset_Decode_Parameters(); // 默认状态,重置解码参数break;}
}/**----------------------------------------------------------------------------------------------****函数名  :Reset_Decode_Parameters**功能说明:重置解码参数,用于开始新的解码周期**----------------------------------------------------------------------------------------------**/
void Reset_Decode_Parameters(void)
{Bit_Count = 0;Received_Data = 0x00;Received_Byte_Count = 0;Lead_Code_Count = 0;High_Bit_Count = 0;Low_Bit_Count = 0;High_Bit_Duration = 0;Low_Bit_Duration = 0;RF_Decode_State = LEAD_CODE;
}/**----------------------------------------------------------------------------------------------****函数名  :Decode_Data**功能说明:解码数据位,将解码后的数据存入相应的缓冲区中**----------------------------------------------------------------------------------------------**/
void Decode_Data(void)
{Received_Data <<= 1;// 根据高低电平持续时间判断0和1,然后将数据移位存入缓冲区if (High_Bit_Duration > Low_Bit_Duration){Received_Data |= 0x01;}else{Received_Data &= 0xFE;}Bit_Count++;// 每接收8位数据,存入数据数组if (Bit_Count == 8){Received_Buffer[Received_Byte_Count] = Received_Data;Received_Data = 0x00;Bit_Count = 0;Received_Byte_Count++;}
}/**----------------------------------------------------------------------------------------------****函数名  :Execute_Function**功能说明:执行功能,根据解码后的数据进行相应操作**----------------------------------------------------------------------------------------------**/
void Execute_Function(void)
{// 判断解码后的功能字节,并执行相应操作switch (Received_Buffer[FUNCTION_BYTE_INDEX]){case FUNCTION_1:// 执行功能1break;case FUNCTION_2:// 执行功能2break;case FUNCTION_3:// 执行功能3break;default:// 默认操作break;}
}

EV1527.h

/*** @file EV1527.h* @author cyWu (1917507415@qq.com)* @brief EV1527解码框架* @version 0.1* @date 2024-03-28* @copyright Copyright (c) 2024**/#ifndef __EV1527_H
#define __EV1527_H#include "main.h"
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdbool.h>/*********433 DATA GPIO**********/
// 433数据输入
#define DATA_433_PIN GPIO_PIN_7
#define DATA_433_GPIO_PORT GPIOA
#define DATA_433_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE();
/*******************************/void EV1527_Init(void);
void RF_Signal_Decode(void);#endif

发射电路原理图

组合按键需要二极管
1

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 5个数据容器

列表&#xff08;list&#xff09; 特点&#xff1a;可以被修改 列表的定义 定义空列表&#xff1a; 变量名 [] 或 变量名 list() 定义变量&#xff1a; 变量名 [元素1&#xff0c;元素2&#xff0c;元素3&#xff0c;... ] 取出列表元素 列表名 [下标索引] 从前向…

复习数据库(约束)上篇

目录 约束的分类 分类 注意 主键约束 添加主键约束 1 建表时&#xff0c;添加 1.1创建表&#xff1a;定义列时指定 1.2 创建表&#xff1a;定义列之后独立指定主键&#xff1a; 2 建表后使用alter 关键字添加 删除约束 在主键添加自动增长属性 疑问 1 建表时添加 …

国内短剧源码短剧系统搭建小程序部署H5、APP打造短剧平台

​在当今的互联网时代&#xff0c;短剧作为一种新兴的娱乐形式&#xff0c;受到了越来越多用户的喜爱。为了提供更好的用户体验和满足用户需求&#xff0c;一个好的短剧系统需要具备多元化的功能和优质的界面设计。 本文将介绍国内短剧源码短剧系统搭建小程序部署H5、APP所需的…

Python(数据结构2)

常见数据结构 队列 队列(Queue)&#xff0c;它是一种运算受限的线性表,先进先出(FIFO First In First Out) Python标准库中的queue模块提供了多种队列实现&#xff0c;包括普通队列、双端队列、优先队列等。 1 普通队列 queue.Queue 是 Python 标准库 queue 模块中的一个类…

QT 机器视觉 (3. 虚拟相机SDK、测试工具)

本专栏从实际需求场景出发详细还原、分别介绍大型工业化场景、专业实验室场景、自动化生产线场景、各种视觉检测物体场景介绍本专栏应用场景 更适合涉及到视觉相关工作者、包括但不限于一线操作人员、现场实施人员、项目相关维护人员&#xff0c;希望了解2D、3D相机视觉相关操作…

QT打包Macosx应用发布App Store简易流程

1、QC里编译工程&#xff0c;生成Release版的的app文件&#xff1b; 2、运行macdeployqt把需要的文件打包进app文件中&#xff1b; % ~/Qt/5.15.0/clang_64/bin/macdeployqt {编译的app文件所在路径}/Release/xxxx.app 3、使用codesign对app进行签名&#xff0c;如果要发App…

Android平台RTSP转RTMP推送之采集麦克风音频转发

技术背景 RTSP转RTMP推送&#xff0c;好多开发者第一想到的是采用ffmpeg命令行的形式&#xff0c;如果对ffmpeg比较熟&#xff0c;而且产品不要额外的定制和更高阶的要求&#xff0c;未尝不可&#xff0c;如果对产品稳定性、时延、断网重连等有更高的技术诉求&#xff0c;比较…

网络:ARP的具体过程和ARP欺骗

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言ARP具体过程ARP欺骗原理总结 前言 本文仅作为ARP具体过程和ARP欺骗的知识总结 硬件类型 &#xff1a;指定发送和接受ARP包的硬件类型&am…

单链表OJ题(3):合并两个有序链表、链表分割、链表的回文结构

目录 一、合并两个有序链表 二、链表分割 三、链表的回文结构 u解题的总体思路&#xff1a; 合并两个有序链表&#xff1a;首先创建新链表的头节点&#xff08;哨兵位&#xff1a;本质上是占位子&#xff09;&#xff0c;为了减少一些判断情况&#xff0c;简化操作。然后我们…

整理 【 DBeaver 数据库管理工具 】的一些基础使用

目录 连接设置切换工作空间SQL编辑器&#xff08;写sql语句&#xff09;打开方式新建查询&#xff08;sql编辑器&#xff09;打开写的 sql 查询&#xff08;项目浏览器&#xff09; 备份sql文件查看历史执行语句自动保存sql语句的文件&#xff08;编辑器&#xff09;关闭自动生…

Android Studio 依赖仓库地址

在Android Studio进行开发时&#xff0c;会遇到依赖库下载慢或者老项目使用的依赖库找不到的问题&#xff0c;折腾了两天&#xff0c;终于找到解决方法&#xff0c;使用 阿里云云效Maven&#xff0c;地址&#xff1a;仓库服务https://developer.aliyun.com/mvn/guide &#xff…

51单片机教程(五)- LED灯闪烁

1 项目分析 让输入/输出口的P1.0或P1.0~P1.7连接的LED灯闪烁。 2 技术准备 1、C语言知识点 1 运算符 1 算术运算符 #include <stdio.h>int main(){// 算术运算符int a 13;int b 6;printf("%d\n", ab); printf("%d\n", a-b); printf("%…

MySQL日志——针对实习面试

目录 MySQL日志MySQL有哪些日志&#xff1f;请解释一下MySQL的二进制日志&#xff08;Binlog&#xff09;的作用&#xff1f;复制&#xff08;Replication&#xff09;数据恢复&#xff08;Point-in-Time Recovery&#xff09; Binlog日志的三种格式是什么&#xff1f;如何使用…

STM32 HAL库 SPI驱动1.3寸 OLED屏幕

目录 参考硬件引脚与接线 点亮屏幕CubeMX 配置OLED 驱动程序代码 参考 基于STM32F103C8T6最小系统板HAL库CubeMX SPI驱动7针 OLED显示屏&#xff08;0.96寸 1.3寸通用&#xff09;0.96 oled HAL库驱动 SPI STM32SPI驱动0.96/1.3寸 OLED屏幕&#xff0c;易修改为DMA控制STM32驱…

qt QStatusBar详解

1、概述 QStatusBar是Qt框架提供的一个小部件&#xff0c;用于在应用程序窗口底部显示状态信息。它可以显示一些固定的文本和图标&#xff0c;并且可以通过API动态更新显示内容。QStatusBar通常是一个水平的窗口部件&#xff0c;能够显示多行文本内容&#xff0c;非常适合用于…

h5st参数解析

前言 之前4.8卡我&#xff0c;感觉过了&#xff0c;但是又好像失败了&#xff0c;所以这篇博客憋着没写&#xff0c;这次再次搞了一下&#xff0c;这次弄起来感觉挺简单的啊。 分析 1 20241102203105966; 2 fhhv55ehre91k4l8; 3 f06cc; 4 tk03w…

clickhouse运维篇(二):多机器手动部署ck集群

熟悉流程并且有真正部署需求可以看一下我的另一篇简化部署的文章&#xff0c;因为多节点配置还是比较麻烦的先要jdk、zookeeper&#xff0c;再ck&#xff0c;还有各种配置文件登录不同机器上手动改配置文件还挺容易出错的。 clickhouse运维篇&#xff08;三&#xff09;&#x…

导航栏小案例

实现类似于这样的效果 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>导航栏</title><style>*{margin: 0;padding: 0;}.div1{width: 100%;height: 60px;/* border: 1px solid blue; */background-color:rgb(…

ASP .NET CORE 6 在项目中集成WatchDog开源项目

概念 WatchDog是一个开源的项目&#xff0c;可以实现对.Net 应用程序和API实现实时应用日志和性能监控平台。可以实现实时记录和查看应用程序中的消息、事件、HTTP请求和响应&#xff0c;以及运行时捕获的异常&#xff0c;有效帮助开发人员去排查应用异常&#xff0c;提升开发效…

四、k8s快速入门之Kubernetes资源清单

kubernetes中的资源 ⭐️ k8s中所有的内容都抽象为资源&#xff0c;资源实列化之后&#xff0c;叫做对象 1️⃣名称空间级别 ⭐️ kubeadm在执行k8s的pod的时候会在kube-system这个名称空间下执行&#xff0c;所以说当你kubectl get pod 的时候是查看不到的查看的是默认的po…