Пороговая логика: сигнализация по показанию

Станция уже умеет считывать показание в инженерных единицах. Пора научить её принимать решение по этому показанию — это ядро мехатроники: датчик → условие → сигнал.

Приборная панель с тремя зонами индикации: зелёная, жёлтая, красная

После урока сможешь: строить многоступенчатую пороговую логику (if/else if/else), комбинировать условия через && и ||. В конце — «сигнализация порога»: три уровня реакции на показание датчика.

Вспомни: в Python-курсе ты уже собирал «Контроллер порога» — реакцию на показание датчика по условию (занятие 3 первого курса). Логика та же: сравниваем значение с порогом и решаем, что делать. Разница в том, что сейчас показание приходит с настоящего (симулированного) входа, а не из переменной, которую задал сам.

От одного порога к трём уровням: else if

Одного if/else хватает на два исхода. Станции нужно три: норма, предупреждение, авария. Для этого между if и else вставляют else if — «а если не то, то проверь ещё вот это». Проверка идёт по порядку, сверху вниз, и выполняется только ПЕРВАЯ подходящая ветка — остальные пропускаются, даже если тоже подошли бы.

int syroe = analogRead(A0);
int temperatura = map(syroe, 0, 1023, -20, 60);

if (temperatura > 40) {
  Serial.println("Авария");
} else if (temperatura > 30) {
  Serial.println("Предупреждение");
} else {
  Serial.println("Норма");
}
Норма
  Лесенка if / else if / else (проверка сверху вниз):

  temperatura > 40 ? --да--> "Авария"
        | нет
        v
  temperatura > 30 ? --да--> "Предупреждение"
        | нет
        v
       "Норма"

  Выполнится РОВНО ОДНА ветка — первая, что подошла.

Порядок условий важен: если бы первой проверкой стояло temperatura > 30, то при 45 градусах сработала бы ветка «Предупреждение», а до «Авария» дело бы не дошло. Проверять нужно от самого строгого условия к самому мягкому.

Составные условия: && (И) и || (ИЛИ)

Иногда авария наступает не при одном, а при нескольких условиях сразу. && означает «И» — истинно, только если ОБА условия истинны. || означает «ИЛИ» — истинно, если истинно ХОТЯ БЫ ОДНО условие.

if (temperatura > 40 || temperatura < -10) {
  Serial.println("Авария: недопустимая температура");
}
  Таблица && и ||:

  A       B       A && B     A || B
  истина  истина  истина     истина
  истина  ложь    ложь       истина
  ложь    истина  ложь       истина
  ложь    ложь    ложь       ложь

  && — оба должны быть истинны.  || — достаточно одного.

Миссия: сигнализация порога

Подключи потенциометр к A0 и светодиод к пину 9. Переведи сигнал в диапазон -20..60 (температура). Если температура выше 40 — включи светодиод и выведи «Авария»; если от 30 до 40 — выключи светодиод и выведи «Предупреждение»; иначе — выключи светодиод и выведи «Норма».

void setup() {
  pinMode(9, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int syroe = analogRead(A0);
  int temperatura = map(syroe, 0, 1023, -20, 60);

  if (temperatura > 40) {
    digitalWrite(9, HIGH);
    Serial.println("Авария");
  } else if (temperatura > 30) {
    digitalWrite(9, LOW);
    Serial.println("Предупреждение");
  } else {
    digitalWrite(9, LOW);
    Serial.println("Норма");
  }
  delay(300);
}

Проверь себя

Контрольный вопрос. Для чего нужен else if между if и else?

АДосрочно завершить программу
БПроверить ещё одно условие, если первое оказалось ложным
ВПовторить проверку первого условия ещё раз

Подсказка: else if добавляет промежуточную проверку между «да» и «во всех остальных случаях».

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

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

Контрольный вопрос. Сколько ветвей цепочки if/else if/else выполнится за один проход, если условия не пересекаются по смыслу?

АНи одной, если истинных условий больше одного
БРовно одна — первая, что оказалась истинной
ВВсе истинные ветки подряд

Подсказка: Проверка идёт сверху вниз и останавливается на первом подходящем условии.

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

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

Контрольный вопрос. temperatura равна 25. Что выведется?

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

if (temperatura > 40) {
  Serial.println("Авария");
} else if (temperatura > 30) {
  Serial.println("Предупреждение");
} else {
  Serial.println("Норма");
}
АНорма
БАвария
ВПредупреждение

Подсказка: 25 не больше 40 и не больше 30 — какая ветка остаётся?

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

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

Контрольный вопрос. temperatura равна 35. Что выведется?

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

if (temperatura > 40) {
  Serial.println("Авария");
} else if (temperatura > 30) {
  Serial.println("Предупреждение");
} else {
  Serial.println("Норма");
}
АПредупреждение
БНорма
ВАвария

Подсказка: 35 не больше 40, но больше 30 — какая ветка подходит?

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

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

Контрольный вопрос. temperatura равна 45. Что выведется?

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

if (temperatura > 40) {
  Serial.println("Авария");
} else if (temperatura > 30) {
  Serial.println("Предупреждение");
} else {
  Serial.println("Норма");
}
ААвария
БПредупреждение
ВНорма

Подсказка: 45 больше 40 — какая ветка проверяется первой и сразу подходит?

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

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

Контрольный вопрос. Условие (a > 10 && b < 5) истинно. Что это значит?

АХотя бы одно из двух: a больше 10 ИЛИ b меньше 5
БНи одно из условий неважно, если истинно хоть одно
ВИ a больше 10, И b меньше 5 — одновременно

Подсказка: && — это «И». Для истинности нужны ОБА условия сразу.

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

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

Контрольный вопрос. temperatura равна -15. Сработает ли сигнализация «Авария: недопустимая температура»?

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

if (temperatura > 40 || temperatura < -10) {
  Serial.println("Авария: недопустимая температура");
}
АНет — -15 не больше 40, значит условие ложно
БНет — оба условия должны быть истинны одновременно
ВДа — -15 меньше -10, второе условие истинно, а для || достаточно одного

Подсказка: || требует истинности хотя бы одного условия, а не обоих сразу.

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

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

Контрольный вопрос. temperatura равна 45, oboroty равны 600. Сработает ли условие?

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

if (temperatura > 40 && oboroty < 500) {
  Serial.println("Авария: перегрев на низких оборотах");
}
Анет
Бда

Подсказка: && требует ИСТИННОСТИ ОБОИХ условий одновременно — проверь каждое по отдельности.

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

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

Контрольный вопрос. В этом коде одно и то же показание сравнивается с порогами по всей цепочке else if — та же переменная используется в остальных ветках. Какое имя должно стоять вместо ___ в первой строке (эта ветка обязана стоять ПЕРЕД проверкой «больше 50», иначе она никогда не сработает)?

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

if (___ > 80) {
  Serial.println("Критично");
} else if (davlenie > 50) {
  Serial.println("Повышено");
} else {
  Serial.println("Норма");
}
Аtemperatura
Бdavlenie
Вurovenj

Подсказка: Посмотри, какая переменная уже стоит в ветке else if чуть ниже — в первой строке должна быть та же самая.

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

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

Задание. Напиши код сам (if/else if/else, 6 строк). В переменной urovenj — показание (0..100). Если больше 90 — выведи «Перелив»; если больше 70 — выведи «Заполнено»; иначе — выведи «Норма».

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

int urovenj = map(analogRead(A0), 0, 1023, 0, 100);
// напиши if/else if/else по описанию выше

Подсказка: Проверяй от самого строгого порога (90) к самому мягкому, иначе более мягкое условие перехватит проверку раньше.

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

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

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

Контрольный вопрос. Станция должна сигналить и «Авария», и «Предупреждение» отдельно, но выводит только одно сообщение за раз, хотя оба условия истинны. В чём причина такого поведения?

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

if (temperatura > 40) {
  Serial.println("Авария");
} else if (temperatura > 30) {
  Serial.println("Предупреждение");
}
АЭто ошибка компиляции — код не должен был запуститься
БSerial.println работает только один раз за всю программу
ВЭто ожидаемое поведение else if — выполняется только первая подошедшая ветка

Подсказка: Вспомни правило из блока «От одного порога к трём уровням»: else if выполняет ровно одну ветку.

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

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

Контрольный вопрос. temperatura равна 32, oboroty равны 300. Что выведет программа?

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

if (temperatura > 40 && oboroty > 1000) {
  Serial.println("Авария");
} else if (temperatura > 30 || oboroty < 400) {
  Serial.println("Предупреждение");
} else {
  Serial.println("Норма");
}
АНорма
БПредупреждение
ВАвария

Подсказка: Сначала проверь первое условие целиком (оба ли верны для &&), потом второе (достаточно одного для ||).

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

Задание. Напиши программу целиком (около 12 строк). Пин 9 — светодиод (выход). Считай A0, переведи в диапазон -20..60 (temperatura). Три уровня: выше 40 ИЛИ ниже -10 — включи светодиод и выведи «Авария»; от 25 до 40 (не включая границы) — выключи светодиод и выведи «Предупреждение»; иначе — выключи светодиод и выведи «Норма». Пауза 300 миллисекунд.

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

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

Подсказка: Первая ветка — составное условие с ||; вторая ветка — обычное сравнение (else if уже гарантирует, что температура не выше 40 и не ниже -10, поэтому достаточно проверить нижнюю границу 25).

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

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

Что дальше

Теперь станция принимает решение по показанию — три уровня реакции. Но пока весь код выполняется по очереди с задержками delay(). На следующем занятии научимся вести несколько процессов «одновременно» без блокировки — через millis().

Итог: ты строишь многоступенчатую пороговую логику через if/else if/else и комбинируешь условия через && и ||. Дальше — неблокирующее время: несколько процессов сразу.

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

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