Arduino造轮子—红外遥控器

2023-05-16

今天练习的程序是实现红外遥控器的控制,首先,通过太极创客的视频来看看最终的实现结果:

【太极创客】零基础入门学用Arduino 第三部分 智能应用篇 合辑

本次程序例程来自太极创客官网,此平台的Arduino教程深入浅出,对于想学习Arduino的同学,首推太极创客团队。(๑•̀ㅂ•́)و✧

以下便是今天练习的造轮子程序:

#include <IRremote.h>
#include <EEPROM.h>

#define codeTypeEAddr 0
#define codeLenEAddr 1
#define toggleEAddr 2
#define codeValueEAddr 3
#define RECV_PIN 11

#define BUTTON_PIN 12
#define STATUS_PIN LED_BUILTIN

IRrecv irrecv(RECV_PIN);
IRsend irsend;

decode_results results;

int codeType;
unsigned long codeValue;
unsigned int rawCodes[RAWBUF];
int codeLen;
int toggle;

int lastButtonState;

void setup(){
	Serial.begin(9600);
    irrecv.enableIRIn();
    pinMode(BUTTON_PIN,INPUT_PULLUP);
    pinMode(STATUS_PIN,OUTPUT);
    delay(10);
    loadEepromValues();
}

coid loop(){
    int buttonState=!digitalRead(BUTTPN_PIN);
    if(lastButtonState==HIGH&&buttonState==LOW){
        Serial.println("Reseased");
        irrecv.enableIRIn():
    }
    
    if(buttonState){
        Serial.println("Pressed, sending");
        digitalWrite(STATUS_PIN,HIGH);
        sendCode(lastButtonState==buttonState);
        digitalWrite(STATUS_PIN,LOW);
        delay(50);
    }else if(irrecv.decode(&result)){
        degitalWrite(STATUS_PIN,HIGH);
        storeCode(&result);
        irrecv.resume();
        digitalWrite(STATUS_PIN,LOW);
    }
    lastButtonState=buttonState;
}

void storeCode(decode_result *resukts){
    codeType=results->decode_type;
    int count=result->rawlen;
    if(codeType==UNKNOWN){
        Serial.println("Receive unknown code, saving as raw");
        codeLen=result->rawlen-1;
        for(int i=1;i<=codeLen;i++){
            if(i%2){
                rawCodes[i-1]=results->rawbuf[i]*UNECPERTICK-MARK_EXCESS;
                Serial.print(" m");
            }else{
                rawCodes[i-1]=result->rawbuf[i]*USECPERTICK+MARK_EXCESS;
                Serial.println(" s");
            }
            Serial.print(rawCodes[i-1],DEC);
        }
        Serial.println("");
    }else{
        if(codeType==NEC){
            Serial.print("Received NEC: ");
            if(result->value==REPEAT){
                Serial.println("repeat; ingnoring.");
                return;
            }  
        }else if(codeType==SONY){
            Serial.println("Received SONY: ");
        }else if(codeType==PANASONIC){
            Serial.println("Received PANASONIC: ");
        }else if(codeType==JVC){
            Serial.println("Received JVC: ");
        }else if(codeType==RC5){
            Serial.println("Received RC5: ");
        }else if(codeType==RC6){
            Serial.println("Received RC6: ");
        }else{
            Serial.print("Unexpected codeType ");
            Serial.println(codeType, DEC);
            Serial.println("");
        }
        Serail.println(result->value,HEX);
        codeValue=result->value;
        codeLen=result->bits;
    }
    writeEepromVal();
}

void sendCode(int repeat){
    if(codeType==NEC){
        if(repeat){
            irsend.sendNEC(REPEAT,codeLen);
            Serial.println("Sent NEC repeat");
        }else{
            irsend.sendNEC(codeValuecodeLen);
            Serial.print("Sent NEC");
            Serial.println(codeValue,HEX);
        }
    }else if(codeType==SONY){
        irsend.sendSony(codeValue,codeLen);
        Serial.print("Sent Sony");
        Serial.println(codeValue,HEX);
    }else if(codeType==PANASONIC){
        irsend.sendPanasonic(codeValue,codeLen);
        Serial.print("Sent Panasonic");
        Serial.println(codeValue,HEX);
    }else if(codeType==JVC){
        irsend.sendJVC(codeValue,codeLen);
        Serial.print("Sent JVC");
        Serial.println(codeValue,HEX);
    }else if(codeType==RC5||codeType==RC6){
        if(!repeat){
            toggle=1-toggle;
        }
        codeValue=codeValue&~(1<<(codeLen-1));
        codeValue=codeValue|(toggle<<(codeLen-1));
        if(codeType==RC5){
            Serial.print("Sent RC5")'
            Serial.println(codeValue,HEX);
            irsend.sendRC5(codeValue,codeLen);
            
        }else{
            irsend.sendRC6(codeValue,codeLen);
            Serial.print("Senr RC6")
            Serial.println(codeValue,HEX);
        }
    }else if(codeType==UNKNOWN){
        irsend.sendRaw(rawCodes,codeLen,38);
        Serial.println("send raw");
    }
}

void loadEepromValues(){
    codeType=EEPROM.read(codeTypeEAddr);
    delay(10);
    codeLen=EEPROM.read(codeLenEAddr);
    delay(10);
    toggle=EEPROM.read(toggleEAddr);
    delay(10);
    codeType=EEPROM.read(codeTypeEAddr);
    delay(10);  //
    EEPROM.get(codeValueEAddr,codeValue);
}

void writeEepromValue(){
    EPPROM.write(codeTypeEAddr, codeType);
    delay(10);
    EEPROM.write(codeLenEaddr,codeLen);
    delay(10);
    EEPROM.write(toggleledEAddr,toggleEAddr);
    delay(10);
    EEPROM.put(codeValueEAddr,codeValue);
    delay(10);
}

心得:
此例程使用了Arduino第三方库,且视频中也没有详细的代码解释,所以在造轮子的过程中总是磕磕绊绊,这就需要不断地查阅第三方库所附带的源码以及各种文档与手册

这次造轮子其实是在看完视频一周之后才开始着手,当遇到磕绊而去查看过去的笔记的时候,真后悔当初没有把笔记录详细。记笔记的时候总是有这样的傲慢:现在懂了=永远懂了。这次造轮子的手足无措就是对自己的警示。记笔记一定要详细,这样就会不会“笔记用时方恨少”!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Arduino造轮子—红外遥控器 的相关文章

  • 使用VNC远程控制树莓派的Ubuntu20.04(arm)

    一 将PC与树莓派连接到同一个局域网内 比如 xff1a 将树莓派和PC连接到同一个wifi中 xff0c 方法一 xff1a 如果是家用wife发射器 xff0c 则可以在浏览器中输入 xff1a http 192 168 0 1 来查询
  • vue笔记

    ES6相关补充 var 没有块级作用域 let 有块级作用域 ES5之前因为if和for都没有块级作用域的概念 xff0c 只能借助function的作用域来解决应用外面变量的问题 let有if和for的块级作用域 变量作用域 xff1a
  • python3字符串

    Python3 字符串 字符串是 Python 中最常用的数据类型 我们可以使用引号 或 来创建字符串 创建字符串很简单 xff0c 只要为变量分配一个值即可 例如 xff1a var1 61 Hello World var2 61 Run
  • html思维导图

    标题标签 标题标签 h1 h5 xff0c 字体从大到小 对应英文语义headline 使用注意 xff1a 标题里的文字要xian想水平居中或者垂直居中得用text align和line height来做 xff0c 内外边距不行 xff
  • 什么是MVVM?

    什么是MVVM MVVM是Model View ViewModel的缩写 MVVM是一种设计思想 View层是视图层 xff0c 也就是用户界面 前端主要由HTML和CSS来构建 xff1b Model层 是指数据模型 xff0c 泛指后端
  • Docker——Windows版本Docker安装

    目录 一 简介 1 1 Docker如何解决大型项目依赖关系复杂 xff0c 不同组件依赖的兼容性问题 xff1f 1 2 Docker如何解决开发 测试 生产环境有差异的问题 1 3 Docker 和 虚拟机的区别 1 4 Docker架
  • 细说C++中的 :: 和 : 的区别

    C 43 43 中的 1 类的作用域 作用域符号 的前面一般是类名称 xff0c 后面一般是该类的成员名称 xff0c C 43 43 为例避免不同的类有名称相同的成员而采用作用域的方式进行区分 假如 xff1a A B表示两个类 xff0
  • 扰动观测器(DOB)设计

    snf 机器人机械手可能会受到不同类型的干扰 例如未知的有效载荷 未建模的动力学和环境相互作用力 观察机器人操纵器中的这些未知干扰是许多机器人应用的基础 例如干扰抑制和无传感器力控制 机械手在进行正常操作时可能会受到不同类型的干扰 粗略地说
  • Gazebo安装教程——在 Ubuntu 上安装Gazebo的源代码

    安装工具 建议使用一些额外的工具来帮助编译源代码 xff0c 尽管其他正确获取和构建源代码的方法也是可能的 获取所有库的源代码的最简单方法是使用 vcstool 要以正确的顺序编译所有不同的库和 ign gazebo xff0c 建议使用c
  • 线性与非线性控制

    控制理论领域可以分为两个分支 xff1a 线性控制理论 这适用于由遵循叠加原理的设备组成的系统 xff0c 这大致意味着输出与输入成正比 它们由线性微分方程控制 一个主要的子类是另外具有不随时间变化的参数的系统 xff0c 称为线性时不变
  • 模型预测控制(Model predictive control,MPC)

    模型预测控制 MPC 是一种先进的过程控制方法 xff0c 用于在满足一组约束条件的同时控制过程 自 1980 年代以来 xff0c 它一直在化工厂和炼油厂的加工工业中使用 近年来 xff0c 它还被用于电力系统平衡模型 1 和电力电子学中
  • 蓝桥杯单片机官方测试程序现象

    IO模式 xff0c 矩阵按键下 xff1a 开机次数 测试AT24C02 S7 测试LED 按2次 S11 测试DAC 按4次 S15 测试ADC双通道 按2次 S19 测试超声波 S6 测试温度模块 S10 0 测量 S14 测试继电器
  • 51单片机的1T和12T的区别

    1T 模式 不分频 1个系统基本时钟 xff0c 执行一个动作 xff1b 12T模式 12分频 12个系统基本时钟 xff0c 执行一个动作 xff1b 因此 xff0c 12T模式和1T模式执行相同次数的动作 xff0c 12T模式需要
  • python2数据类型

    Python3 数字 Number Python 数字数据类型用于存储数值 数据类型是不允许改变的 这就意味着如果改变数字数据类型得值 xff0c 将重新分配内存空间 以下实例在变量赋值时 Number 对象将被创建 xff1a var1
  • keil中的extern的使用

    C51头文件使用extern的目的是外部变量或函数声明 使用时要注意 1 extern最好写在 h文件中 xff0c 方便后期的可读性 2 在使用extern进行外部变量声明时 xff0c 不能重新给变量赋值 例如 xff1a extern
  • STC89C52RC/RD中定时器2的使用方法

    学过一段时间单片机的你发现 xff0c 中断服务函数可以在主函数进行的同时 xff0c 进行一些对时间要求高的模块的配置时 xff0c 则要用到定时器中断 而如果你要实现多个功能的操作 xff0c 会使用多个定时器是必要的STC89C51单
  • keilC51中调试的方法(主要介绍串口调试XCOM)

    在keilC51中调试的方法的方法有很多 xff1a 1 直接看现象 2 串口调试 3 debug调试 下面终点讲串口调试 xff1a 若要实现printf重定向 重写printf调用的putchar函数 xff0c 重定向到串口输出 需要
  • data/xdata/pdata/code

    dada最大在128byte xff0c 不然就会报错 data xdada最大在512byte xff0c 不然就会报错 xdata pdata stc89c52中未使用 code xff08 将ROM内的定值存在程序存储器中 xff0c
  • 基于PID算法(python)的飞控设计学习日志(一)

    PID算法基础 首先我们需要去了解PID算法的数学原理 xff0c 数学原理部分借鉴于 64 确定有穷自动 机 的博客 一文读懂PID控制算法 xff08 抛弃公式 xff0c 从原理上真正理解PID控制 xff09 总的来说 xff0c
  • JAVA- 浅谈==与equal()的区别

    目录 gt 基础 gt 基本数据类型 gt 引用数据类型 gt Java内存 gt 区别 61 61 和equals gt 61 61 gt equals gt 总结 gt 基础 要想区分这两者 xff0c 我们得先明白什么是基本数据类型和

随机推荐

  • Ubuntu20.04+RealSense D455

    Ubuntu20 04装RealSense D455的驱动 Ubuntu20 04装RealSense D455的驱动 官网链接和个人链接 官网链接和个人链接 前言 xff1a 这些是我ubuntu20 04安装时候所找到的方法 xff0c
  • 【Java开发】 Mybatis-Plus 04:条件构造器-wrapper

    条件构造器算是Mybatis Plus中很重要的知识点了 xff0c 个人觉得它类似于Service的链式查询 xff0c 将诸多条件集中在一个wrapper中 xff0c 以达到高效便捷的目的 本文也是对01 02 03 内容的整合归纳
  • PrusaSlicer2.5中文说明1(新手篇)

    下载PrusaSlicer 稳定版本 PrusaSlicer的最新稳定版本始终可以在DRIVERS amp APPS包中找到 xff0c 它适用于Windows Mac OS X和Linux 该软件包还包括测试对象和打印机驱动程序 xff0
  • ROS机器人开发学习记录2——通过opencv读入本地图像并显示

    使用opencv和ros实现彩色图的读入和显示 为了实现该功能 xff0c 我使用了以下主要函数 xff0c 先对这些函数的功能做简要记录 xff1a xff08 1 xff09 Mat obj 61 imread 本地图像路径 实例 F
  • python中函数的参数分类

    python中函数的参数 形参 xff1a 定义函数时代表函数的形式参数 实参 xff1a 调用函数时传入的实际参数 列如 xff1a def f x y x y形参 print x y f 1 2 1 2 实参 定义函数时 xff0c 形
  • 信号量(sem)控制访问有限共享资源的线程数

    信号量 sem t就是个资源计数器 xff0c 用于控制访问有限共享资源的线程数 span class token macro property span class token directive keyword include span
  • 不需要各种代码的MATLAB语法高亮的设置,简单实用

    文章目录 前言一 代码高亮是什么 xff1f 二 设置步骤1 点击主页再点击预设2 点击MATLAB再点击颜色别着急因为是窗口太小哦所以要放大取消使用系统颜色 xff0c 然后自己选择文本颜色和背景颜色 总结 前言 这次主要想说说MATLA
  • 优先级队列(堆)

    优先级队列 1 什么是优先级队列2 什么时候用它什么时候不用它3 它的具体用法记得import两个库 xff1a 3 1定义3 2输入输出 1 什么是优先级队列 优先级队列就是用库内已有的类 xff0c 这个类名字是队列 xff0c 其实不
  • 2.1 关系模型的基本概念

    文章目录 2 1 1 基本术语定义2 1 用二维表格表示实体集 xff0c 用关键码表示实体间联系的数据模型称为关系模型 xff08 relational Model xff09 在关系模型中 xff0c 关键码 key 简称键 由一个或多
  • 2.2 关系代数的五个基本操作

    文章目录 前言2 2 关系代数2 2 1 关系代数的五个基本操作 1 投影 xff08 Projection xff09 2 选择 xff08 Selection xff09 选择与投影组合 3 xff09 并 xff08 Union xf
  • web的一些介绍

    文章目录 前言一 什么是Web xff1f 二 基本Web服务结构软件编程体系C S xff08 Client Server xff09 软件体系结构B S xff08 Brower Server xff09 软件体系结构C S结构与B S
  • .net技术第一章

    文章目录 NETC C Sharp 的特点C 的应用范围 NET Framework1 2 创建简单的C 程序结构和书写规则类型的声明和使用类型的声明和使用命名空间使用方法命名空间举例 注释Main方法命令行参数Main返回值 控制台输入和
  • .net----委托和事件

    委托和事件 委托声明实例化调用将类型安全的函数指针 方法 作为其他方法的参数进行传递 xff0c 从而实现函数回调方法委托 xff1a 匿名方法委托 多播委托委托 xff1a 委托的异步调用委托 xff1a 委托的兼容性 事件事件实际上是委
  • .net-----语言集成查询LINQ

    语言集成查询LINQ 前言相关语言要素初始值设定项匿名类型相关语言要素Lambda表达式扩展方法 LINQ的概念和基本操作集成语言查询LINQLINQ查询操作 标准查询运算符数据排序数据筛选数据投影数据分组联接运算数据分区限定运算聚合运算集
  • .net-----Windows 窗体应用程序包括控件,对话框,多重窗体,绘制图形,菜单和工具栏

    目录 前言Windows窗体应用程序概述 xff1b 窗体和大部分控件常用的事件创建Windows窗体应用程序使用Visual Studio集成开发环境实现Hello World程序 使用常用Windows窗体控件 xff1b Label
  • python字符串内建函数

    在八进制数前面显示零 0 xff0c 在十六进制前面显示 0x 或者 0X 取决于用的是 x 还是 X 0 显示的数字前面填充 0 而不是默认的空格 输出一个单一的 var 映射变量 字典参数 m n m 是显示的最小总宽度 n 是小数点后
  • 物理层-计算机网络速成

    物理层 1 物理层的基本概念1 1四大特性机械特性电气特性功能特性过程特性 1 2两种信号1 3 调制编码调制编码区别 1 4 传输介质双绞线光纤同轴电缆 xff1a 淘汰 xff0c 有线电话无线 xff1a IEEE802 11 1 5
  • 考研第一天,汤家凤基础班,连续与极限复习笔记

    函数连续极限 性质保号性证明极值点 xff1a 夹逼准则二项式展开根号下 xff0c 大于一 xff0c 小于一的讨论直接放缩求和分子分母齐次 xff0c 且分母大一次 xff0c 用积分 单调有界存在极限几个重要的切线放缩证明有界 xff
  • Ubuntu双系统安装教程

    安装Ubuntu双系统 1 下载Ubuntu镜像源文件2 下载制作U盘启动工具3 磁盘分区4 安装Ubuntu 1 下载Ubuntu镜像源文件 18 04 6链接 xff1a http mirrors aliyun com ubuntu r
  • Arduino造轮子—红外遥控器

    今天练习的程序是实现红外遥控器的控制 xff0c 首先 xff0c 通过太极创客的视频来看看最终的实现结果 xff1a 太极创客 零基础入门学用Arduino 第三部分 智能应用篇 合辑 本次程序例程来自太极创客官网 xff0c 此平台的A