当前位置: 首页 > article >正文

基于VSCode+PlatformIO环境的ESP8266的HX1838红外模块

以下是针对ESP8266开发板的红外遥控解码系统开发教程,基于VSCode+PlatformIO环境编写


一、概述

本实验通过ESP8266开发板实现:

  1. 红外遥控信号解码
  2. 自定义按键功能映射
  3. 串口监控输出
  4. 基础设备控制(LED)

硬件组成

  • NodeMCU ESP8266开发板
  • HX1838红外接收模块
  • 5mm LED灯
  • 杜邦线若干

开发环境

  • VSCode + PlatformIO
  • Arduino框架
  • IRremote库v4.0+

二、环境搭建

1. PlatformIO配置

创建platformio.ini配置文件:

[env:nodemcuv2]
platform = espressif8266
board = nodemcuv2
framework = arduino
lib_deps =Arduino-IRremote/IRremote@^4.0.0
monitor_speed = 115200

2. 库安装流程

  1. 在VSCode中按Ctrl+Shift+P打开命令面板
  2. 输入PlatformIO: Install Library
  3. 搜索安装IRremote by Armin Joachimsmeyer

三、硬件连接

接线示意图

[红外接收器]       [ESP8266]
    OUT ----------- P4
    VCC ----------- 3V3
    GND ----------- GND

[LED灯]           [ESP8266]
    长脚 ----------- P2
    短脚 ----------- GND

四、代码实现

完整代码(src/main.cpp

#include <Arduino.h>
#include <IRremote.hpp>#define IR_RECV_PIN D4 // GPIO2
#define LED_PIN D1     // GPIO5// 协议解码函数声明
const char* getProtocolString(decode_type_t protocol);
const char* getKeyName(uint32_t code);
void handleIRCommand();// 自定义键码映射表
struct IrKeyMapping {uint32_t code;const char* name;
};const IrKeyMapping keyMap[] = {{0xFFA25D, "POWER"},   // 电源键{0xFF629D, "VOL+"},    {0xFFE21D, "FUNC/STOP"},{0xFF22DD, "FAST BACK"},{0xFF02FD, "PAUSE"},{0xFFC23D, "FAST FORWARD"},{0xFFE01F, "DOWN"},{0xFFA857, "VOL-"},    {0xFF906F, "UP"},      {0xFF6897, "0"},{0xFF9867, "EQ"},      {0xFFB04F, "ST/REPT"},{0xFF30CF, "1"},{0xFF18E7, "2"},{0xFF7A85, "3"},{0xFF10EF, "4"},{0xFF38C7, "5"},{0xFF5AA5, "6"},{0xFF42BD, "7"},{0xFF4AB5, "8"},{0xFF52AD, "9"},{0xFFFFFFFF, "REPEAT"}
};void setup() {Serial.begin(115200);IrReceiver.begin(IR_RECV_PIN);pinMode(LED_PIN, OUTPUT);Serial.println("\n红外遥控系统已启动");
}void loop() {if (IrReceiver.decode()) {// 原始数据打印Serial.printf("[%02X] 协议:%-6s 键值:0x%08lX -> %s\n",IrReceiver.decodedIRData.protocol,getProtocolString(IrReceiver.decodedIRData.protocol),IrReceiver.decodedIRData.decodedRawData,getKeyName(IrReceiver.decodedIRData.decodedRawData));handleIRCommand();IrReceiver.resume();}delay(50);
}// 协议类型转文字
const char* getProtocolString(decode_type_t protocol) {switch(protocol) {case NEC: return "NEC";case SONY: return "SONY";case RC5: return "RC5";case RC6: return "RC6";case DISH: return "DISH";case SHARP: return "SHARP";case JVC: return "JVC";case SAMSUNG: return "SAMSUNG";default: return "UNKNOWN";}
}// 键码转名称
const char* getKeyName(uint32_t code) {for (auto &key : keyMap) {if (code == key.code) {return key.name;}}return "UNKNOWN";
}// 执行控制命令
void handleIRCommand() {switch(IrReceiver.decodedIRData.decodedRawData) {case 0xFFA25D: // POWER键控制LEDdigitalWrite(LED_PIN, !digitalRead(LED_PIN));Serial.println("LED状态已切换");break;case 0xFF6897: // 数字0Serial.println("执行系统复位");ESP.restart();break;}
}

五、代码解析

1. 核心功能模块

  • 协议解码IrReceiver.begin()初始化红外接收
  • 数据解析IrReceiver.decode()获取解码数据
  • 协议处理:通过decodedIRData结构体访问详细信息
  • 命令映射:自定义键码映射表实现灵活控制

2. 关键数据结构

struct IrKeyMapping {uint32_t code;     // 原始键值(十六进制)const char* name;   // 自定义按键名称
};

六、使用示例

1. 编译上传

  1. 在VSCode中点击底部状态栏的✅图标编译项目
  2. 点击→图标下载到开发板

2. 串口监控

  1. 点击底部电源插头图标打开串口监视器,这里我用的vof
    1. 按下遥控器按键观察输出:

    3. 实际效果

    • 短按按键:显示按键信息
    • 长按按键:显示0xFFFFFFFF,重复码

    七、常见问题排查

    现象

    解决方案

    无任何输出

    检查P4引脚连接,确认红外接收器VCC接5V

    键值显示0xFFFFFFFF

    此为重复码,正常现象

    部分按键无法识别

    修改keyMap数组中的对应键值

    接收距离短

    确保接收器前无遮挡,更换遥控电池

    编译报错

    清理编译缓存:pio run -t clean

     

    八、学习资源

    1. IRremote库官方文档
    2. ESP8266引脚图
    3. PlatformIO使用指南


    通过本项目的实践,可以掌握:

    • PlatformIO项目管理技巧
    • 红外通信协议解析方法
    • ESP8266 GPIO控制
    • 嵌入式系统调试技能
    • 物联网设备开发基础

    建议同学们尝试扩展以下功能:

    1. 添加OLED屏幕显示按键信息
    2. 结合MQTT实现远程控制
    3. 开发WEB配置界面
    4. 实现红外信号学习功能

相关文章:

基于VSCode+PlatformIO环境的ESP8266的HX1838红外模块

以下是针对ESP8266开发板的红外遥控解码系统开发教程&#xff0c;基于VSCodePlatformIO环境编写 一、概述 本实验通过ESP8266开发板实现&#xff1a; 红外遥控信号解码自定义按键功能映射串口监控输出基础设备控制&#xff08;LED&#xff09; 硬件组成&#xff1a; NodeMC…...

Linux中的防火墙

什么是防火墙 windows防火墙的设置 linux防火墙设置命令 什么是防火墙&#xff1f; 防火墙是一种网络安全设备&#xff0c;它能够&#xff1a; 监控和过滤进出网络的流量 阻止不安全的连接 保护计算机和网络免受未授权访问 创建一个安全边界 简单来说&#xff0c;防火…...

补补表面粗糙度的相关知识(一)

表面粗糙度&#xff0c;或简称粗糙度&#xff0c;是指表面不光滑的特性。这个在机械加工行业内可以说是绝绝的必备知识之一&#xff0c;但往往也是最容易被忽略的&#xff0c;因为往往天天接触的反而不怎么关心&#xff0c;或者没有真正的去认真学习掌握。对于像我一样&#xf…...

力扣刷题Day 46:搜索二维矩阵 II(240)

1.题目描述 2.思路 方法1&#xff1a;分别找到搜索矩阵的右、下边界&#xff0c;然后从[0][0]位置开始遍历这部分矩阵搜索目标值。 方法2&#xff1a;学习Krahets佬的思路&#xff0c;从搜索矩阵的左下角开始遍历&#xff0c;matrix[i][j] > target时消去第i行&#xff0c…...

Kubernetes 集群部署应用

部署 Nginx 应用 命令行的方式 1. 创建 deployment 控制器的 pod # --imagenginx&#xff1a;这个会从 docker.io 中拉取&#xff0c;这个网站拉不下来 # kubectl create deployment mynginx --imagenginx# 使用国内镜像源拉取 kubectl create deployment mynginx --imaged…...

Spark 处理过程转换:算子与行动算子详解

在大数据处理领域&#xff0c;Apache Spark 凭借其强大的分布式计算能力脱颖而出&#xff0c;成为处理海量数据的利器。而 Spark 的核心处理过程&#xff0c;主要通过转换算子和行动算子来实现。本文将深入探讨 Spark 中的转换算子和行动算子&#xff0c;帮助读者更好地理解和应…...

Unity3D仿星露谷物语开发42之粒子系统

1、目标 使用例子系统&#xff0c;实现割草后草掉落的特效。 通过PoolManager获取特效预制体&#xff0c;通过VFXManager来触发特效。 2、配置例子特效 在Hierarchy -> PersistentScene下创建新物体命名为Reaping。 给该物体添加Particle System组件。 配置例子系统参数…...

python 上海新闻爬虫, 东方网 + 澎湃新闻

1. 起因&#xff0c; 目的: 继续做新闻爬虫。我之前写过。此文先记录2个新闻来源。后面打算进行过滤&#xff0c;比如只选出某一个类型新闻。 2. 先看效果 过滤出某种类型的新闻&#xff0c;然后生成 html 页面&#xff0c;而且&#xff0c;自动打开这个页面。 比如科技犯罪…...

[Java实战]Spring Boot 整合 Freemarker (十一)

[Java实战]Spring Boot 整合 Freemarker (十一) 引言 Apache FreeMarker 作为一款高性能的模板引擎&#xff0c;凭借其简洁语法、卓越性能和灵活扩展性&#xff0c;在 Java Web 开发中占据重要地位。结合 Spring Boot 的自动化配置能力&#xff0c;开发者能快速构建动态页面、…...

LeetCode 高频题实战:如何优雅地序列化和反序列化字符串数组?

文章目录 摘要描述题解答案题解代码分析编码方法解码方法 示例测试及结果时间复杂度空间复杂度总结 摘要 在分布式系统中&#xff0c;数据的序列化与反序列化是常见的需求&#xff0c;尤其是在网络传输、数据存储等场景中。LeetCode 第 271 题“字符串的编码与解码”要求我们设…...

为什么拆分高低字节而不直接存入数组

您的代码片段是在将一个16位值&#xff08;&#xff09;拆分为高字节和低字节&#xff1a;IR_RF_Signal.length temp_low IR_RF_Signal.length & 0xFF; temp_high IR_RF_Signal.length >> 8; 虽然我在 PX4-Autopilot 仓库中没有找到这段确切的代码&#xff0c;…...

python打卡day22@浙大疏锦行

复习日 仔细回顾一下之前21天的内容&#xff0c;没跟上进度的同学补一下进度。 作业&#xff1a; 自行学习参考如何使用kaggle平台&#xff0c;写下使用注意点&#xff0c;并对下述比赛提交代码 一、数据预处理 import pandas as pd import numpy as np import matplo…...

C#游戏开发中的注意事项

目录 一、性能优化:提升游戏运行效率 1. 避免不必要的循环和迭代 2. 减少字符串拼接 3. 利用Unity的生命周期函数 4. 使用对象池(Object Pooling) 二、内存管理:避免内存泄漏和资源浪费 1. 及时释放非托管资源 2. 避免空引用异常 3. 合理使用引用类型和值类型 4. …...

Spring Boot项目(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot前后端分离)

下载地址&#xff1a; 前端&#xff1a;https://download.csdn.net/download/2401_83418369/90811402 后端&#xff1a;https://download.csdn.net/download/2401_83418369/90811405 一、前端vue部分的搭建 这里直接看另一期刊的搭建Vue前端工程部分 前端vue后端ssm项目_v…...

Spyglass:在batch/shell模式下运行目标的顶层是什么?

相关阅读 Spyglasshttps://blog.csdn.net/weixin_45791458/category_12828934.html?spm1001.2014.3001.5482 除了可以在图形用户界面(GUI)中运行目标外&#xff0c;使用Batch模式或Shell模式也可以运行目标&#xff0c;如下面的命令所示。 % spyglass -project test.prj -ba…...

没有Mac,我是怎么上传IPA到App Store的?

没有Mac&#xff0c;我是怎么上传IPA到App Store的&#xff1f; 最近赶一个小项目上线&#xff0c;写的是一个Flutter做的App。安卓版本一晚上搞定&#xff0c;iOS上架却差点把人整崩。 不是我技术菜&#xff0c;是实在太麻烦了。最关键的&#xff0c;是我这台Windows笔电根本…...

微服务架构中如何保证服务间通讯的安全

在微服务架构中,保证服务间通信的安全至关重要。服务间的通信通常是通过HTTP、gRPC、消息队列等方式实现的,而这些通信链路可能面临多种安全风险。为了应对这些风险,可以采取多种措施来保证通信安全。 常见的服务间通信风险 1.数据泄露:在服务间通信过程中,敏感数据可能会…...

2025-05-11 项目绩效域记忆逻辑管理

好的&#xff0c;我们可以用一个故事来帮助记忆这些规划绩效域的要素&#xff0c;同时通过逻辑关系来串联它们。以下是一个故事化的版本&#xff1a; 《项目管理的奇幻之旅》 在一个遥远的王国里&#xff0c;有一个勇敢的项目经理名叫小K。小K被国王赋予了一个艰巨的任务&…...

工具篇-Cherry Studio之MCP使用

一、添加MCP 打开Cherry Studio,如果没有可以到官网下载:Cherry Studio 官方网站 - 全能的AI助手 按上面步骤打开同步服务器 1、先去注册ModelScope,申请令牌 2、再打开MCP广场,找到高德MCP 选择工具测试,这里有个高德的api key需要申请 打开如下地址高德开放平…...

DeepSeek“智”造:解锁旅游行业新玩法

目录 一、DeepSeek 简介1.1 DeepSeek 技术原理1.2 DeepSeek 在 AI 领域地位 二、DeepSeek 在旅游攻略生成的应用2.1 生成流程展示2.2 优势分析2.3 实际案例剖析 三、DeepSeek 助力旅游宣传文案创作3.1 文案创作模式3.2 效果评估3.3 创意亮点挖掘 四、DeepSeek 优化游客咨询服务…...

LOJ 6346 线段树:关于时间 Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​)&#xff0c;另有一个存储三元组的列表 L L L. 有 m m m 个操作分两种&#xff1a; add ⁡ ( l , r , k ) \operatorname{add}(l,r,k) add(l,r,k)&#xff1a;将 ( l , r , …...

java 多核,多线程,分布式 并发编程的现状 :从本身的jdk ,到 spring ,到其它第三方。

Java 在多核、多线程和高性能编程领域提供了丰富的现成框架和工具&#xff0c;既有标准库中的并发组件&#xff0c;也有第三方框架。以下是一些关键框架及其应用场景的总结&#xff1a;便于后面我们站在巨人的肩膀上&#xff0c;继续前行 一、Java 标准库中的多线程框架 Execut…...

httpclient请求出现403

问题 httpclient请求对方服务器报403&#xff0c;用postman是可以的 解决方案: request.setHeader( “User-Agent” ,“Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0” ); // 设置请求头 原因&#xff1a; 因为没有设置为浏览器形式&#…...

Python 运维脚本

1、备份文件 import os import shutil# 定义配置文件目录和备份目录的路径 config_dir "/root/python/to/config/files/" backup_dir "/root/python/to/backup/"# 遍历配置文件目录中的所有文件 for filename in os.listdir(config_dir):# 如果文件名以…...

MySQL数据库常见面试题之三大范式

写在前面 此文章大部分不会引用最原始的概念&#xff0c;采用说人话的方式。 面试题&#xff1a;三大范式是什么&#xff1f;目的是什么&#xff1f;必须遵循吗&#xff1f; 假设有一张表&#xff08;学号&#xff0c;姓名&#xff0c;课程&#xff0c;老师&#xff09; 是…...

大模型项目:普通蓝牙音响接入DeepSeek,解锁语音交互新玩法

本文附带视频讲解 【代码宇宙019】技术方案&#xff1a;蓝牙音响接入DeepSeek&#xff0c;解锁语音交互新玩法_哔哩哔哩_bilibili 目录 效果演示 核心逻辑 技术实现 大模型对话&#xff08;技术&#xff1a; LangChain4j 接入 DeepSeek&#xff09; 语音识别&#xff08;…...

C/C++复习--C语言隐式类型转换

目录 什么是隐式类型转换&#xff1f;整型提升 规则与示例符号位扩展的底层逻辑 算术转换 类型层次与转换规则混合类型运算的陷阱 隐式转换的实际应用与问题 代码示例分析常见错误与避免方法 总结与最佳实践 1. 什么是隐式类型转换&#xff1f; 隐式类型转换是C语言在编译阶段…...

Pandas 时间处理利器:to_datetime() 与 Timestamp() 深度解析

Pandas 时间处理利器&#xff1a;to_datetime() 与 Timestamp() 深度解析 在数据分析和处理中&#xff0c;时间序列数据扮演着至关重要的角色。Pandas 库凭借其强大的时间序列处理能力&#xff0c;成为 Python 数据分析领域的佼佼者。其中&#xff0c;to_datetime() 函数和 Ti…...

单链表设计与实现

01. 单链表简介 在数据结构中&#xff0c;单链表的实现可以分为 带头结点 和 不带头结点 两种方式&#xff0c;这里我们讨论第二种方式。 头结点&#xff1a;链表第一个节点不存实际数据&#xff0c;仅作为辅助节点指向首元节点&#xff08;第一个数据节点&#xff09;。头指…...

JDS-算法开发工程师-第9批

单选题 print(fn.__default__) 哪一个不是自适应学习率的优化算法 (选项&#xff1a;Adagrad&#xff0c;RMSprop&#xff0c;Adam&#xff0c;Momentum&#xff0c;动量法在梯度下降的基础上&#xff0c;加入了“惯性”概念&#xff0c;通过累积历史的梯度更新来加速收敛&…...