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

如何将模拟引脚的历史读取值存储到指定数组中

如何在Arduino中存储模拟输入的历史值到二维数组?

看起来你想把模拟引脚的历史读数存入一个二维数组,其中包含上一次、上上次的A0读数,以及上一次的A1读数(重复两次)。我来帮你调整代码实现这个需求:

首先注意你原来的代码里有个小问题——你把变量u和y既用作引脚号,又用来存储模拟读数,这会覆盖引脚值,导致后续出错。我们应该把引脚定义和读数变量分开。

完整实现代码

// 定义引脚常量
const int u_pin = A0;
const int y_pin = A1;

// 存储历史值的二维数组
float z[4][1] = {{0}, {0}, {0}, {0}};

// 保存历史读数的变量
float last_u = 0;      // 上一次的A0读数(对应u(n-1))
float last_last_u = 0; // 上上次的A0读数(对应u(n-2))
float last_y = 0;      // 上一次的A1读数(对应y(n-1))

void setup() {
  Serial.begin(9600);
  pinMode(u_pin, INPUT);
  pinMode(y_pin, INPUT);
  
  // 初始化历史值为第一次读取的结果,避免数组初始全为0
  last_u = analogRead(u_pin);
  last_last_u = last_u;
  last_y = analogRead(y_pin);
  
  // 初始化数组的初始状态
  z[0][0] = last_u;
  z[1][0] = last_last_u;
  z[2][0] = last_y;
  z[3][0] = last_y;
}

void loop() {
  // 1. 更新数组z,用上一轮的历史值
  z[0][0] = last_u;      // 赋值u(n-1)
  z[1][0] = last_last_u; // 赋值u(n-2)
  z[2][0] = last_y;      // 赋值y(n-1)
  z[3][0] = last_y;      // 重复赋值y(n-1)

  // 2. 读取当前的模拟输入值
  float current_u = analogRead(u_pin);
  float current_y = analogRead(y_pin);

  // 3. 更新历史变量,为下一轮循环做准备
  last_last_u = last_u;  // 把上一次的u转为上上次的u
  last_u = current_u;    // 把当前的u转为下一轮的"上一次u"
  last_y = current_y;    // 把当前的y转为下一轮的"上一次y"

  // 可选:打印数组内容,方便调试观察
  Serial.println("当前z数组内容:");
  for (int i = 0; i < 4; i++) {
    Serial.print("z[");
    Serial.print(i);
    Serial.print("][0] = ");
    Serial.println(z[i][0]);
  }
  Serial.println("-------------------");
  
  delay(1000); // 延迟1秒,方便观察串口输出
}

代码工作逻辑说明

  • 我们用三个单独的变量保存历史读数,这样每次循环都能直接获取需要的上一次/上上次值,避免数组移位的复杂操作。
  • setup函数中先读取一次引脚值初始化变量和数组,解决初始状态全为0的问题。
  • loop函数的流程是先更新数组→再读新值→最后更新历史变量,这样数组里始终存储的是上一轮循环的读数,完全符合你需要的u(n-1)、u(n-2)、y(n-1)的赋值效果。

如果不需要二维数组,也可以把z改成一维数组float z[4] = {0, 0, 0, 0};,使用时直接写z[0]、z[1]即可,逻辑完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:44:09