Загрузка данных
#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() {
}