Главная chevron_right Уроки chevron_right Встроенные примеры chevron_right Аналоговые примеры chevron_right Калибровка аналогового датчика (Calibrate Sensor Input)

Калибровка аналогового датчика (Calibrate Sensor Input)

Узнайте, как автоматически калибровать аналоговый датчик на Arduino: скетч за первые 5 секунд определяет минимум и максимум диапазона и использует их для нормализации показаний.

В этом уроке разбирается классический приём калибровки аналогового датчика прямо во время запуска устройства. Плата несколько секунд «слушает» датчик, запоминает крайние значения — минимум и максимум — и затем использует их как ориентиры для всех последующих измерений. Это избавляет от необходимости жёстко прописывать диапазон в коде: он подстраивается под реальные условия окружающей среды.

Как это работает

Первые пять секунд после включения скетч непрерывно читает датчик и обновляет переменные calMin и calMax. После этого периода диапазон зафиксирован, и функция map() переводит любое новое показание в диапазон 0–255, который удобно использовать для управления яркостью светодиода через analogWrite().

Такой подход особенно полезен с фоторезисторами и другими датчиками, чьи абсолютные значения сильно зависят от условий: освещённости, температуры, положения.

Необходимые компоненты

  • Arduino Board
  • светодиод (LED)
  • аналоговый датчик (например, фоторезистор)
  • резистор 10 кОм
  • резистор 220 Ом
  • соединительные провода
  • макетная плата (breadboard)

Схема подключения

Аналоговый датчик (фоторезистор или потенциометр) подключается к аналоговому входу A0. Светодиод подключается к цифровому выходу ~9.

Схема подключения: фоторезистор подключён к аналоговому входу A0 Arduino UNO, светодиод с резистором — к цифровому выходу ~9.

Фоторезистор соедините с выводом 5V, а его второй конец — с пином A0 и через резистор 10 кОм на GND (делитель напряжения). Светодиод подключите к пину ~9 через ограничивающий резистор 220 Ом.

Принципиальная схема

Принципиальная схема: фоторезистор (PHOTORESISTOR) и резистор 10 кОм (10kΩ RESISTOR) образуют делитель напряжения на входе A0; светодиод (LED) с резистором 220 Ом (220 Ω RESISTOR) подключён к выходу ~9 Arduino UNO.

Код

Начальные значения переменных

До функции setup() задаются стартовые значения для минимума и максимума:

int sensorMin = 1023;        // минимальное значение датчика
int sensorMax = 0;           // максимальное значение датчика

На первый взгляд кажется, что всё перепутано: минимум выставлен очень высоким, а максимум — очень низким. Но именно в этом и смысл. Любое реальное показание датчика окажется меньше начального «минимума» — и сразу обновит его. Аналогично любое показание будет больше начального «максимума» — и обновит его:

// калибровка в течение первых пяти секунд
while (millis() < 5000) {
sensorValue = analogRead(sensorPin);
// запись максимального значения датчика
if (sensorValue > sensorMax) {
sensorMax = sensorValue;
}
// запись минимального значения датчика
if (sensorValue < sensorMin) {
sensorMin = sensorValue;
}
}

После пяти секунд калибровки переменные calMin и calMax содержат реальный диапазон датчика в текущих условиях. Теперь любое новое показание можно привести к диапазону 0–255:

// применение калибровки к показаниям датчика
sensorValue = map(sensorValue, sensorMin, sensorMax, 0, 255);

Полный скетч

Практические замечания

  • Период калибровки — пять секунд, но вы можете изменить это значение. Для медленно меняющихся датчиков стоит увеличить время.
  • Индикация калибровки — удобно мигать встроенным светодиодом на LED_BUILTIN во время калибровки, чтобы пользователь знал: сейчас нужно показать датчику весь диапазон условий (поднести руку к фоторезистору или, наоборот, направить его на яркий источник света).
  • Функция constrain() — значение, полученное через map(), может выйти за пределы 0–255, если датчик выдаёт показания вне откалиброванного диапазона. Оберните результат в constrain(value, 0, 255) для надёжности.

Типичные ошибки

  • Датчик не двигали во время калибровки. Если в первые пять секунд условия не менялись, calMin и calMax окажутся почти одинаковыми, и map() будет давать некорректные результаты. Во время калибровки обязательно показывайте датчику крайние значения диапазона.
  • Перепутаны пины. Убедитесь, что светодиод подключён именно к ШИМ-пину (помечен ~), иначе analogWrite() не будет плавно регулировать яркость.
  • Делитель напряжения собран неправильно. Если подтягивающий резистор 10 кОм подключён к 5V вместо GND, показания будут инвертированы.

Как проверить результат

Откройте Serial Monitor и добавьте в loop() вывод текущего значения после map(). Закрывайте и открывайте фоторезистор рукой — значение должно плавно меняться от 0 до 255. Яркость светодиода при этом должна меняться соответственно.

Где пригодится

  • Управление яркостью подсветки в зависимости от освещения комнаты.
  • Нормализация показаний датчика влажности почвы для разных типов грунта.
  • Адаптация порогов срабатывания сигнализации под конкретное помещение.

Дополнительные материалы

Больше базовых примеров вы найдёте в разделе built-in examples.

Подробное описание всех функций языка Arduino доступно в language reference.

Последнее обновление: 29.07.2015, SM