Arduino低功耗实战:用休眠模式+看门狗打造超省电传感器节点(附完整代码)

Arduino的睡眠模式,低功耗模式实现 看门狗定时器(Watchdog Timer,简称WDT)是微控器内部的「当机」监控器,若微控器当掉了,它会自动重新启动微控器。其运作原理是,看门狗内部有个定时器,微处理器必须每隔一段时间,向看门狗发出一个信号,重设定时器值。 阅读详情

Arduino低功耗实战:用休眠模式+看门狗打造超省电传感器节点(附完整代码)

你是否曾设想过,将一个由电池供电的传感器节点部署在野外,让它持续工作数月甚至数年?这听起来像是天方夜谭,毕竟Arduino Uno在正常运行时动辄消耗几十毫安的电流,一块小小的电池可能撑不过几天。然而,这正是低功耗设计的魅力所在——通过巧妙地让微控制器“睡觉”,我们能够将平均电流从毫安级降至微安级,从而实现超长续航。今天,我们就来深入探讨如何将Arduino的休眠模式与看门狗定时器结合,构建一个既能周期工作又能稳定运行的超省电传感器节点。我会分享实测的电流数据、不同唤醒方式的功耗差异,以及一些在实战中避免系统“睡过头”或“乱醒”的关键技巧。

1. 理解Arduino的“睡眠”与“守夜人”

在深入代码之前,我们必须先厘清两个核心概念:休眠模式和看门狗定时器。它们一个负责“节流”,一个负责“守时”,共同构成了低功耗系统的基石。

1.1 休眠模式:不仅仅是“关机”

Arduino所采用的AVR微控制器(如ATmega328P)提供了多种休眠模式,其本质是通过关闭或降低不同内部模块的时钟频率来减少功耗。很多人误以为休眠就是完全关机,其实不然。不同的休眠模式保留了不同功能模块的运行,功耗和唤醒方式也因此各异。

对于电池供电的传感器节点,我们最关心的是 SLEEP_MODE_PWR_DOWN(掉电模式)。在这种模式下,CPU和几乎所有内部时钟都停止了,只有少数几个模块能保持活动状态以响应唤醒事件。这是功耗最低的模式,也是我们实现超长待机的关键。

注意:进入休眠模式前,务必处理好所有可能产生中断的引脚状态,例如将未使用且可能浮空的数字输入引脚设置为INPUT_PULLUP,否则微小的噪声就可能意外唤醒MCU。

为了直观对比不同模式下的功耗差异,我实测了Arduino Nano(使用独立的ATmega328P芯片,移除电源指示灯和稳压器)在不同模式下的电流消耗:

工作模式 典型电流消耗 (3.3V) 可用的唤醒源
正常运行 (16MHz) ~9.5 mA N/A
Idle (空闲) 模式 ~3.5 mA 所有中断、定时器、ADC等
ADC Noise Reduction ~1.2 mA ADC转换完成、外部中断等
Power-down (掉电) 模式 ~0.35 µA 外部中断、看门狗、引脚电平变化

从表格可以清晰地看到,PWR_DOWN模式的电流消耗比正常运行低了四个数量级!这意味着,如果我们的传感器99%的时间都在休眠,那么平均电流将主要由那1%的活跃工作时间决定。

1.2 看门狗定时器:不只是系统“看门人”

看门狗定时器(Watchdog Timer, WDT)通常被描述为系统的“看门狗”,在程序跑飞时通过复位来拯救系统。这固然是其核心功能,但在低功耗设计中,它扮演了另一个至关重要的角色:一个独立于主时钟的低功耗定时器。

为什么这一点如此重要?因为在PWR_DOWN模式下,主振荡器已经停止,我们无法使用常规的millis()或delay()来计时。此时,看门狗定时器因其由独立的内部128kHz振荡器驱动,成为了实现周期性唤醒的唯一可靠选择。我们可以将其配置为在特定时间后产生中断,而不是复位,从而将系统从深度睡眠中唤醒。

看门狗的超时时间可以通过配置寄存器进行设置,提供了从16毫秒到8秒不等的多个档位。这对于需要定时采样(如每10分钟读取一次温湿度)的传感器节点来说,是完美的“闹钟”。

// 看门狗超时时间常量 (WDTO_xx) 与实际时间对应关系
// WDTO_15MS  -> ~16ms
// WDTO_30MS  -> ~32ms
// WDTO_60MS  -> ~64ms
// WDTO_120MS -> ~128ms
// WDTO_250MS -> ~250ms
// WDTO_500MS -> ~500ms
// WDTO_1S    -> ~1秒
// WDTO_2S    -> ~2秒
// WDTO_4S    -> ~4秒
// WDTO_8S    -> ~8秒

2. 构建你的第一个超低功耗传感器节点

理论

ESP32-S3休眠模式深度解析与XIAO开发板低功耗实战指南 在物联网和嵌入式系统开发中,功耗管理是决定设备续航能力的关键技术。其核心原理是通过控制芯片不同功能模块的电源状态,在满足功能需求的前提下最小化能量消耗。这项技术的核心价值在于能够显著延长电池供电设备的运行时间,从数月到数年不等,这对于环境监测、智能农业、远程传感器等无人值守应用场景至关重要。实现有效的功耗管理需要深入理解处理器的电源域、内存保持机制以及外设时钟门控。以ESP32-S3芯片为例,其提供了从活动模式到休眠模式的多种功耗状态。本文聚焦于**深度睡眠**和**ULP协处理器**这两个关键热词,详细阐 阅读详情

相关推荐

ATtiny85 AVR MCU深度解析:从低功耗设计到可靠性实战

微控制器(MCU)是嵌入式系统的核心,其架构与指令集效率直接影响代码执行性能与功耗。以经典的8位RISC内核为例,精简指令集和哈佛架构确保了单周期指令执行与流水线操作,为实时控制任务提供了基础。理解MCU的底层运作机制,如中断响应和低功耗模式,对于开发可靠、高效的嵌入式产品至关重要。这些技术价值在物联网传感器节点、电池供电设备等对功耗和成本敏感的应用场景中尤为突出。本文聚焦于ATtiny85这款AVR MCU,它凭借极致的性价比和灵活的低功耗管理,成为实践MCU开发流程和固件加密理念的绝佳平台。通过深入解析

weixin_34268169的博客 543

Arduino Nano(ATmega328P)电源管理与休眠模式研究

深入剖析Arduino Nano(ATmega328P)的多种休眠模式与低功耗设计技巧,结合实际电路与代码演示如何显著延长电池供电设备续航。聚焦arduino nano平台特性,详解看门狗定时器唤醒、外部中断触发及熔丝位配置等关键操作,助你打造高效节能的嵌入式应用。

weixin_42405592的博客 341

TMP102 Qwiic温度传感器:从I2C原理到低功耗物联网应用实战

在嵌入式系统和物联网项目中,环境温度监测是基础且关键的需求。I2C(Inter-Integrated Circuit)作为一种广泛使用的同步、多主从、串行计算机总线,以其简单的两线制(SDA和SCL)和标准化的协议,成为连接微控制器与各种外设传感器的主流通信方式。其工作原理基于主从架构和开漏输出,通过上拉电阻和时钟同步实现可靠的数据传输。这项技术的核心价值在于极大地简化了硬件连接与软件驱动开发,提升了系统的模块化程度和可靠性。在智能家居、环境监测、工业控制等场景中,基于I2C的数字传感器因其精度高、抗干扰能

leonard61306500的专栏 325

基于Arduino与Si7021的低功耗温湿度监控系统设计与实现

温湿度监控是环境感知与物联网应用中的基础技术,其核心在于通过传感器采集环境数据并进行智能判断。系统通常由传感器、微控制器和电源管理模块构成,其中低功耗设计是延长电池寿命的关键。通过硬件定时器(如TPL5110)实现事件驱动的电源管理,系统可在绝大部分时间处于零功耗状态,仅在需要时唤醒进行测量与报警,从而将能量集中于有效工作。这种设计在需要长期无人值守监测的场景中具有极高价值,例如仓储管理、农业大棚或贵重物品保存。本文以**Si7021传感器**和**TPL5110定时器**为核心,详细阐述了如何构建一个适用

weixin_28719225的博客 541

TMP102数字温度传感器:从I²C通信到低功耗监测的完整实践指南

数字温度传感器是现代嵌入式系统中环境监测的核心组件,它通过将物理温度转换为数字信号,为微控制器提供精确、稳定的数据输入。其工作原理通常基于半导体PN结的温度特性或热敏电阻的阻值变化,通过内部ADC和数字接口实现信号转换与传输。在物联网、工业控制、消费电子等领域,数字温度传感器是实现智能温控、设备保护及数据采集的关键技术。I²C(Inter-Integrated Circuit)总线作为一种广泛应用的同步串行通信协议,以其简洁的两线制(SDA数据线和SCL时钟线)和多主多从架构,成为连接微控制器与各类传感器、

weixin_33904756的博客 387

Arduino项目实战:从环境监测到物联网通信的十大经典案例

嵌入式开发是连接物理世界与数字世界的桥梁,其核心在于通过微控制器采集传感器数据、控制执行器,并实现智能决策。Arduino作为开源硬件平台,以其易用的开发环境和丰富的库支持,大幅降低了嵌入式开发的门槛,让开发者能够快速实现从概念到原型的验证。在物联网和智能硬件领域,Arduino常被用于数据采集、设备控制和通信协议实现。通过实际项目,如基于ESP32的环境监测站,开发者可以掌握传感器数据采集、Wi-Fi连接及云端数据上传(如使用Blynk或ThingSpeak平台)的全流程。而利用PID算法实现的恒温控制系

weixin_34216107的博客 410

基于Arduino与树莓派的低成本智能浮标:海洋环境监测开源方案

物联网数据采集与嵌入式系统开发是构建环境监测节点的核心技术基础。其原理在于通过微控制器连接各类传感器,采集物理世界信息,并经由无线通信模块传输至数据处理中心。这项技术的核心价值在于能够实现低成本、低功耗的远程自动化监测,极大地降低了科研与环保项目的实施门槛。在海洋环境监测、水质分析、气象观测等应用场景中,这类系统发挥着关键作用。本文以智能浮标项目为例,详细阐述了如何利用Arduino Nano、Raspberry Pi Zero等开源硬件,结合3D打印与传感器数据融合技术,构建一个用于波浪、水温数据采集的可

weixin_33724659的博客 401

【雕爷学编程】Arduino月球基地之采用低功耗设计以延长电池寿命

然而,Arduino平台的硬件限制、专业性和深度方面的局限性,以及环境模拟的限制,可能对某些复杂任务和专业应用造成一定的限制。需要注意的是,这个程序中的初始化动态电压调节和处理数据的算法是根据假设的硬件和功能来定义的,实际应用中需要根据实际硬件和功能进行定义。需要注意的是,这个程序中的初始化低功耗模式和处理数据的算法是根据假设的硬件和功能来定义的,实际应用中需要根据实际硬件和功能进行定义。此外,在设计和开发过程中,需要进行充分的测试和验证,以确保低功耗设计的可靠性和稳定性,以满足月球基地的长期运行需求。

雕爷学编程 1159

Arduino UNO 的低功耗睡眠模式及代码示例

这是最低功耗的睡眠模式,它将关闭大部分 Arduino 功能,并将 CPU 和系统时钟停止。在Arduino UNO上,有几种不同的睡眠模式可供选择,每种模式对应不同的功耗水平和可唤醒条件。这是最低功耗的睡眠模式,它将关闭大部分Arduino功能,并将CPU和系统时钟停止。当引脚上发生状态变化时,将触发中断,并唤醒 Arduino。请注意,为了使外部中断引脚能够唤醒 Arduino,你需要将引脚设置为输入模式,并使用。请注意,为了使外部中断引脚能够唤醒Arduino,你需要将引脚设置为输入模式,并使用。

AvuMap的博客 1168

避坑指南:将大华官方Java SDK无缝迁移到SpringBoot 2.x项目的完整流程

本文详细介绍了如何将大华官方Java SDK无缝迁移到SpringBoot 2.x项目,重点解决内存管理、连接池设计和异步处理等核心问题。通过设备连接池化、异步非阻塞接口改造和内存管理优化,实现刷卡、刷脸等认证功能的高效整合,提升Web服务的稳定性和性能。

weixin_42557830的博客 418

UE5新手必看:如何在UMG控件中嵌入浏览器实现Web页面展示(附完整步骤)

本文为UE5新手提供了在UMG控件中无缝集成Web浏览器的完整实战指南。详细介绍了从启用WebBrowser插件、创建并配置WebBrowser控件蓝图,到编写动态加载与交互逻辑,以及在游戏关卡中实例化UI的全过程。文章还分享了性能优化技巧与常见问题排查方法,帮助开发者高效实现游戏UI内的Web页面展示与交互。

weixin_29243063的博客 713

Halcon dyn_threshold详解

dyn_threshold 原型 dyn_threshold(OrigImage, ThresholdImage : RegionDynThresh : Offset, LightDark : ) 功能 利用局部阈值分割图像 参数列表 OrigImage (input_object):原始图像 ThresholdImage (input_object):处理后图像(一般采用滤波处理) RegionDynThresh (output_object):分割后区域 Offset (input_control):灰

ZiLiangQin的博客 1万+

西门子OMAC PackML V2022在S7-1200/S7-1500中的状态机设计与应用实践

本文详细解析了西门子OMAC PackML V2022在S7-1200/S7-1500中的状态机设计与应用实践。通过实际案例和代码示例,介绍了状态机的基础认知、硬件配置、逻辑开发、调试技巧以及与MES系统集成的高级应用,帮助工程师高效实现设备自动化控制。

weixin_29255731的博客 536

华为OD机试真题 新系统 2026-06-10 C++ 实现【设备重排SN】

通信设备SN一般是包含:字母、数字,用'-'(破折号)进行分组分割,例如:8F-3T-1G-2n是一个有效的SN地址。 现在要对已经存在的SN 按照新的规则进行重排:

MISAYAONE的博客 133

【23】OpenCV C++实战篇——张正友相机标定【相机标定原理、相机标定流程、标定结果评价、图像畸变矫正】

R是3×3的正交单位矩阵(即旋转矩阵),t为平移向量,R、t与摄像机无关,所以称这两个参数为摄像机的外参数(extrinsicparameter),可以理解为两个坐标原点之间的距离,因其受x,y,z三个方向上的分量共同控制,所以其具有三个自由度。R是3×3的正交单位矩阵(即旋转矩阵),t为平移向量,R、t与摄像机无关,所以称这两个参数为摄像机的外参数(extrinsicparameter),可以理解为两个坐标原点之间的距离,因其受x,y,z三个方向上的分量共同控制,所以其具有三个自由度。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 4479

掌握RDMA核心:从同步构建到异步事件的连接艺术

本文深入解析RDMA编程中的双模式设计,揭示同步配置与异步事件机制的协作关系。第一部分阐述同步函数rdma_bind_addr和rdma_listen的本地化角色,强调它们仅完成本地端点配置。第二部分剖析异步事件模型,重点分析连接请求和建立事件的处理流程。通过完整生命周期序列图展示两种模式的交互过程,并提供错误处理、资源管理和性能调优的实用建议。文章指出,理解同步本地配置与异步网络响应这一责任划分,是掌握RDMA编程的关键所在。

数字人生 283

CMake是什么?为什么学习CMake

CMake的主要作用和重要性,包括其在跨平台构建中的应用、如何支持多种编译器及操作系统,以及它在管理大型和复杂项目中的优势。

小鱼酱的博客 3874

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

上一篇: Cocos Creator 3.x WebView通信全攻略:从传参到回调的完整解决方案
下一篇: Vue 3 defineOptions 实战解析:提升组件开发效率的现代方案
linux6sysadmin
博客等级 码龄4年 59粉丝 1615原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值