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
相关产品推荐
相关产品推荐

