文章目录

  • 1 简介
  • 2 主要器件
  • 3 实现效果
  • 4 部分实现代码
  • 5 最后

1 简介

Hi,大家好,学长今天向大家介绍一个学长做的单片机项目

基于单片机的万能红外遥控器

大家可用于 课程设计 或 毕业设计

2 主要器件

1、红外发射模块 *1
2、红外接收模块 1
3、Nodemcu(826612f) 1
4、面包板
1
5、杜邦线
4根

器件连接


3 实现效果

1、模拟家用电器的遥控器功能。
2、通过手机可以远程控制。
3、接入小爱同学、小度和天猫精灵,可以动动嘴就能控制你的家用电器。
4、带红外学习功能,只要用遥控器的电器设备都可以接入。

红外学习功能,学习任意红外按键编码

在串口助手上可以看到学习到的红外编码


手机或者电脑登录web地址,点击按键就可以控制家里的空调或者电视等红外设备啦

4 部分实现代码

#include <IRremote.h>
#include <EEPROM.h>#define codeTypeEAddr     0  // 存放红外信号编码类型EEPROM地址
#define codeLenEAddr      1  // 存放红外信号编码长度EEPROM地址
#define toggleEAddr       2  // 存放红外信号RC5/RC6类型EEPROM地址
#define codeValueEAddr    3  // 存放红外信号数值EEPROM地址
#define RECV_PIN 11          // 红外接收器 OUT 引脚 --- Arduino 引脚11
#define BUTTON_PIN 12               // 按键开关 --- Arduino 引脚12
#define STATUS_PIN LED_BUILTIN      // 状态显示LED --- 开发板内置LEDIRrecv irrecv(RECV_PIN);   // 红外遥控接收器对象
IRsend irsend;             // 红外遥控发射对象decode_results results;    // 储存接收到的红外遥控信息void setup() {Serial.begin(9600);irrecv.enableIRIn(); // 启动红外接收pinMode(BUTTON_PIN, INPUT_PULLUP);pinMode(STATUS_PIN, OUTPUT);delay(10);loadEepromValues();  // 从EEPROM中读取红外信号信息(具体信息请见函数部分)
}// 红外信号存储变量
int codeType; // 红外信号编码类型
unsigned long codeValue; // 存放红外信号数值(如果不是raw型)
unsigned int rawCodes[RAWBUF]; // raw型信号
int codeLen;    // 红外信号编码长度
int toggle;     // 红外信号RC5/RC6类型// 记录收到的红外信号
void storeCode(decode_results *results) {codeType = results->decode_type;int count = results->rawlen;if (codeType == UNKNOWN) {    //如果收到的信号是无法识别的协议,则存储为raw型数据Serial.println("Received unknown code, saving as raw");  codeLen = results->rawlen - 1;// 存储raw型信号:// 将首个数值放弃(间隙)// 将信号转化为毫秒// 细微调整信号内容,将信息变短将空档间隙变长从而取消红外接收信号的扰动for (int i = 1; i <= codeLen; i++) {if (i % 2) {// 信号rawCodes[i - 1] = results->rawbuf[i]*USECPERTICK - MARK_EXCESS;Serial.print(" m");} else {// 空档间隙rawCodes[i - 1] = results->rawbuf[i]*USECPERTICK + MARK_EXCESS;Serial.print(" s");}Serial.print(rawCodes[i - 1], DEC);}Serial.println("");}else {if (codeType == NEC) {  //如果是NEC协议类型Serial.print("Received NEC: ");if (results->value == REPEAT) {// Don't record a NEC repeat value as that's useless.Serial.println("repeat; ignoring.");return;}} else if (codeType == SONY) {  //如果是SONY协议类型Serial.print("Received SONY: ");} else if (codeType == PANASONIC) {  //如果是PANASONIC协议类型Serial.print("Received PANASONIC: ");}else if (codeType == JVC) {  //如果是JVC协议类型Serial.print("Received JVC: ");}else if (codeType == RC5) {  //如果是RC5协议类型Serial.print("Received RC5: ");} else if (codeType == RC6) {  //如果是RC6协议类型Serial.print("Received RC6: ");} else {Serial.print("Unexpected codeType "); //无法识别信号Serial.print(codeType, DEC);Serial.println("");}Serial.println(results->value, HEX); //输出信号数值codeValue = results->value;codeLen = results->bits;}writeEepromVal();  //将收到的信号信息储存于eeprom
}// 发射红外信号
void sendCode(int repeat) {if (codeType == NEC) {  //如果是NEC协议信号if (repeat) {         //且如果是发射重复信号irsend.sendNEC(REPEAT, codeLen);     //发射NEC协议的重复信号Serial.println("Sent NEC repeat");} else {irsend.sendNEC(codeValue, codeLen);  //否则发射NEC协议红外指令信号Serial.print("Sent NEC ");Serial.println(codeValue, HEX);      //串口监视器输出红外指令信号数值}} else if (codeType == SONY) {             // 发射的信号是SONY协议irsend.sendSony(codeValue, codeLen);   // 发射SONY协议红外指令信号Serial.print("Sent Sony ");Serial.println(codeValue, HEX);} else if (codeType == PANASONIC) {            // 发射的信号是PANASONIC协议irsend.sendPanasonic(codeValue, codeLen);  // 发射PANASONIC协议红外指令信号Serial.print("Sent Panasonic");Serial.println(codeValue, HEX);}else if (codeType == JVC) {                    // 发射的信号是JVC协议irsend.sendJVC(codeValue, codeLen, false);   // 发射JVC协议红外指令信号Serial.print("Sent JVC");Serial.println(codeValue, HEX);}else if (codeType == RC5 || codeType == RC6) {  // 发射的信号是RC5或RC6协议if (!repeat) {// 新按键按下后反转toggle位toggle = 1 - toggle;}// 将toggle位放入信号代码中发送codeValue = codeValue & ~(1 << (codeLen - 1));codeValue = codeValue | (toggle << (codeLen - 1));if (codeType == RC5) {       // 发射的信号是RC5协议Serial.print("Sent RC5 ");Serial.println(codeValue, HEX);irsend.sendRC5(codeValue, codeLen);} else {   // 发射的信号是RC6协议irsend.sendRC6(codeValue, codeLen);Serial.print("Sent RC6 ");Serial.println(codeValue, HEX);}} else if (codeType == UNKNOWN /* i.e. raw */) {// 假设信号频率 38 KHzirsend.sendRaw(rawCodes, codeLen, 38);Serial.println("Sent raw");}
}int lastButtonState;   // 此变量用于判断发射红外信号的按键开关所处的状态void loop() {int buttonState = !digitalRead(BUTTON_PIN);           // 读取当前的按键开关状态(检查用户是否按下了按键开关)if (lastButtonState == HIGH && buttonState == LOW) {  // 如果按键开关是被按下后再抬起的Serial.println("Released");                         // 通过串口监视器输出"按键抬起"irrecv.enableIRIn();                                // 启动红外接收器信号接收}                                                     if (buttonState) {                                    // 如果按键开关处于被按下的状态Serial.println("Pressed, sending");                 // 通过串口监视器输出"按键按下"digitalWrite(STATUS_PIN, HIGH);                     // 闪烁状态显示红外LED告知用户当前"学霸遥控器"正在发射红外信号(点亮LED)sendCode(lastButtonState == buttonState);           // 更新按键开关状态变量digitalWrite(STATUS_PIN, LOW);                      // 闪烁状态显示红外LED告知用户当前"学霸遥控器"正在发射红外信号(熄灭LED)delay(50);                                          // 信号发射间歇} else if (irrecv.decode(&results)) {                 // 如果按键开关处于没有被按下的状态,则实时检查红外接收器并对接收到的信号进行解码// 如果接收到的红外信号可以通过decode函数成功解码digitalWrite(STATUS_PIN, HIGH);                     // 闪烁状态显示红外LED告知用户当前"学霸遥控器"正在发射红外信号(点亮LED)storeCode(&results);                                // 将解码的红外信号信息进行储存(非EEPROM储存)irrecv.resume();                                    // 恢复红外接收器digitalWrite(STATUS_PIN, LOW);                      // 闪烁状态显示红外LED告知用户当前"学霸遥控器"正在发射红外信号(熄灭LED)}lastButtonState = buttonState;                        // 更新按键开关状态变量
}// 通过EEPROM读取红外信号信息
// 每次Arduino通电后,都会从EEPROM中读取存储的红外信号信息。
// 从而确保"学霸遥控器"在断电后依然可以保持上一次运行时所存储的
// 红外信号信息。
void loadEepromValues(){codeType = EEPROM.read(codeTypeEAddr);delay(10);codeLen = EEPROM.read(codeLenEAddr);delay(10);toggle = EEPROM.read(toggleEAddr);  delay(10);toggle = EEPROM.read(toggleEAddr);  delay(10);EEPROM.get(codeValueEAddr, codeValue);
}// 将红外信号信息储存于EEPROM
// 每一次"学霸遥控器"接收到新的红外遥控信号
// 都将最新接收的红外遥控器储存于EEPROM
// 从而确保信号信息不会因为Arduino断电而丢失
void writeEepromVal(){EEPROM.write(codeTypeEAddr, codeType);delay(10);EEPROM.write(codeLenEAddr, codeLen);delay(10);EEPROM.write(toggleEAddr, toggleEAddr);delay(10);EEPROM.put(codeValueEAddr, codeValue);delay(10);
}

5 最后

单片机毕业设计 stm32万能红外遥控器相关推荐

  1. 毕业设计 嵌入式 万能红外遥控器

    文章目录 1 简介 2 主要器件 3 实现效果 4 部分实现代码 5 最后 1 简介 Hi,大家好,学长今天向大家介绍一个学长做的单片机项目 基于单片机的万能红外遥控器 大家可用于 课程设计 或 毕业 ...

  2. stm32毕业设计 单片机万能红外遥控器

    文章目录 1 简介 2 主要器件 3 实现效果 4 部分实现代码 1 简介 Hi,大家好,学长今天向大家介绍一个学长做的单片机项目 基于单片机的万能红外遥控器 大家可用于 课程设计 或 毕业设计 选题 ...

  3. 基于STM32的万能红外遥控器

    本博客介绍一种基于STM32的可学习和存储已有红外发射设备的万能红外遥控器的设计思路. 一.首先需要了解设计一款这功能的遥控器需要什么硬件设备支持. 1.3.3V,5V电源模块,用作给系统模块供电和单 ...

  4. STM32 NEC红外遥控器解码

    STM32 NEC红外遥控器解码 红外遥控编码格式 一体化红外接收头 STM32显示遥控器按下的数字代码 代码片 总结 原文链接:https://www.yourcee.com/newsinfo/29 ...

  5. DIY手机万能红外遥控器

    DIY手机万能红外遥控器 1.手机安装软件:遥控精灵 2.红外二极管两个(旧的遥控器里面可以拆) 3.耳机的插头一个 步骤:首选讲两个二极管的正负相接(即a二极管的正极连接b二极管的负极,a二极管的负 ...

  6. 手把手教你DIY一款属于自己的万能红外遥控器!

    下班刚回到家,天气很热~ 空调遥控器呢?找不到! 躺平不想动~ 风扇遥控器呢?找不到! 想看电视,不想动~ 电视遥控器呢?找不到! 好不容易找到了,遥控器没电?崩溃!!!! 想不想拥有一个万能红外遥控 ...

  7. 【涂鸦物联网足迹】涂鸦云平台接口列表—万能红外遥控器

    前序系列文章>>> [涂鸦物联网足迹]涂鸦云平台接口列表 我们系列文章,都会围绕如何完成一款智能"隔空接吻机"的开发.希望能帮到各异地恋or异国恋的情侣们! 本文 ...

  8. 卡特加特“飞碟”万能红外遥控器,一个控全屋所有家电!支持语音遥控定时手机,传统家电变智能

    随着生活越来越好,大家家里的家电也越来越多. 电视机顶盒.功放.空调.热水器--虽说是方便了不少,但一个电器就得有一个遥控器也属实麻烦! 不仅容易搞混,还特容易搞丢,用的时候找不到,不用的时候占地方. ...

  9. 单片机毕业设计 STM32自动泊车系统 - 智能小车 自动停车

    文章目录 1 简介 1 背景 2 设计概要 3 硬件选型 3.1 主控 - STM32 3.2 电机驱动 3.3 红外遥控设计 3.4 传感器部分 3.4.1 循迹模块 3.4.2 红外避障模块 3. ...

最新文章

  1. 化学博士6次投毒同事,只因对方给自己安排工作太多....
  2. UVA10173(求凸包的面积最小外接矩形)
  3. Python 和 R 数据分析/挖掘工具互查
  4. 静态文件用什么服务器配置,静态文件服务器路径怎么配置好
  5. Paypal Rest Api自定义物流地址(跳过填写物流地址)
  6. 2018.5.15Html标签初学
  7. zipfile.BadZipFile: File is not a zip file
  8. 微服务学习之Eureka注册中心集群环境构建【Hoxton.SR1版】
  9. wms开发语言c 还是java,专业WMS和普通WMS之间差异有什么呢?
  10. iBeacon 介绍
  11. css盒心形的代码过程,如何使用CSS和D3实现用文字组成的心形动画效果(附代码)...
  12. 安卓 新闻客户端毕业设计项目
  13. 从内网windows2008服务器复制文件到本地慢,Windows Server 2008网上邻居打开慢的解决...
  14. 谷歌浏览器扩展快捷键设置
  15. 《Electron入门与实战》创作路上的那些事儿
  16. Problem F. Asperger Syndrome
  17. 百度地图API支持HTTPS
  18. 二十年目睹之怪状-大学
  19. 在结构异质的云杉林中使用机载激光扫描仪数据进行单树分割
  20. Wechaty Plugin|实现一个微信机器人几行代码即可

热门文章

  1. python 安装环境时出现报错:CondaVerificationError: The package for tk located at /home/anaconda3/pkgs/t
  2. 请简述一下”==”和”equals”的区别
  3. 加息靴子落地铁矿石继续反弹,甲醇认购大涨,苹果10-01大跳水2022.5.5
  4. 移动端实现图标拖拽效果
  5. linux缺页异常,操作系统缺页异常
  6. UISlider实现背景图
  7. REUSE_ALV_GRID_DISPLAY_LVC-行选择功能
  8. android车载无线充apple,绿联车载无线充电器,手机支架款安卓苹果双快充模式
  9. splunk篇5-导出csv文件中文乱码
  10. oracle txn,【学习笔记】ORACLE分布式事务故障的处理 结合MOS官方文档分析