小爱智能音箱红外控制继电器

小爱智能音箱红外控制继电器

一、实物图

image

二、物料准备

1.小爱智能音箱万能遥控版(活动价¥99)
2.红外遥控继电器。

关于红外遥控继电器以下提供二种解决方案:

2.1简单省事版

买现成的红外遥控插排¥20左右,只能控制1路,但简单方便且美观。
买现成的多路红外遥控模块。

2.2折腾版

2.2.1上物料表
名称(型号)价格
红外接收器(vs1838b)¥0.2/只
单片机(STC15W104-35I-DIP8G)¥1.5/片
红外遥控器¥1.0
5V继电器模块(高低电平触发可调1路)¥3.0
5V电源¥4.2
导线若干,led灯(5V)一个
洞洞板一张
面包板¥0.5/张
杜邦线(公对公)
串口下载器(USB TO TTL)
2.2.2说明:

如果家里有不用的遥控,使用串口测试有数据码出来红外遥控就可以省了。
如果家里有不用的手机充电器,稍微改造下,5v电源也可以省了。
面包板、杜邦线、和串口下载器程序下载和测试用的,喜欢折腾的人应该常备吧,不计入成本了,哈哈。

2.2.3重点:

红外接收器建议多买几支,可能存在坏的。
单片机建议买2片以上,以防万一。
单片机买DIP封装好焊在洞洞板上,画板子的话就当我没说,哈哈。
单片机一共6个IO,红外接收器占用1个,如果保留串口调试TX占用1个,只剩下4个可用IO,也会是再不添加其他硬件的条件下,只能单独控制4路继电器。我这里的红外接收指示灯占用1个IO,也就剩3个可用的IO。如果想控制更多的继电器,建议增加一个74HC138芯片,可以实现你的愿望。一般人没有这么多需要控制的东西吧,哈哈。

三、硬件电路

如果要长期稳定使用,建议参考官方提供的最小系统电路。
image
我这里是直接连的,电路比较简单,直接看程序的引脚定义就行。

四、代码

/*------------------------------------------------------------------*/
/* --- STC MCU International Limited -------------------------------*/
/* --- STC 1T Series MCU RC Demo -----------------------------------*/
/* --- Mobile: (86)13922805190 -------------------------------------*/
/* --- Fax: 86-755-82944243 ----------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------*/
/* If you want to use the program or the program referenced in the  */
/* article, please specify in which data and procedures from STC    */
/*------------------------------------------------------------------*//*************	功能说明	**************红外接收程序。适用于市场上用量最大的HT6121/6122及其兼容IC的编码。对于用户码与User_code定义不同的遥控器,程序会将用户码一起从串口输出。使用模拟串口发送监控显示编码,显示内容为ASCII码和中文。本接收程序基于状态机的方式,占用CPU的时间非常少。本程序是对示例程序的微改。程序适用STC15系列的单片机。
包括:STC15F104E,STC15W104,STC15F104W等。HEX文件在本目录的/list里面。******************************************//*************	用户系统配置	**************/#define MAIN_Fosc		12000000L	//定义主时钟, 模拟串口和红外接收会自动适应。5~36MHZ#define D_TIMER0		125			//选择定时器时间, us, 红外接收要求在60us~250us之间#define	User_code		0xFFA2		//定义红外接收用户码/*************	以下宏定义用户请勿修改	**************/
#include	"reg51.H"
#define	uchar	unsigned char
#define uint	unsigned int#define freq_base			(MAIN_Fosc / 1200)
#define Timer0_Reload		(65536 - (D_TIMER0 * freq_base / 10000))/*************	本地常量声明	**************//*************	本地变量声明	**************/
sbit	P_TXD1 = P3^1;		//定义模拟串口发送脚,打印信息用
sbit	P_IR_RX = P3^3;		//定义红外接收输入端口
sbit    userLed3=P3^5;      //控制第1路继电器,这里只用到了这1路
sbit    userLed4=P3^4;      //控制第2路继电器
sbit    userLed5=P3^2;      //控制第3路继电器
sbit    userLed6=P3^0;      //led指示灯bit		P_IR_RX_temp;		//Last sample
bit		B_IR_Sync;			//已收到同步标志
uchar	IR_SampleCnt;		//采样计数
uchar	IR_BitCnt;			//编码位数
uchar	IR_UserH;			//用户码(地址)高字节
uchar	IR_UserL;			//用户码(地址)低字节
uchar	IR_data;			//数据原码
uchar	IR_DataShit;		//数据反码bit		B_IrUserErr;		//User code error flag
bit		B_IR_Press;			//Key press flag,include repeat key.
uchar	IR_code;			//IR code	红外键码/*************	本地函数声明	**************/
void	Tx1Send(uchar dat);
uchar	HEX2ASCII(uchar dat);
void	InitTimer(void);
void	PrintString(unsigned char code *puts);void delay(unsigned int i)
{while(i--);	
}/*************  外部函数和变量声明 *****************//********************* 主函数 *************************/
void main(void)
{InitTimer();		//初始化TimerPrintString("****** STC系列MCU红外接收程序 2010-12-10 ******\r\n");	//上电后串口发送一条提示信息while(1){if(B_IR_Press)		//有IR键按下{PrintString("红外码: 0x");			//提示红外键码Tx1Send(HEX2ASCII(IR_code >> 4));	//键码高半字节Tx1Send(HEX2ASCII(IR_code));		//键码低半字节if(B_IrUserErr)						//用户码错误,则发送用户码{userLed6=~userLed6;delay(500);userLed6=~userLed6;delay(500);userLed6=1; switch(IR_code){case 0x45:    //定义遥控按键数据码,根据串口监视软件实际数据填写userLed3=~userLed3; //第1路继电器状态反转break;case 0x46:    //定义遥控按键数据码,根据串口监视软件实际数据填写userLed4=~userLed4; //第2路继电器状态反转break;case 0x47:    //定义遥控按键数据码,根据串口监视软件实际数据填写userLed5=~userLed5; //第3路继电器状态反转break;}Tx1Send(' ');					//发空格Tx1Send(' ');					//发空格PrintString("用户码: 0x");		//提示用户码Tx1Send(HEX2ASCII(IR_UserH >> 4));	//用户码高字节的高半字节Tx1Send(HEX2ASCII(IR_UserH));		//用户码高字节的低半字节Tx1Send(HEX2ASCII(IR_UserL >> 4));	//用户码低字节的高半字节Tx1Send(HEX2ASCII(IR_UserL));		//用户码低字节的低半字节}Tx1Send(0x0d);		//发回车Tx1Send(0x0a);		//发回车B_IR_Press = 0;		//清除IR键按下标志}}
}/********************* 十六进制转ASCII函数 *************************/
uchar	HEX2ASCII(uchar dat)
{dat &= 0x0f;if(dat <= 9)	return (dat + '0');	//数字0~9return (dat - 10 + 'A');			//字母A~F
}//*******************************************************************
//*********************** IR Remote Module **************************//*********************** IR Remote Module **************************
//this programme is used for Receive IR Remote (HT6121).//data format: Synchro,AddressH,AddressL,data,/data, (total 32 bit).//send a frame(85ms), pause 23ms, send synchro of another frame, pause 94ms//data rate: 108ms/Frame//Synchro:low=9ms,high=4.5/2.25ms,low=0.5626ms
//Bit0:high=0.5626ms,low=0.5626ms
//Bit1:high=1.6879ms,low=0.5626ms
//frame space = 23 ms or 96 ms/******************** 红外采样时间宏定义, 用户不要随意修改	*******************/#if ((D_TIMER0 <= 250) && (D_TIMER0 >= 60))#define	D_IR_sample			D_TIMER0		//定义采样时间,在60us~250us之间
#endif#define D_IR_SYNC_MAX		(15000/D_IR_sample)	//SYNC max time
#define D_IR_SYNC_MIN		(9700 /D_IR_sample)	//SYNC min time
#define D_IR_SYNC_DIVIDE	(12375/D_IR_sample)	//decide data 0 or 1
#define D_IR_DATA_MAX		(3000 /D_IR_sample)	//data max time
#define D_IR_DATA_MIN		(600  /D_IR_sample)	//data min time
#define D_IR_DATA_DIVIDE	(1687 /D_IR_sample)	//decide data 0 or 1
#define D_IR_BIT_NUMBER		32					//bit number//*******************************************************************************************
//**************************** IR RECEIVE MODULE ********************************************void IR_RX_HT6121(void)
{uchar	SampleTime;IR_SampleCnt++;							//Sample + 1F0 = P_IR_RX_temp;						//Save Last sample statusP_IR_RX_temp = P_IR_RX;					//Read current statusif(F0 && !P_IR_RX_temp)					//Last sample is high,and current sample is low, so is fall edge{SampleTime = IR_SampleCnt;			//get the sample timeIR_SampleCnt = 0;					//Clear the sample counterif(SampleTime > D_IR_SYNC_MAX)		B_IR_Sync = 0;	//large the Maxim SYNC time, then errorelse if(SampleTime >= D_IR_SYNC_MIN)					//SYNC{if(SampleTime >= D_IR_SYNC_DIVIDE){B_IR_Sync = 1;					//has received SYNCIR_BitCnt = D_IR_BIT_NUMBER;	//Load bit number}}else if(B_IR_Sync)						//has received SYNC{if(SampleTime > D_IR_DATA_MAX)		B_IR_Sync=0;	//data samlpe time to largeelse{IR_DataShit >>= 1;					//data shift right 1 bitif(SampleTime >= D_IR_DATA_DIVIDE)	IR_DataShit |= 0x80;	//devide data 0 or 1if(--IR_BitCnt == 0)				//bit number is over?{B_IR_Sync = 0;					//Clear SYNCif(~IR_DataShit == IR_data)		//判断数据正反码{if((IR_UserH == (User_code / 256)) &&IR_UserL == (User_code % 256))B_IrUserErr = 0;	//User code is righeelse	B_IrUserErr = 1;	//user code is wrongIR_code      = IR_data;B_IR_Press   = 1;			//数据有效}}else if((IR_BitCnt & 7)== 0)		//one byte receive{IR_UserL = IR_UserH;			//Save the User code high byteIR_UserH = IR_data;				//Save the User code low byteIR_data  = IR_DataShit;			//Save the IR data byte}}}}
}/**************** Timer初始化函数 ******************************/
void InitTimer(void)
{TMOD = 0;		//for STC15Fxxx系列	Timer0 as 16bit reload timer.TH0 = Timer0_Reload / 256;TL0 = Timer0_Reload % 256;ET0 = 1;TR0 = 1;EA  = 1;
}/********************** Timer0中断函数************************/
void timer0 (void) interrupt 1
{IR_RX_HT6121();
}/********************** 模拟串口相关函数************************/void	BitTime(void)	//位时间函数
{uint i;i = ((MAIN_Fosc / 100) * 104) / 140000 - 1;		//根据主时钟来计算位时间while(--i);
}//模拟串口发送
void	Tx1Send(uchar dat)		//9600,N,8,1		发送一个字节
{uchar	i;EA = 0;P_TXD1 = 0;BitTime();for(i=0; i<8; i++){if(dat & 1)		P_TXD1 = 1;else			P_TXD1 = 0;dat >>= 1;BitTime();}P_TXD1 = 1;EA = 1;BitTime();BitTime();
}void PrintString(unsigned char code *puts)		//发送一串字符串
{for (; *puts != 0;	puts++)  Tx1Send(*puts); 	//遇到停止符0结束
}

五、出现的问题

1.编程问题

编程软件我这里用的是Keil4,新建项目芯片选89c51,然后点否,项目文件空,没有头文件。
直接用下面的代码包吧,就没有这个问题。
keil4软件包(链接:https://pan.baidu.com/s/1LxlmWmIBI4ErZJUVyC2r7g 提取码:5moj )
代码包:(链接:https://pan.baidu.com/s/1PjtHDD9MgFq4sS5AkOiK_Q 提取码:r70k)
如果要改代码,改后,output记得勾选Create HEX File。
串口监视软件,

2.烧录问题

2.STC15W104程序,STC-ISP能识别固件,但无法下载。
我这里用的是最新的软件(V6.86)烧录成功的。
如果不成功,使用软件里自带的hex文件测试,判断生成的hex文件是否有问题。
下载的时候,注意通电-断电-通电,才开始烧录。
换用不同版本的烧录软件。
STC-ISP软件包(链接:https://pan.baidu.com/s/1L6FZZMrh4dMTbCY79_ohdw 提取码:v5wp)

3.总结

本方案可能是智能音箱语音控制家电的低成本解决方案,但也存在一些问题。
不支持设备状态查询,使用同一个数据码进行状态反转控制容易出现问题。例如使用手机进行外网控制时。为了确保安全,还是一个数据码对应一个状态,这应该比较简单,留给读者处理。

六、祝君成功!!!

七、视频地址

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

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

相关文章

面向开发者的 ChatGPT 提示工程

LLM 正在逐步改变人们的生活&#xff0c;而对于开发者&#xff0c;如何基于 LLM 提供的 API 接口快速、便捷地开发一些具备更强能力、集成 LLM 的应用&#xff0c;来便捷地实现一些更新颖、更实用的能力&#xff0c;是一个急需学习的重要能力。由巨佬吴恩达老师与 OpenAI 合作推…

Repository “http://xxx@git.xxx.net/xxx/xxx.git”not found 解决

本人在github上进行协同开发拉取项目&#xff0c;需要切换用户拉取项目&#xff0c;一直拉取不下来&#xff0c;报错说项目找不到。 出现的原因是远程&#xff1a;找不到存储库 http://xxxgit.xxx.net/xxx/xxx.git 。 其根本的原因是切换用户后git一直记忆的是之前的用户信息…

手把手教你做微信公众号

手把手教你做微信公众号 微信公众号可以通过注册的方式来建立。 1.进入微信公众平台 首先&#xff0c;在浏览器中搜索微信公众号&#xff0c;网页第一个就是&#xff0c;如下图所示&#xff0c;我们点进去。 2.注册微信平台账号 进入官网之后&#xff0c;如下图所示&#…

微信公众号开发__微信网页授权并获取用户基本信息(是否关注公众号、头像、昵称等)

本人最近要做微信公众号网页开发的项目&#xff0c;其中有个需求是判断用户是否关注公众号&#xff0c;由于之前没有接触过微信授权的东西&#xff0c;所以提前开始做调研。在度娘上看了好多博客、百度知道、百度经验、知乎问答等&#xff0c;还仔细阅读了微信公众平台开发文档…

微信公众号使用:给微信公众号自定义菜单中设置查看历史记录的功能

在微信公众号维护过程中,尤其是从微信公众号刚开始运行的时期,在设置自定义菜单的时候,为了让用户能看到和了解发布的微信文章,就涉及到了在自定义菜单中设置查看历史记录的功能。设置这个查看历史记录的功能主要是为了方便用户查看,让用户更好的了解,那么接下来就来讲具…

如何设置微信公众号的测试号的菜单

由于工作需要需要设置公众号的测试号的菜单&#xff0c;没想到查了半天&#xff0c;尽然发现这个菜单栏要写代码实现&#xff0c;小编表示想狗带。在开发小哥哥的帮助下&#xff0c;总算是实现了这个问题。 如何找到公众号的测试号 1、登录微信公众号后台。左边栏最下面找到开…

微信公众号开发(消息推送)

文章目录 微信公众号开发运行效果微信公众号简介注册微信公众号注册测试公众号搭建微信本地调试环境微信公众号接入(校验签名)给指定用户推送消息网页授权获取用户openid给指定用户发送模板信息 微信公众号开发 代码地址 运行效果 微信公众号简介 微信公众号分为服务号、订阅…

【监听微信公众号消息】

监听微信公众号消息 效果图如下&#xff1a;环境要求 效果图如下&#xff1a; 环境要求 需要windows服务器&#xff0c;登陆上微信。获取到的消息是xml格式&#xff0c;需要解析内容获取自己想要的公众号推送的消息。 详情&#xff1a;https://learnku.com/articles/73022

手把手教你如何获取微信公众号用户的个人信息(包括OpenId)

最近,对微信公众号有点兴趣,就自己研究了研究里面的一些内容,发现还挺有意思的,而且通过微信公众号可以调用一些比较有意思的接口,就比如百度开发服务平台 点击进入 里面的很有接口,就比较常见的翻译,语音识别,地理位置等等,都挺好的。好了,不多说,进入正题好了。 我…

关于微信公众号模板消息的调整,你怎么看?

早上起来&#xff0c;有客户反馈&#xff0c;推送的消息出现了问题。 经过测试&#xff0c;确实收到的消息和以前不一样了。 这就比较奇怪了&#xff0c;最近也没有做什么调整&#xff0c;为啥忽然就出问题了呢。 先自己检测测试了一下&#xff0c;发现发送的内容中的头尾部…

免费“白嫖” GPT-4 方法 +1,飙升 GitHub 热榜第二!开发者锐评:跟“偷”有什么区别?

前不久&#xff0c;可“白嫖” GPT-4 的 Forefront Chat 吸引了众多关注&#xff0c;导致该网站一度崩溃&#xff0c;也令不少人发出疑问&#xff1a;“GPT-4 这么贵&#xff0c;为什么它能免费让我们用&#xff1f;” 关于这个问题&#xff0c;Forefront Chat 方面并未做出相…

sipiiiii: 面向小微企业和个人开发者的简单易用应用托管平台

在当前数字化时代&#xff0c;越来越多的企业和个人都需要依赖云端服务来托管他们的应用程序。然而&#xff0c;很多传统的云服务商过于复杂或昂贵&#xff0c;这让小微企业和个人开发者难以忍受。为了满足这些用户的需求&#xff0c;我们推出了 sipiiiii&#xff0c;一个简单易…

云数据库技术沙龙|多云多源下的数据复制技术解读-NineData

摘要&#xff1a;随着数据智能时代的到来&#xff0c;多云多源架构下的数据管理是企业必备的基础设施&#xff0c;我们认为数据存取、数据集成与分发、数据安全与数据质量是基础&#xff0c;也是走向多云多源架构的起点。本议题介绍云原生的多云多源数据管理NineData&#xff0…

论文阅读《Representation learning with contrastive predictive coding 》(CPC)对比预测编码

论文地址&#xff1a;Representation Learning with Contrastive Predictive Coding 目录 一、Background&#xff08;背景&#xff09; 二、Motivation and Intuitions&#xff08;动机&#xff09; 三、Constrastive Predictive Coding&#xff08;对比预测编码&#xff…

论文阅读和分析: “How Attentive are Graph Attention Networks?”

下面所有博客是个人对EEG脑电的探索&#xff0c;项目代码是早期版本不完整&#xff0c;需要完整项目代码和资料请私聊。 数据集 1、脑电项目探索和实现(EEG) (上)&#xff1a;研究数据集选取和介绍SEED 相关论文阅读分析&#xff1a; 1、EEG-SEED数据集作者的—基线论文阅读和…

论文阅读和分析:Graph Attention Networks

Graph Attention Networks 图注意力网络&#xff08;GAT&#xff09; 通过堆叠节点能够关注其邻域特征的层&#xff0c;能够&#xff08;隐式地&#xff09;为邻域中的不同节点指定不同的权重&#xff0c;而不需要任何类型的代价高昂的矩阵运算&#xff08;例如矩阵转置&…

chatgpt赋能python:Python实现屏蔽多行的方法

Python 实现屏蔽多行的方法 作为一位有10年 Python 编程经验的工程师&#xff0c;我深知在实际开发过程中&#xff0c;屏蔽多行代码常常是必须的。在此&#xff0c;我将介绍几种 Python 屏蔽多行代码的方法&#xff0c;希望对读者有所帮助。 方法一&#xff1a;使用注释 在 …

chatgpt赋能python:Python圆柱体的体积计算代码

Python圆柱体的体积计算代码 作为一名具有10年Python编程经验的工程师&#xff0c;今天我来为大家分享Python圆柱体的体积计算代码。在这篇文章中&#xff0c;我将介绍如何使用Python编写一个简单的程序来计算圆柱体的体积&#xff0c;并解释一些关于圆柱体及如何计算其体积的…

让ChatGTP来为我们写一个计算任意位数圆周率的程序

最近在学习python&#xff0c;突然想编写一个计算圆周率pi的程序&#xff0c;可是对python库不是很熟悉&#xff0c;又不会手撸pi的计算函数所以就想起了ChatGPT&#xff0c;想让他来帮帮忙&#xff0c;顺便学习学习&#xff0c;废话不多说&#xff0c;看聊效&#xff01; &am…

chatgpt赋能python:Python编程教程:如何计算小数点后1000位

Python编程教程&#xff1a;如何计算小数点后1000位 Python是一种高级编程语言&#xff0c;被广泛应用于数据科学、人工智能、Web开发等领域。今天我们来学习如何使用Python计算小数点后1000位。 为什么需要计算小数点后1000位&#xff1f; 在实际应用中&#xff0c;有时需要…