Аналоговый вход: датчик и map()

Кнопка из прошлого занятия умела только два состояния: нажата или нет. Реальные датчики — температуры, освещённости, давления — выдают не два состояния, а плавно меняющийся сигнал. Сегодня научим станцию читать такой сигнал и переводить его в инженерные единицы.

Потенциометр на макетной плате рядом с Arduino, стрелка показывает поворот ручки

После урока сможешь: подключить потенциометр как модель аналогового датчика, считать сигнал командой analogRead, перевести «сырое» число в инженерную единицу командой map(). В конце — «инженерный вход»: программа показывает показание в понятных единицах.

Аналоговый сигнал: не два состояния, а диапазон

Подключи в Wokwi компонент «Potentiometer» — крайние ножки к 5V и GND, среднюю (ползунок) — к пину A0. Поворачивая ручку, ты меняешь напряжение на A0 плавно — от почти 0 до почти максимума. Так же ведёт себя настоящий аналоговый датчик (например, освещённости или давления): его сигнал — не HIGH/LOW, а величина в диапазоне.

Подключение потенциометра к плате Arduino: три провода к 5V, GND и A0

analogRead — считать аналоговый сигнал

Команда analogRead(A0) возвращает число от 0 до 1023 (1024 возможных значения — так устроен аналого-цифровой преобразователь платы). 0 — минимальное напряжение на входе, 1023 — максимальное. Аналоговые пины не настраивают через pinMode — они готовы к работе сразу.

void setup() {
  Serial.begin(9600);
}

void loop() {
  int znachenie = analogRead(A0);
  Serial.println(znachenie);
  delay(300);
}
512
514
690
...
  Диапазон аналогового сигнала:

  0 ------------------- 512 ------------------- 1023
  мин. напряжение     середина            макс. напряжение

  analogRead(A0) всегда возвращает целое число из этого диапазона

map() — переводим в инженерные единицы

Число «0..1023» само по себе неинформативно — инженеру нужны проценты, градусы, паскали. Команда map(значение, из_мин, из_макс, в_мин, в_макс) пересчитывает значение из одного диапазона в другой. Например, переведём 0..1023 в проценты заполнения бака 0..100:

void setup() {
  Serial.begin(9600);
}

void loop() {
  int syroe = analogRead(A0);
  int procent = map(syroe, 0, 1023, 0, 100);
  Serial.print("Заполнение бака: ");
  Serial.print(procent);
  Serial.println("%");
  delay(300);
}
Заполнение бака: 50%
  map(значение, 0, 1023, 0, 100) — пересчёт диапазона:

  вход:   0 .......... 512 .......... 1023
  выход:  0 ..........  50 ..........  100

  map масштабирует пропорционально: середина входа -> середина выхода

map() округляет до целого числа (дробную часть отбрасывает, не округляет по правилам математики). Для инженерных величин, где важна точность, дальше пригодится и float — но для показаний датчика на дашборде целых процентов обычно достаточно.

Миссия: инженерный вход

Подключи потенциометр к A0. Напиши программу, которая переводит сигнал в диапазон 0..200 (представь, что это давление в кПа) и печатает «Давление: N кПа». Покрути ручку и посмотри, как меняется значение.

void setup() {
  Serial.begin(9600);
}

void loop() {
  int syroe = analogRead(A0);
  int davlenie = map(syroe, 0, 1023, 0, 200);
  Serial.print("Давление: ");
  Serial.print(davlenie);
  Serial.println(" кПа");
  delay(300);
}

Проверь себя

Контрольный вопрос. Какой диапазон значений возвращает analogRead()?

АОт 0 до 100
БОт 0 до 1023
ВОт 0 до 1 (HIGH/LOW)

Подсказка: Это разбиралось в блоке «analogRead — считать аналоговый сигнал».

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. Что делает команда map(значение, из_мин, из_макс, в_мин, в_макс)?

АСравнивает два значения между собой
БСчитывает сигнал с аналогового пина
ВПересчитывает значение из одного диапазона в другой

Подсказка: map по-английски — «отображать, сопоставлять». Речь о переводе одной шкалы в другую.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. Ручка потенциометра повёрнута точно до упора в максимум. Что вернёт analogRead(A0)? Впиши число.

Подсказка: Максимум входного диапазона аналогового сигнала — это верхняя граница из блока «Аналоговый сигнал».

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. Что выведет программа, если analogRead(A0) вернул ровно 0? Впиши число.

Исходный код для этого задания:

int syroe = analogRead(A0);
int procent = map(syroe, 0, 1023, 0, 100);
Serial.println(procent);

Подсказка: Входное значение здесь — самая нижняя граница диапазона analogRead. Посмотри четвёртый аргумент map() — какое число там стоит для нижней границы выхода?

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. Что выведет программа, если analogRead(A0) вернул ровно 1023?

Исходный код для этого задания:

int syroe = analogRead(A0);
int procent = map(syroe, 0, 1023, 0, 100);
Serial.println(procent);
А0
Б50
В100

Подсказка: 1023 на входе — это верхняя граница входного диапазона map.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Задание. Напиши код сам. Допиши команду вместо ___, которая считывает аналоговый сигнал с пина A0 в переменную syroe.

Исходный код для этого задания:

int syroe = ___(A0);

Подсказка: Эта команда была введена в материале, когда объяснялось, как считать значение с аналогового пина — если не помнишь точное имя, перечитай тот раздел.

✅ Готово, если: программа запускается без ошибок и выводит то, что просят в задании.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Задание. Напиши код сам. В переменной syroe уже лежит аналоговое значение (0..1023). Напиши команду map(), которая переводит его в диапазон 0..50 (сохрани результат в переменную urovenj).

Исходный код для этого задания:

int syroe = analogRead(A0);
// напиши ниже команду map для перевода 0..1023 в 0..50

Подсказка: Шаблон: map(значение, из_мин, из_макс, в_мин, в_макс).

✅ Готово, если: программа запускается без ошибок и выводит то, что просят в задании.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. Программа должна выводить процент 0..100, но при повороте ручки в максимум печатает 200. Что перепутано в вызове map()?

Исходный код для этого задания:

int syroe = analogRead(A0);
int procent = map(syroe, 0, 1023, 0, 200);
Serial.println(procent);
АanalogRead возвращает не то значение
БВ первом аргументе map() указано syroe вместо analogRead(A0)
ВВ последнем аргументе map() указано 200 вместо 100 — это выходной максимум

Подсказка: Четвёртый и пятый аргументы map() — это границы ВЫХОДНОГО диапазона.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. analogRead(A0) вернул 256 (ровно четверть от 1023). Что выведет программа? Впиши число.

Исходный код для этого задания:

int syroe = analogRead(A0);
int procent = map(syroe, 0, 1023, 0, 100);
Serial.println(procent);

Подсказка: map масштабирует пропорционально: четверть входного диапазона даёт примерно четверть выходного.

Онлайн-проверка ответа появится позже

Задание. Напиши код сам (2 строки). В переменной syroe — аналоговое значение. Переведи его в диапазон 0..200 (представь — это давление в кПа) и выведи строку вида «Давление: 100 кПа» (число подставь из переменной).

Исходный код для этого задания:

int syroe = analogRead(A0);
// напиши: map в переменную davlenie и Serial.print строки "Давление: N кПа"

Подсказка: Сначала map(syroe, 0, 1023, 0, 200) в переменную, потом Serial.print/Serial.println частями строки, как на прошлом занятии с f-строкой в Python — только здесь через несколько Serial.print подряд.

✅ Готово, если: программа запускается без ошибок и выводит то, что просят в задании.

Онлайн-проверка ответа появится позже

Задание. Напиши программу целиком (setup + loop, около 7 строк). Считывай A0, переводи в диапазон 0..500 (единица — обороты), выводи «Обороты: N» и жди 250 миллисекунд.

Исходный код для этого задания:

// напиши setup() и loop() целиком по описанию выше

Подсказка: В setup — только Serial.begin (аналоговый пин настраивать не нужно); в loop — analogRead в переменную, map в другую переменную, Serial.print частями, delay(250).

✅ Готово, если: программа запускается без ошибок и выводит то, что просят в задании.

Онлайн-проверка ответа появится позже

Контрольный вопрос. analogRead(A0) вернул 767 (три четверти от 1023, округлённо). Диапазон вывода — 0..40. Что выведет программа? Впиши число.

Исходный код для этого задания:

int syroe = analogRead(A0);
int temperatura = map(syroe, 0, 1023, 0, 40);
Serial.println(temperatura);

Подсказка: Три четверти входного диапазона дают примерно три четверти выходного диапазона. Посчитай три четверти от 40.

Онлайн-проверка ответа появится позже

Задание. Напиши программу целиком (около 9 строк). Считывай A0. Переведи значение в диапазон -20..40 (это температура в градусах, диапазон может быть отрицательным). Выведи строку вида «Температура: N C», где N — посчитанное значение. Пауза 300 миллисекунд.

Исходный код для этого задания:

// напиши setup() и loop() целиком; диапазон вывода map — -20..40

Подсказка: map умеет работать с отрицательными границами диапазона так же, как с положительными: map(syroe, 0, 1023, -20, 40).

✅ Готово, если: программа запускается без ошибок и выводит то, что просят в задании.

Онлайн-проверка ответа появится позже

Что дальше

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

Итог: ты подключил аналоговый вход, считываешь сигнал через analogRead и переводишь его в инженерные единицы через map(). Дальше — пороговая логика: реакция станции на показание.

Назад  ·  ↑ В начало урока  ·  ⌂ В начало курса  ·  Вперёд →

Школа Виктора Комлева