基于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. 实现红外信号学习功能

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

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

相关文章

Kubernetes排错(十四):Pod状态异常排查手册

当你在凌晨三点收到告警&#xff0c;发现Pod在崩溃循环中挣扎时&#xff0c;如何快速定位问题&#xff1f;本文将为你梳理一套生产环境通用的Pod排错流程&#xff0c;并附上救火队员必备的实用命令清单&#xff01; 一、5分钟快速定位&#xff1a;四步锁定问题方向 步骤1&…

医院药品管理系统(准备工作)

准备工作 创建数据库表 搭建Springboot框架 创建工程 定位maven 其他准备工作 创建数据库表 建了九张表 搭建Springboot框架 创建工程 定位maven 把镜像改为国内的 其他准备工作 安装Lombok插件 额外添加依赖 如果添加依赖的过程中一直爆红&#xff0c;可以刷新…

SpringBoot异步处理@Async深度解析:从基础到高阶实战

一、异步编程基础概念 1.1 同步 vs 异步 特性同步异步执行方式顺序执行&#xff0c;阻塞调用非阻塞&#xff0c;调用后立即返回线程使用单线程完成所有任务多线程并行处理响应性较差&#xff0c;需等待前任务完成较好&#xff0c;可立即响应新请求复杂度简单直观较复杂&#…

简单的强化学习举例

1&#xff0c;定义奖励函数 首先&#xff0c;需要根据具体的任务需求来定义奖励函数。例如&#xff0c;对于机器人导航任务&#xff0c;可以根据机器人与目标点的距离来定义奖励函数&#xff1a; import numpy as npdef navigation_reward(robot_position, target_position):…

css背景相关

背景书写 background: url(src); // 注意&#xff1a;在写动态样式时&#xff0c;backgournd赋值格式错误&#xff0c;是不会在浏览器dom的style上显示的 // 但是可以创建不可见的img&#xff0c;预加载来提高性能背景也会加载图片资源 同img的src一样&#xff0c;background也…

opencascade.js stp vite 调试笔记

Hello, World! | Op enCascade.js cnpm install opencascade.js cnpm install vite-plugin-wasm --save-dev 当你不知道文件写哪的时候trae还是有点用的 ‘’‘ import { defineConfig } from vite; import wasm from vite-plugin-wasm; import rollupWasm from rollup/plug…

线程的一些事(2)

在java中&#xff0c;线程的终止&#xff0c;是一种“软性”操作&#xff0c;必须要对应的线程配合&#xff0c;才能把终止落实下去 然而&#xff0c;系统原生的api其实还提供了&#xff0c;强制终止线程的操作&#xff0c;无论线程执行到哪&#xff0c;都能强行把这个线程干掉…

BGP实验练习1

需求&#xff1a; 要求五台路由器的环回地址均可以相互访问 需求分析&#xff1a; 1.图中存在五个路由器 AR1、AR2、AR3、AR4、AR5&#xff0c;分属不同自治系统&#xff08;AS&#xff09;&#xff0c;AR1 在 AS 100&#xff0c;AR2 - AR4 在 AS 200&#xff0c;AR5 在 AS …

滑动窗口——将x减到0的最小操作数

题目&#xff1a; 这个题如果我们直接去思考方法是很困难的&#xff0c;因为我们不知道下一步是在数组的左还是右操作才能使其最小。正难则反&#xff0c;思考一下&#xff0c;无论是怎么样的&#xff0c;最终这个数组都会分成三个部分左中右&#xff0c;而左右的组合就是我们…

C++ RAII机制

RAII&#xff08;Resource Acquisition Is Initialization&#xff09;是一种编程范式&#xff0c;核心思想是&#xff1a;资源的生命周期与对象绑定——对象创建时获取资源&#xff0c;对象销毁时自动释放资源。这种机制通过构造函数和析构函数的配对执行&#xff0c;确保资源…

连续抵消解码器--Successive Cancellation decoder(SC 解码器)

在这里&#xff0c;我们来看一下&#xff08;Arikan&#xff0c;2009&#xff09;中提供的连续取消解码算法。 顾名思义&#xff0c;SC解码算法从u0开始按顺序解码比特。 冻结的比特节点总是被解码为0。 在解码ui时&#xff0c;根据以下规则使用由向量表示的可用比特来解码u…

suricata之规则去重

一、环境和背景 1.1 环境 OS: Ubuntu 22.04.5 LTS IDE: vscode suricata: suricata 7.0.5 1.2 背景 在添加规则时&#xff0c;为了给规则分类&#xff0c;将不同类别的规则写入不同的文件。 在规则加载时两条不同的规则却被认为是重复的&#xff0c;因此记录一下去重逻辑。…

vue vite 无法热更新问题

一、在vue页面引入组件CustomEmployeesDialog&#xff0c;修改组件CustomEmployeesDialog无法热更新 引入方式&#xff1a; import CustomEmployeesDialog from ../dialog/customEmployeesDialog.vue 目录结构&#xff1a; 最后发现是引入import时&#xff0c;路径大小写与目…

深入理解 Linux 权限控制机制

引言 在 Linux 系统中&#xff0c;权限控制是保障系统安全的核心机制。通过限制用户对文件和资源的访问&#xff0c;它能有效防止未授权操作&#xff0c;保护数据不被篡改或泄露。合理设置权限不仅有助于实现用户隔离和最小权限原则&#xff0c;还能降低系统被滥用或攻击的风险…

Oracle版本、补丁及升级(12)——版本体系

12.1. 版本体系 Oracle作为最流行的一款关系数据库软件产品,其拥有自己一套成熟的版本管理体系。具体版本体系以12c为分界线,前后版本体系分别不同。 ​​​​​​​12.1.1. 12c之前版本 12c之前的Oracle,版本共有5位阿拉伯数字组成,其中的每位数字,都有各自的含义,具…

Maven 中的 pom.xml 文件

目录标题 1、根标签 <project> 的直接子标签顺序​2、常见子标签内部顺序​2.1、<build> 标签内部顺序2.2、<dependencies> 标签内部顺序 3、modelVersion 为什么是 4.0.0 &#xff1f;4、<parent> 标签&#xff1f;​​4.1、为什么需要 <parent>…

方案精读:华为与中软-智慧园区解决方案技术主打胶片【附全文阅读】

该文档是华为与中软国际的智慧园区轻量化解决方案推介&#xff0c;主要面向园区管理者、运营者及相关企业决策人。其核心围绕园区痛点&#xff0c;阐述智慧园区的发展趋势。 方案涵盖综合安防、便捷通行、设备管理等多领域应用场景&#xff0c;通过智能视频监控、人脸识别、远程…

# KVstorageBaseRaft-cpp 项目 RPC 模块源码学习

KVstorageBaseRaft-cpp 项目 RPC 模块源码学习 。 一、项目简介 KVstorageBaseRaft-cpp 是一个基于 Raft 一致性算法实现的分布式 KV 存储系统&#xff0c;采用 C 开发。项目的核心目标是帮助开发者理解 Raft 原理和分布式 KV 存储的基本实现。RPC 模块是分布式系统通信的关…

TeledyneLeCroy在OFC2025 EA展台上展示了其400G/800G的全包围的测试解决方案,满足了UEC联盟和UALINK联盟的技术需求

Teledyne LeCroy在OFC 2025上的EA展台 在2025年3月26日至28日于美国圣地亚哥举办的OFC&#xff08;Optical Fiber Communication Conference and Exhibition&#xff09;展会上&#xff0c;全球领先的测试测量解决方案提供商Teledyne LeCroy隆重展示了其最新研发的800G网络测试…

新一代电动门“攻克”行业痛点,远峰科技打造“智能出入”新标杆

在2025上海国际车展期间&#xff0c;远峰科技举办了一场面向车企合作伙伴和媒体的智能汽车解决方案实车展示会。 在这其中&#xff0c;远峰科技的新一代电动门首次亮相&#xff0c;突破性的解决了行业普遍存在的“运行抖动不平顺”、“窄车位车门开度过小”、“障碍物识别不准…