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

基于Arduino的汽车RPM值Neopixel灯带平滑亮度显示算法需求

Arduino RPM控制15像素Neopixel灯带(平滑亮度过渡实现)

核心算法逻辑

将0-8000RPM的区间线性映射到15个像素的点亮状态,拆分出完全点亮的像素数量和随RPM逐步变亮的过渡像素亮度:

  • 固定常量:总像素数PIXEL_COUNT = 15,最高RPMMAX_RPM = 8000,最大亮度MAX_BRIGHTNESS = 255
  • 单个像素对应RPM跨度:MAX_RPM / PIXEL_COUNT ≈ 533.33 RPM
  • 通过RPM占总区间的比例,计算像素点亮状态

算法步骤

  1. 计算当前RPM的归一化进度(范围0~1):

    float progress = (float)currentRPM / MAX_RPM;
    
  2. 计算完全点亮的像素数(从0开始计数):

    int fullPixels = floor(progress * PIXEL_COUNT);
    

    例:2000RPM时,progress = 0.25,fullPixels = 3(对应从1开始计数的第4个像素)

  3. 计算过渡像素的亮度:
    仅当fullPixels < PIXEL_COUNT时存在过渡像素:

    float partialProgress = (progress * PIXEL_COUNT) - fullPixels;
    int partialBrightness = round(partialProgress * MAX_BRIGHTNESS);
    

    过渡像素序号为fullPixels(从0开始),亮度随RPM提升从0平滑到255;当RPM达8000时,fullPixels = 15,所有像素全亮。

Arduino 代码示例

#include <Adafruit_NeoPixel.h>

#define PIXEL_COUNT 15
#define MAX_RPM 8000
#define MAX_BRIGHTNESS 255
#define PIXEL_PIN 6

Adafruit_NeoPixel strip(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  strip.begin();
  strip.show(); // 初始化全灭
}

void updateRPMStrip(int currentRPM) {
  // 限制RPM在合法范围
  currentRPM = constrain(currentRPM, 0, MAX_RPM);
  
  float progress = (float)currentRPM / MAX_RPM;
  int fullPixels = floor(progress * PIXEL_COUNT);
  
  // 点亮所有完全激活的像素
  for (int i = 0; i < fullPixels; i++) {
    strip.setPixelColor(i, strip.Color(255, 0, 0)); // 红色示例,可自定义颜色
  }
  
  // 处理过渡像素
  if (fullPixels < PIXEL_COUNT) {
    float partialProgress = (progress * PIXEL_COUNT) - fullPixels;
    int partialBrightness = round(partialProgress * MAX_BRIGHTNESS);
    strip.setPixelColor(fullPixels, strip.Color(partialBrightness, 0, 0));
    
    // 熄灭未激活的像素
    for (int i = fullPixels + 1; i < PIXEL_COUNT; i++) {
      strip.setPixelColor(i, strip.Color(0, 0, 0));
    }
  } else {
    // 所有像素全亮
    for (int i = 0; i < PIXEL_COUNT; i++) {
      strip.setPixelColor(i, strip.Color(255, 0, 0));
    }
  }
  
  strip.show();
}

void loop() {
  // 模拟读取RPM,实际替换为你的汽车RPM读取逻辑
  int currentRPM = analogRead(A0) * (MAX_RPM / 1023.0);
  
  updateRPMStrip(currentRPM);
  delay(50); // 刷新间隔,可按需调整
}

注意事项

  • 若按1开始计数像素,只需将代码中显示序号fullPixels加1即可
  • 可自由调整灯带颜色、刷新频率,以及RPM读取的硬件逻辑
  • 用constrain()避免RPM超出范围导致的异常显示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 09:15:34