玩物联网第 5 期:使用CH348芯片IO端口,控制红外灯和传感器报警
系统拓扑视频地址 https://v.douyin.com/i2voy4xqrhonode-red流json数据[{id: cd3040d39f7937b9,type: tab,label: 按钮控制红外灯、报警,disabled: false,info: ,env: []},{id: 117c0905ee03d996,type: serial out,z: cd3040d39f7937b9,name: ttyUSB7-红外模块,serial: 28fe9f413d88b88a,x: 510,y: 40,wires: []},{id: d506bf92bb2fcf4e,type: function,z: cd3040d39f7937b9,name: 开/关灯红外码,func: // lightStatus灯状态为关false时才进入if中去开灯\nif (!flow.get(\lightStatus\)) {\n // 开灯 红外码\n msg.payload Buffer.from(\6863000022DC08B20446D5014347454745464646464645464646464646D50143D50143D50143D50143D50143D50143D50143D5014446464646464646464943494346464646D50144D50144D50144D50143D50144D40144D40144D026E50895024B1B16\, \hex\);\n // flow.set(\lightStatus\, true); // 将灯状态设置为true\n} else {\n // 关灯 红外码\n msg.payload Buffer.from(\6863000022DE08B50443D5014347454745474547454745474547454745D50143D50143D50143D60143D60143D60143D501424745D60143474547454745474547454745D501434745D50143D50143D50142D60142D50143D50143D326DD089902471616\, \hex\);\n // flow.set(\lightStatus\, false); // 将灯状态设置为false\n}\nreturn msg;,outputs: 1,timeout: 0,noerr: 0,initialize: ,finalize: ,libs: [],x: 300,y: 40,wires: [[117c0905ee03d996]]},{id: af1307849d80a689,type: inject,z: cd3040d39f7937b9,name: 开/关 按钮,props: [{p: payload},{p: topic,vt: str}],repeat: ,crontab: ,once: false,onceDelay: 0.1,topic: ,payload: ,payloadType: date,x: 120,y: 40,wires: [[d506bf92bb2fcf4e]]},{id: a43122b200bae615,type: modbus-write,z: cd3040d39f7937b9,name: 设置报警温度上限值,showStatusActivities: false,showErrors: false,showWarnings: true,unitid: 1,dataType: MHoldingRegisters,adr: 608,quantity: 2,server: c5ccfb4a6c3e3160,emptyMsgOnFail: false,keepMsgProperties: false,delayOnStart: false,startDelayTime: ,x: 480,y: 180,wires: [[],[]]},{id: e3a87633109033f3,type: inject,z: cd3040d39f7937b9,name: 报警0度,props: [{p: payload}],repeat: ,crontab: ,once: false,onceDelay: 0.1,topic: ,payload: 0,payloadType: str,x: 120,y: 100,wires: [[3a6032ad23f4711d]]},{id: 6a56f001cff6514d,type: inject,z: cd3040d39f7937b9,name: 报警99度,props: [{p: payload}],repeat: ,crontab: ,once: false,onceDelay: 0.1,topic: ,payload: 99,payloadType: str,x: 130,y: 160,wires: [[3a6032ad23f4711d]]},{id: 3a6032ad23f4711d,type: function,z: cd3040d39f7937b9,name: 转换成CDAB格式,func: // 将温度字符串变number(数字)\n// let temperature Number(msg.payload);\n\nlet temperature flow.get(\alarmStatus\)?0:99;\n\nif (isNaN(temperature)) {\n node.error(\温度不是有效数字\);\n return null;\n}\n\n// 声明buffer变量(二进制容器)\nlet buffer Buffer.alloc(4);\n\n// 将温度值写入buffer\nbuffer.writeFloatBE(temperature, 0);\n\n// 将温度值转为CDAB格式\nmsg.payload [\n buffer.readUInt16BE(2), // 从第2格开始读2字节 → 00 00(CD低字)\n buffer.readUInt16BE(0) // 从第0格开始读2字节 → 42 A0(AB高字)\n];\nreturn msg;,outputs: 1,timeout: 0,noerr: 0,initialize: ,finalize: ,libs: [],x: 310,y: 120,wires: [[a43122b200bae615]]},{id: b917608ef48e5d4c,type: exec,z: cd3040d39f7937b9,command: /home/ch348/ch348_gpio,addpay: payload,append: ,useSpawn: false,timer: 0.06,winHide: false,oldrc: false,name: ,x: 490,y: 280,wires: [[9f7cbc3216d30517],[],[]]},{id: ac52f4da0539aaa8,type: inject,z: cd3040d39f7937b9,name: 绿LED,props: [{p: payload},{p: topic,vt: str}],repeat: ,crontab: ,once: false,onceDelay: 0.1,topic: ,payload: ,payloadType: date,x: 90,y: 360,wires: [[831d7acbe495de40]]},{id: 831d7acbe495de40,type: function,z: cd3040d39f7937b9,name: 输出控制指令,func: // // ledStatus状态为关false时调用“输出高电平”指令\n// if(!flow.get(\ledStatus\)) {\n// msg.payload \write 1 1\; // gpio1设置为高电平\n// flow.set(\ledStatus\, true); // LED状态设置为true\n// } else {\n// // ledStatus状态为关true时调用“输出低电平”指令\n// msg.payload \write 1 0\; // gpio1设置为低电平\n// flow.set(\ledStatus\, false); // LED状态设置false\n// }\nmsg.payload \write 1 \ (flow.get(\lightStatus\)?0:1);\nreturn msg;,outputs: 1,timeout: 0,noerr: 0,initialize: ,finalize: ,libs: [],x: 240,y: 360,wires: [[b917608ef48e5d4c]]},{id: 8290cf21c15ab7b6,type: inject,z: cd3040d39f7937b9,name: 红LED,props: [{p: payload},{p: topic,vt: str}],repeat: ,crontab: ,once: false,onceDelay: 0.1,topic: ,payload: ,payloadType: date,x: 90,y: 420,wires: [[90e7c4c93927fd96]]},{id: 90e7c4c93927fd96,type: function,z: cd3040d39f7937b9,name: 输出控制指令,func: // // ledStatus状态为关false时调用“输出高电平”指令\n// if(!flow.get(\redLedStatus\)) {\n// msg.payload \write 10 1\; // gpio10设置为高电平\n// flow.set(\redLedStatus\, true); // LED状态设置为true\n// } else {\n// // ledStatus状态为关true时调用“输出低电平”指令\n// msg.payload \write 10 0\; // gpio10设置为低电平\n// flow.set(\redLedStatus\, false); // LED状态设置false\n// }\nmsg.payload \write 10 \ (flow.get(\alarmStatus\)?1:0);\nreturn msg;,outputs: 1,timeout: 0,noerr: 0,initialize: ,finalize: ,libs: [],x: 240,y: 420,wires: [[b917608ef48e5d4c]]},{id: 531c61bc00a810b5,type: inject,z: cd3040d39f7937b9,name: 检测按钮B,props: [{p: payload},{p: topic,vt: str}],repeat: 0.5,crontab: ,once: true,onceDelay: 0.6,topic: ,payload: read 6,payloadType: str,x: 140,y: 300,wires: [[b917608ef48e5d4c]]},{id: 6c4a01e1a873c298,type: inject,z: cd3040d39f7937b9,name: 检测按钮A,props: [{p: payload},{p: topic,vt: str}],repeat: 0.5,crontab: ,once: false,onceDelay: 0.1,topic: ,payload: read 5,payloadType: str,x: 140,y: 240,wires: [[b917608ef48e5d4c]]},{id: 9f7cbc3216d30517,type: function,z: cd3040d39f7937b9,name: 解析exec节点输出,func: // 1. 强转 exec 节点输出的文本并去除首尾空格\nlet rawText msg.payload.toString().trim();\n\ntry {\n // 2. 专业操作将标准的 JSON 字符串解析成 JavaScript 纯对象\n let res JSON.parse(rawText);\n \n // 3. 直接通过属性和纯数字进行精准、专业的工控逻辑判断\n if (res.data.pin 5 res.data.value 1) {\n msg.payload \✅ 按钮 A被按下\;\n flow.set(\lightStatus\, !flow.get(\lightStatus\)); // 设置红外灯状态\n return msg;\n } \n else if (res.data.pin 6 res.data.value 1) {\n msg.payload \ 按钮 B被按下\;\n flow.set(\alarmStatus\, !flow.get(\alarmStatus\)); // 设置报警状态\n return msg;\n }\n} catch (error) {\n // 驱动程序输出了非 JSON 错误信息避免节点奔溃\n node.error(\JSON 数据解析失败原始文本为: \ rawText);\n}\nreturn null;,outputs: 1,timeout: 0,noerr: 0,initialize: ,finalize: ,libs: [],x: 490,y: 360,wires: [[ebc3cb76c0bac34e,d506bf92bb2fcf4e,831d7acbe495de40,3a6032ad23f4711d,90e7c4c93927fd96]]},{id: ebc3cb76c0bac34e,type: debug,z: cd3040d39f7937b9,name: debug 1,active: true,tosidebar: true,console: false,tostatus: false,complete: false,statusVal: ,statusType: auto,x: 680,y: 360,wires: []},{id: 28fe9f413d88b88a,type: serial-port,name: ttyUSB7-红外模块,serialport: /dev/ttyCH9344USB7,serialbaud: 115200,databits: 8,parity: none,stopbits: 1,waitfor: ,dtr: none,rts: none,cts: none,dsr: none,newline: \\n,bin: false,out: char,addchar: ,responsetimeout: 10000},{id: c5ccfb4a6c3e3160,type: modbus-client,name: ttyUSB0,clienttype: simpleser,bufferCommands: true,stateLogEnabled: false,queueLogEnabled: false,failureLogEnabled: true,tcpHost: 127.0.0.1,tcpPort: 502,tcpType: DEFAULT,serialPort: /dev/ttyUSB0,serialType: RTU-BUFFERD,serialBaudrate: 9600,serialDatabits: 8,serialStopbits: 1,serialParity: none,serialConnectionDelay: 100,serialAsciiResponseStartDelimiter: 0x3A,unit_id: 1,commandDelay: 1,clientTimeout: 20,reconnectOnTimeout: false,reconnectTimeout: 20,parallelUnitIdsAllowed: true,showErrors: false,showWarnings: true,showLogs: true},{id: 085c3b93156b9d02,type: global-config,env: [],modules: {node-red-node-serialport: 2.0.3,node-red-contrib-modbus: 5.45.2}}]

相关新闻

RuoYi-Vue-Plus Docker 部署踩坑:MySQL 中文双重编码的根因与修复

RuoYi-Vue-Plus Docker 部署踩坑:MySQL 中文双重编码的根因与修复

现象 用 docker-compose 部署完 RuoYi-Vue-Plus 后,打开前端页面: ✅ 正常:按钮文字「新增」「修改」「删除」、表头「角色名称」「权限字符」❌ 乱码:左侧菜单、面包屑、表格中的中文角色名 乱码长这样:Ÿ¡†…

2026/10/17 1:25:45 阅读更多 →
AI电子宠物技术解析:从QQ宠物到Codex伴侣

AI电子宠物技术解析:从QQ宠物到Codex伴侣

1. 桌面电子宠物的文艺复兴:从QQ宠物到AI伴侣 2005年,一只胖乎乎的企鹅从QQ客户端右下角蹦出来,对着1.5亿中国网民喊"主人好"的场景,构成了千禧年初最鲜活的互联网记忆。如今OpenAI用Codex技术让电子宠物以全新形态回归…

2026/10/14 4:28:31 阅读更多 →
GPT-5.6 Sol在Cerebras上实现750 TPS:AI智能体工作流的响应速度革命

GPT-5.6 Sol在Cerebras上实现750 TPS:AI智能体工作流的响应速度革命

1. 先搞清楚GPT-5.6 Sol在Cerebras上的750 TPS到底意味着什么看到GPT-5.6 Sol在Cerebras上达到750 TPS(每秒处理750个token)这个数字,很多人的第一反应可能是“文本生成变快了”。但实际测试和工程部署经验告诉我,这个数字背后真正…

2026/10/16 9:57:14 阅读更多 →

最新新闻

信用评分模型全流程解析:从Y定义到上线监控

信用评分模型全流程解析:从Y定义到上线监控

1. 建模前的整体思路与目标定义做信用评分模型这件事,不少人一上来就急着找数据、跑特征、调参,结果模型做出来漂亮得很,KS到0.4,AUC到0.8,真到了业务侧一用就傻眼——审批通过率掉了、坏账没降多少、业务方天天来问“…

2026/10/17 20:17:23 阅读更多 →
Flutter for OpenHarmony实战:个人中心模块开发与鸿蒙适配要点

Flutter for OpenHarmony实战:个人中心模块开发与鸿蒙适配要点

去年做移动数据使用监管助手App的跨端适配时,团队锁定了Flutter for OpenHarmony这套技术栈,而我负责的个人中心模块是整个App里最磨人的部分。它既要展示头像、昵称、套餐余量这些静态资料,又要实时渲染今日已用流量、后台耗流排行、监控开关…

2026/10/17 20:17:23 阅读更多 →
Azkaban工作流调度实战:从核心概念到生产环境避坑指南

Azkaban工作流调度实战:从核心概念到生产环境避坑指南

1. 从一次凌晨告警说起:为什么我最终选了Azkaban凌晨两点,手机响了。某个核心报表任务没跑出来,下游十几个依赖任务全部卡住,业务方在群里已经炸了锅。我爬起来打开调度平台,发现是上游一个数据同步任务因为源库连接超…

2026/10/17 20:17:23 阅读更多 →
Flutter适配OpenHarmony:项目详情页跨端迁移实战与踩坑记录

Flutter适配OpenHarmony:项目详情页跨端迁移实战与踩坑记录

最近接了一个活儿,把团队里一款“软件开发助手”App用Flutter适配到OpenHarmony系统上,我负责的是里面最硬的一块——项目详情页。这个页面承载的信息密度极高,涉及项目基本信息、README文档、版本记录、文件结构、环境配置等多个模块&#x…

2026/10/17 20:17:23 阅读更多 →
物理AI新范式:机器人从“执行指令”到“理解世界”

物理AI新范式:机器人从“执行指令”到“理解世界”

一次给工业机器人做抓取测试时,我遇到了一个很有代表性的场景:机器人把杯子抓起来,杯壁太滑,中途脱手。系统倒是没慌,干脆利落地弹出一条“抓取失败,请人工干预”的报警,然后停在原地等我去处理…

2026/10/17 20:17:23 阅读更多 →
PCB软硬结合设计降本指南:叠层、弯折半径与工艺验证

PCB软硬结合设计降本指南:叠层、弯折半径与工艺验证

简介:一项关于印制电路板软硬结合设计的技术资料,面向硬件工程师、电路板布局设计师及电子制造相关人群,主要解决移动设备小型化、低成本高可靠性要求下,传统刚性板配接电缆方案带来的连接器成本高、虚焊风险大等问题。文档从成本…

2026/10/17 20:16:22 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →