Усреднение входных данных из нескольких входных данных за фиксированный промежуток времени (оценка)

input loop datalogging

Я пытаюсь усреднить входные значения для ряда входов, а затем сохранить эти средние значения в строку для записи в текстовый документ на SD- карте.

Я использую:

// считываем 6 датчиков и добавляем в строку:
for (int analogPin = 0; analogPin < 6; analogPin++) {
  int sensor = analogRead(analogPin);
  dataString += String(sensor);
  if (analogPin < 6) {
    dataString += ",";
  }
}

чтобы прочитать контакты в данный момент, но я хочу изменить analogRead(analogPin) на среднее значение, а затем использовать средние значения для создания строки.

но когда я пытаюсь усреднить данные, я сталкиваюсь с ошибками или получаю выходной сигнал, равный 0, хотя должен быть выше (3,3 В).

Я делаю это, чтобы немного стабилизировать свои значения и устранить дрожание.

Есть предложения?

, 👍0

Обсуждение

Можете ли вы показать нам весь ваш эскиз?, @VE7JRO

возьмите 10 показаний, отбросьте самые высокие и самые низкие, затем усредните оставшиеся 8 показаний, @jsotola

https://github.com/MajkoLibraries/Средний, @Majenko


1 ответ


Лучший ответ:

0

Эта функция усреднит показания на аналоговом выводе, включит его и использует вместо analogRead(...), и она должна сделать то, что вам нужно.

int aveAnalogRead(int pin, int ave=10, int delayms = 0)
{
    int tot = 0;
    for(int i=0; i<ave; i++)
    {
        tot += analogRead(pin);
        if(delayms) delay(delayms);
    }
    return tot/ave;
}

в вашем цикле():

for (int analogPin = 0; analogPin < 6; analogPin++) 
{
   int sensor = aveAnalogRead(analogPin);
     <<do your work here>>
}
,

Почти никогда не бывает веской причины для добавления задержки., @Edgar Bonet

С этим, хотя мне приходится запускать его несколько раз, по одному для каждого входа. Возможно ли сделать так, чтобы он также циклически проходил по входам, как цикл в цикле?, @Michael H.

да, используйте его вместо вызова analogInput выше в цикле внутри цикла, @esoterik

так что это:int pin, для (целое n=0, n<10, n++){ штифт = н; int aveAnalogRead( int ave=10, int delayms = 50) { целочисленный итог = 0; для (int i=0; i<ave; i++) { tot += analogRead(pin); задержка(delayms); } возврат всего/среднего; }}, @Michael H.

C++ работает не так; вы помещаете эту функцию где-то за пределами цикла loop() в вашем скетче, а затем вызываете функцию. Вам не нужно копировать определение функции, чтобы вызвать ее., @esoterik

@EdgarBonet зависит от того, какая у вас выборка; ее можно удалить или установить на 0, я просто хотел показать, как это сделать, на случай, если это понадобится., @esoterik