带有距离传感器的 Arduino IDE 中的移动平均值
Moving average in Arduino IDE with distance sensor
我在回顾之前与我的主题相关的问题时,我发现了这个:
我遇到的问题非常相似,但我想从 vl6180x adafruit 距离传感器每 150 秒重新计算一次距离平均值。
平均前 150 秒,打印结果,然后从第二个 151 到 300 打印结果并让它继续平均我的代码。
我尝试做与 link 中相同的事情,我发布了我的问题,但我无法编译代码(我正在使用 Arduino IDE 编程,我是初学者)。我的目标是用移动平均线减少信号噪声。我的代码:
#include <Wire.h>
#include "Adafruit_VL6180X.h"
#define BUF_SIZE 15
Adafruit_VL6180X vl = Adafruit_VL6180X();
float array_calculate_avg(int * buf, int len);
int buf[BUF_SIZE] = {0};
int buf_index = 0;
float buf_avg = 0.0;
int len
void setup() {
Serial.begin(115200);
// wait for serial port to open on native usb devices
while (!Serial) {
delay(1);
}
Serial.println("Adafruit VL6180x test!");
if (! vl.begin()) {
Serial.println("Failed to find sensor");
while (1);
}
Serial.println("Sensor found!");
}
void loop() {
// Reset the index and start over.
//
if (BUF_SIZE == buf_index)
{
buf_index = 0;
}
buf[buf_index++] = vl.readRange();
buf_avg = array_calculate_avg(buf, BUF_SIZE);
Serial.print(buf_avg, 4);
delay(2000);
float lux = vl.readLux(VL6180X_ALS_GAIN_5);
Serial.print("Lux: "); Serial.println(lux);
uint8_t range = vl.readRange();
uint8_t status = vl.readRangeStatus();
if (status == VL6180X_ERROR_NONE) {
Serial.print("Range: "); Serial.println(range);
}
// Some error occurred, print it out!
if ((status >= VL6180X_ERROR_SYSERR_1) && (status <= VL6180X_ERROR_SYSERR_5)) {
Serial.println("System error");
}
else if (status == VL6180X_ERROR_ECEFAIL) {
Serial.println("ECE failure");
}
else if (status == VL6180X_ERROR_NOCONVERGE) {
Serial.println("No convergence");
}
else if (status == VL6180X_ERROR_RANGEIGNORE) {
Serial.println("Ignoring range");
}
else if (status == VL6180X_ERROR_SNR) {
Serial.println("Signal/Noise error");
}
else if (status == VL6180X_ERROR_RAWUFLOW) {
Serial.println("Raw reading underflow");
}
else if (status == VL6180X_ERROR_RAWOFLOW) {
Serial.println("Raw reading overflow");
}
else if (status == VL6180X_ERROR_RANGEUFLOW) {
Serial.println("Range reading underflow");
}
else if (status == VL6180X_ERROR_RANGEOFLOW) {
Serial.println("Range reading overflow");
}
delay(50);
float
array_calculate_avg(int * buf, int len);
{
int sum = 0;
for (int i = 0; i < len; ++i)
{
sum += buf[i];
}
return ((float) sum) / ((float) len);
}
我的母语不是英语。如果我有严重的语法错误,请道歉:/
您的 loop()
函数在 float array_calculate_avg(int * buf, int len);
行之前缺少一个右大括号 }
,顺便说一下,该行的末尾也有一个分号 ;
,它不应该。
我在回顾之前与我的主题相关的问题时,我发现了这个:
我遇到的问题非常相似,但我想从 vl6180x adafruit 距离传感器每 150 秒重新计算一次距离平均值。
平均前 150 秒,打印结果,然后从第二个 151 到 300 打印结果并让它继续平均我的代码。
我尝试做与 link 中相同的事情,我发布了我的问题,但我无法编译代码(我正在使用 Arduino IDE 编程,我是初学者)。我的目标是用移动平均线减少信号噪声。我的代码:
#include <Wire.h>
#include "Adafruit_VL6180X.h"
#define BUF_SIZE 15
Adafruit_VL6180X vl = Adafruit_VL6180X();
float array_calculate_avg(int * buf, int len);
int buf[BUF_SIZE] = {0};
int buf_index = 0;
float buf_avg = 0.0;
int len
void setup() {
Serial.begin(115200);
// wait for serial port to open on native usb devices
while (!Serial) {
delay(1);
}
Serial.println("Adafruit VL6180x test!");
if (! vl.begin()) {
Serial.println("Failed to find sensor");
while (1);
}
Serial.println("Sensor found!");
}
void loop() {
// Reset the index and start over.
//
if (BUF_SIZE == buf_index)
{
buf_index = 0;
}
buf[buf_index++] = vl.readRange();
buf_avg = array_calculate_avg(buf, BUF_SIZE);
Serial.print(buf_avg, 4);
delay(2000);
float lux = vl.readLux(VL6180X_ALS_GAIN_5);
Serial.print("Lux: "); Serial.println(lux);
uint8_t range = vl.readRange();
uint8_t status = vl.readRangeStatus();
if (status == VL6180X_ERROR_NONE) {
Serial.print("Range: "); Serial.println(range);
}
// Some error occurred, print it out!
if ((status >= VL6180X_ERROR_SYSERR_1) && (status <= VL6180X_ERROR_SYSERR_5)) {
Serial.println("System error");
}
else if (status == VL6180X_ERROR_ECEFAIL) {
Serial.println("ECE failure");
}
else if (status == VL6180X_ERROR_NOCONVERGE) {
Serial.println("No convergence");
}
else if (status == VL6180X_ERROR_RANGEIGNORE) {
Serial.println("Ignoring range");
}
else if (status == VL6180X_ERROR_SNR) {
Serial.println("Signal/Noise error");
}
else if (status == VL6180X_ERROR_RAWUFLOW) {
Serial.println("Raw reading underflow");
}
else if (status == VL6180X_ERROR_RAWOFLOW) {
Serial.println("Raw reading overflow");
}
else if (status == VL6180X_ERROR_RANGEUFLOW) {
Serial.println("Range reading underflow");
}
else if (status == VL6180X_ERROR_RANGEOFLOW) {
Serial.println("Range reading overflow");
}
delay(50);
float
array_calculate_avg(int * buf, int len);
{
int sum = 0;
for (int i = 0; i < len; ++i)
{
sum += buf[i];
}
return ((float) sum) / ((float) len);
}
我的母语不是英语。如果我有严重的语法错误,请道歉:/
您的 loop()
函数在 float array_calculate_avg(int * buf, int len);
行之前缺少一个右大括号 }
,顺便说一下,该行的末尾也有一个分号 ;
,它不应该。