Загрузка данных


#define ADC_PIN 34

// ===== НАСТРОЙКИ =====
const unsigned long MEASURE_TIME = 10000; // 10 секунд
const int SAMPLE_DELAY = 5;

// Максимум ~2000 измерений за 10 секунд
const int MAX_SAMPLES = 2200;

int samples[MAX_SAMPLES];
int sampleCount;


// ===== НАЗВАНИЯ КНОПОК =====

const char* buttons[] = {
  "CRUISE_OFF",
  "RES_PLUS",
  "SET_MINUS",
  "CRUISE_ON",

  "NEXT",
  "PREV",
  "VOL_PLUS",
  "VOL_MINUS",
  "MODE",
  "PHONE_ANSWER",
  "MUTE"
};

const int BUTTON_COUNT =
  sizeof(buttons) / sizeof(buttons[0]);


// ===== СОРТИРОВКА =====

void sortSamples(int* arr, int size) {

  for (int i = 0; i < size - 1; i++) {

    for (int j = i + 1; j < size; j++) {

      if (arr[j] < arr[i]) {

        int temp = arr[i];

        arr[i] = arr[j];
        arr[j] = temp;
      }
    }
  }
}


// ===== ИЗМЕРЕНИЕ КНОПКИ =====

void measureButton(const char* buttonName) {

  Serial.println();
  Serial.println("========================================");
  Serial.print("КНОПКА: ");
  Serial.println(buttonName);
  Serial.println("========================================");

  Serial.println();
  Serial.println("ЗАЖМИ КНОПКУ И ДЕРЖИ 10 СЕКУНД!");

  delay(2000);

  Serial.println(">>> НАЧАЛО ИЗМЕРЕНИЯ <<<");

  sampleCount = 0;

  unsigned long startTime = millis();

  while (millis() - startTime < MEASURE_TIME) {

    if (sampleCount < MAX_SAMPLES) {

      samples[sampleCount] = analogRead(ADC_PIN);

      sampleCount++;
    }

    delay(SAMPLE_DELAY);
  }

  Serial.println(">>> ИЗМЕРЕНИЕ ЗАКОНЧЕНО <<<");

  Serial.println();
  Serial.println("ОТПУСТИ КНОПКУ.");

  // -------------------------
  // СОРТИРОВКА
  // -------------------------

  int sorted[MAX_SAMPLES];

  for (int i = 0; i < sampleCount; i++) {
    sorted[i] = samples[i];
  }

  sortSamples(sorted, sampleCount);


  // -------------------------
  // MIN / MAX
  // -------------------------

  int minValue = sorted[0];

  int maxValue = sorted[sampleCount - 1];


  // -------------------------
  // MEDIAN
  // -------------------------

  int median;

  if (sampleCount % 2 == 0) {

    median =
      (sorted[sampleCount / 2 - 1] +
       sorted[sampleCount / 2]) / 2;

  } else {

    median = sorted[sampleCount / 2];
  }


  // -------------------------
  // AVERAGE
  // -------------------------

  long long sum = 0;

  for (int i = 0; i < sampleCount; i++) {

    sum += samples[i];
  }

  float average =
    (float)sum / sampleCount;


  // -------------------------
  // STANDARD DEVIATION
  // -------------------------

  double variance = 0;

  for (int i = 0; i < sampleCount; i++) {

    double difference =
      samples[i] - average;

    variance +=
      difference * difference;
  }

  variance /= sampleCount;

  double stdDev = sqrt(variance);


  // -------------------------
  // РЕЗУЛЬТАТ
  // -------------------------

  Serial.println();
  Serial.println("----------------------------------------");
  Serial.print("BUTTON: ");
  Serial.println(buttonName);

  Serial.print("SAMPLES = ");
  Serial.println(sampleCount);

  Serial.print("MIN     = ");
  Serial.println(minValue);

  Serial.print("MAX     = ");
  Serial.println(maxValue);

  Serial.print("AVG     = ");
  Serial.println(average, 2);

  Serial.print("MEDIAN  = ");
  Serial.println(median);

  Serial.print("STD     = ");
  Serial.println(stdDev, 2);

  Serial.println();

  Serial.print("ADC_REFERENCE = ");
  Serial.println(median);

  Serial.println("----------------------------------------");

  delay(2000);
}


// ===== SETUP =====

void setup() {

  Serial.begin(115200);

  analogReadResolution(12);

  analogSetPinAttenuation(
    ADC_PIN,
    ADC_11db
  );

  delay(1000);

  Serial.println();
  Serial.println("========================================");
  Serial.println("       ADC BUTTON LEARNING MODE");
  Serial.println("========================================");

  Serial.println();
  Serial.println("GPIO34");
  Serial.println("ADC resolution: 12 bit");
  Serial.println("Range: 0...4095");

  Serial.println();
  Serial.println("Всего кнопок: 11");

  delay(3000);


  // ===== ПРОВЕРКА ПОКОЯ =====

  Serial.println();
  Serial.println("ПРОВЕРКА СОСТОЯНИЯ ПОКОЯ");
  Serial.println("Все кнопки отпусти.");

  delay(3000);

  long idleSum = 0;

  const int IDLE_SAMPLES = 500;

  int idleMin = 4095;
  int idleMax = 0;

  for (int i = 0; i < IDLE_SAMPLES; i++) {

    int adc = analogRead(ADC_PIN);

    idleSum += adc;

    if (adc < idleMin)
      idleMin = adc;

    if (adc > idleMax)
      idleMax = adc;

    delay(5);
  }

  float idleAverage =
    (float)idleSum / IDLE_SAMPLES;


  Serial.println();
  Serial.println("----- IDLE -----");

  Serial.print("MIN = ");
  Serial.println(idleMin);

  Serial.print("MAX = ");
  Serial.println(idleMax);

  Serial.print("AVG = ");
  Serial.println(idleAverage, 2);

  Serial.println("----------------");


  // ===== ОБУЧЕНИЕ КНОПОК =====

  delay(2000);

  for (int i = 0; i < BUTTON_COUNT; i++) {

    Serial.println();
    Serial.println("########################################");

    Serial.print("СЛЕДУЮЩАЯ КНОПКА: ");
    Serial.println(buttons[i]);

    Serial.println("########################################");

    delay(2000);

    measureButton(buttons[i]);
  }


  // ===== КОНЕЦ =====

  Serial.println();
  Serial.println("========================================");
  Serial.println("       ОБУЧЕНИЕ ЗАКОНЧЕНО");
  Serial.println("========================================");

  Serial.println();
  Serial.println("Скопируй результаты сюда.");
}


// ===== LOOP =====

void loop() {
}