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

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

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()?
Подсказка: Это разбиралось в блоке «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);Подсказка: 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);Подсказка: Четвёртый и пятый аргументы 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(). Дальше — пороговая логика: реакция станции на показание.
