You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart/Flutter中如何实现类似Arduino map的数值范围映射功能

Dart/Flutter 实现Arduino map() 函数方案

Flutter 和 Dart 标准库没有内置和Arduino map() 完全等价的现成函数,直接复刻Arduino原生逻辑写个工具函数就行,行为可以做到完全一致。

首先明确Arduino 原生map()的核心逻辑:它是纯整数运算,默认不会自动把结果钳制在目标区间,运算公式为:

返回值 = (输入值 - 原区间下限) * (目标区间上限 - 目标区间下限) / (原区间上限 - 原区间下限) + 目标区间下限
这里的除法是整数除法,直接截断小数部分,不做四舍五入。

对应Dart里的实现可以直接写为:

int arduinoMap(int value, int fromLow, int fromHigh, int toLow, int toHigh) {
  return (value - fromLow) * (toHigh - toLow) ~/ (fromHigh - fromLow) + toLow;
}

这里用Dart的~/整数运算符,和Arduino的整数除法行为完全匹配,不要用普通除法转double再取整,边界值上容易出现1个计数的误差。

你要做的ADC值映射场景,用法和Arduino完全一致:

// rawAdc 为采集到的0~4095范围的int类型ADC原始值
int variable = arduinoMap(rawAdc, 0, 4095, 0, 100);

补充说明

  • 上述实现和Arduino原生map行为完全一致:如果输入值超出原区间(比如ADC采样因为干扰读到4100或者-5),输出值也会对应超出0~100的目标区间。如果需要强制把结果限制在目标范围内,可以直接调用Dart内置的clamp方法:
    int variable = arduinoMap(rawAdc, 0, 4095, 0, 100).clamp(0, 100);
    
  • 如果需要支持浮点类型的映射,把参数和返回值改成num类型,把~/换成普通除法即可,但那就和Arduino原生的整数map行为有差异了,针对ADC采样的场景用纯整数实现就完全够用。

内容的提问来源于stack exchange,提问作者Juicy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 04:54:28