//#include <Arduino.h>
#include <TM1637.h>

#define NUM_READ 20

TM1637 TM;
unsigned long previousMillisClock; 
const unsigned long intervalClock = 100;



int median(int newVal);
int findMedianN(int newVal);

void setup() {

TM.begin(8, 9, 4);
TM.displayClear();

}

void loop() {
  
unsigned long currentMillis = millis();


if( currentMillis - previousMillisClock >= intervalClock)
  {
    previousMillisClock += intervalClock; 
    //int adcValue = analogRead(A0);
    //int newVal = analogRead(A0);
    int Val = findMedianN(analogRead(A0));
    
    TM.displayFloat(Val*0.83/100);
     
  }

}

int median(int newVal) {
  static int buf[3];
  static byte count = 0;
  buf[count] = newVal;
  if (++count >= 3) count = 0;
  return (max(buf[0], buf[1]) == max(buf[1], buf[2])) ? max(buf[0], buf[2]) : max(buf[1], min(buf[0], buf[2]));
}

int findMedianN(int newVal) {
  static int buffer[NUM_READ];  // статический буфер
  static byte count = 0;    // счётчик
  buffer[count] = newVal;
  if (++count >= NUM_READ) count = 0;  // перемотка буфера
  
  int buf[NUM_READ];    // локальный буфер для медианы
  for (byte i = 0; i < NUM_READ; i++) buf[i] = buffer[i];  
  for (int i = 0; i <= (int) ((NUM_READ / 2) + 1); i++) { // пузырьковая сортировка массива (можно использовать любую)
    for (int m = 0; m < NUM_READ - i - 1; m++) {
      if (buf[m] > buf[m + 1]) {
        int buff = buf[m];
        buf[m] = buf[m + 1];
        buf[m + 1] = buff;
      }
    }
  }
  int ans = 0;
  if (NUM_READ % 2 == 0) {             // кол-во элементов в массиве четное (NUM_READ - последний индекс массива)
    ans = buf[(int) (NUM_READ / 2)];   // берем центральное
  } else {
    ans = (buf[(int) (NUM_READ / 2)] + buf[((int) (NUM_READ / 2)) + 1]) / 2; // берем среднее от двух центральных
  }
  return ans;
}
4-Digit Display