如何将模拟引脚的历史读取值存储到指定数组中
如何在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
相关产品推荐
相关产品推荐

