Калибровка аналогового датчика (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