//#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;
}