文章目录

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

1 简介

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

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

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

单片机-嵌入式毕设选题大全及项目分享:

https://blog.csdn.net/m0_71572576/article/details/125409052

2 主要器件

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

器件连接


3 实现效果

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

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

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


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

4 部分实现代码

// 仅部分源码,需要完整工程请联系学长 q746876041
#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);
}

单片机-嵌入式毕设选题大全及项目分享:

https://blog.csdn.net/m0_71572576/article/details/125409052

5 最后

【毕业设计项目】基于单片机的万能红外遥控器 - 嵌入式 物联网 stm32相关推荐

  1. 【毕业设计】基于单片机的智能手环 -计步器 嵌入式 物联网 stm32

    文章目录 1 简介 1 项目背景意义 2 系统方案的设计 3 系统总体结构 4 系统硬件设计 4.1 主控模块 4.2 姿态解算模块:MPU6050 4.3 DS3231实物图 4.4 TFT显示模块 ...

  2. 【毕业设计】基于单片机的门禁系统 - 嵌入式 物联网

    文章目录 1 简介 2 课题背景 3 详细设计 3.1 整体设计方案 3.2 功能模块 3.3 软件设计 4 实现效果 5 部分实现代码 6 最后 1 简介 Hi,大家好,这里是丹成学长,今天向大家介 ...

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

    利用stm32f407的PA8引脚的复用功能输入捕获功能,将遥控器每个按键所对应的波形记录下来,再通过红外发射头发射出去,进而来控制电器. 由于要对所有遥控器适用,这就要求程序要能够在不知道红外编码方 ...

  4. 万能遥控程序c语言,单片机解码万能红外遥控器C51程序

    使用方法:打开串口调试助手,设置为9600 bps 单片机这边用11.0592MHz的晶振,使用sm0038或者其他型号的红外接收头按下面的电路连接好,其中out直接与单片机的p3.2脚相连.按下遥控 ...

  5. 万能遥控程序c语言,单片机解码万能红外遥控器的C51程序

    使用方法:打开串口调试助手,设置为9600 bps 单片机这边用11.0592MHz的晶振,使用sm0038或者其他型号的红外接收头按下面的电路连接好,其中out直接与单片机的p3.2脚相连.按下遥控 ...

  6. 毕业设计 单片机多功能红外空调遥控器 - 嵌入式 物联网

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 硬件设计 空调遥控器原理 原理图 解码IR信号 5 软件说明 代码 与Homekit进行连接 5 最后 0 前言

  7. 【毕业设计教程】单片机接入按键控制遥感 -嵌入式 物联网 stm32 c51

    文章目录 1 简介 2 主要器件 2.1 双轴摇杆模块 2.2 电路原理图 3 实现效果 4 测试代码 6 最后 1 简介 Hi,大家好,这里是丹成学长,今天向大家介绍如何使用单片机接入按键遥感 单片 ...

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

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

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

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

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

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

最新文章

  1. LeetCode(13.罗马数字转整数) JAVA Hashmap
  2. 这样给学妹讲原码、反码、补码,帮她彻底解决困扰了三天的问题
  3. 从委托而起(二)认识委托
  4. 不再为 Node.js 模块自动引入 Polyfills
  5. Java基础知识强化之网络编程笔记22:Android网络通信之 Android常用OAuth登录(获取个人信息)...
  6. 2016保持谦卑,继续前行
  7. Genius‘s Gambit【学习进度条1】
  8. PHP在线pdf电子合同生成,pdf添加水印
  9. QT使用PaddleOCR和百度OCR进行文字识别
  10. [交互问题]XML 解析错误:格式不佳
  11. windows网络排查
  12. virt-manager设置主机和虚拟机之间文件共享
  13. 使用api制作我的足迹地图
  14. 亮紫色晶体meso四(4-氨基苯基)卟啉TAPP/TAPPPt/TAPPCo/TAPPCd/TAPPZn/TAPPPd/TAPPCu/TAPPNi/TAPPFe/TAPPMn金属配合物-齐岳供应
  15. jQuery 利用键盘上下键移动表格内容
  16. 技术博客|第9期:Hadoop3升级实践
  17. 分布式系统下的session怎样存储
  18. 各个云从业者认证证书,哪个好?
  19. 视频列表html页面,vue + video.js实现视频列表页(多个视频)
  20. 新编计算机应用基础教材答案,新编计算机应用基础习题参考答案22365.doc

热门文章

  1. 好用!不用第三方工具就可以检测微信好友是否删除!
  2. 工程量计算专用工具-支持灌注桩、搅拌桩、格构柱
  3. linux iozone测试工具,IOZONE测试工具使用方法
  4. 电阻器颜色代码在线计算机,色环电阻计算器
  5. 机械手基础知识(2)之机械手的正运动学和逆运动学问题
  6. C++ STL库学习——容器
  7. 科技T3国产平台!成功搭载“翼辉国产实时系统SylixOS”
  8. 读取FBX文件踩坑清单
  9. RANSAC算法详解
  10. 人工智能中文视频教程