```C++ ################################################ // бегущее среднее float k = 0.1; // коэффициент фильтрации, 0.0-1.0 float expRunningAverage(float newVal) { static float filVal = 0; filVal += (newVal - filVal) * k; return filVal; } ################################################ // медиана на 3 значения со своим буфером float medianRoom(float newValRoom) { static float bufRoom[3] = {0, 0, 0}; if (!(bufRoom[0] + bufRoom[1] + bufRoom[2])) bufRoom[0] = bufRoom[1] = bufRoom[2] = newValRoom; static byte countRoom = 0; bufRoom[countRoom] = newValRoom; if (++countRoom >= 3) countRoom = 0; float dataRoom = (max(bufRoom[0], bufRoom[1]) == max(bufRoom[1], bufRoom[2])) ? max(bufRoom[0], bufRoom[2]) : max(bufRoom[1], min(bufRoom[0], bufRoom[2])); // return expRunningAverage(data); return dataRoom; } ################################################ # это не совсем средние это апериодичное звено или простейший фильтр НЧ , и он имеет зону не чувствительности, скользящие средние делается через массив, код для ПЫКов , ну думаю разберетесь. unsigned int ReadADC_AN0(void) { static unsigned char s_ucCount;   static unsigned int  m_TempResalt[32];   static unsigned int  s_uiSymm;     s_ucCount++;   s_ucCount&=0b00011111;   s_uiSymm -= m_TempResalt[s_ucCount];   __delay_us(20);    ADCON0bits.GO_DONE=1;   while(ADCON0bits.GO_DONE) continue;   __delay_us(5);   m_TempResalt[s_ucCount] = ADRESH;   m_TempResalt[s_ucCount]<<=8;   m_TempResalt[s_ucCount]+= ADRESL;   s_uiSymm += m_TempResalt[s_ucCount];   return s_uiSymm/32;    } ################################################ // AVR: Усредняем показания: // revOld = старое значение uint16_t filtr(uint16_t rev) { static uint8_t a = pow(2, KOEFF) - 1; (revOld > rev / KOEFF) ? revOld = (a * revOld + rev) >> KOEFF : revOld = rev; return revOld; } ################################################ ################################################ ```