Итоговый проект, часть 2: сигнализация и защита

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

Полностью собранная станция мониторинга с датчиками, светодиодом тревоги и дашбордом на экране

После урока сможешь: строить пороговую логику по нескольким показаниям сразу, управлять сигнализацией по результату, собрать и объяснить готовую станцию мониторинга целиком.

Статус станции: три уровня по двум показаниям

Станция уже считает среднюю температуру и процент освещённости. Добавим решение: «Авария», если средняя температура выше 35 или ниже 0 — это должно проверяться ПЕРВЫМ (самое строгое условие, как в занятии про пороговую логику); «Предупреждение» — если температура в диапазоне повышенного риска (28..35) ИЛИ освещённость подозрительно низкая (меньше 10%, датчик мог быть закрыт); иначе — «Норма».

String status;
int pinLed = 9;

if (srednyayaTemperatura > 35 || srednyayaTemperatura < 0) {
  status = "Авария";
  digitalWrite(pinLed, HIGH);
} else if ((srednyayaTemperatura > 28 && srednyayaTemperatura <= 35) || svetProcent < 10) {
  status = "Предупреждение";
  digitalWrite(pinLed, LOW);
} else {
  status = "Норма";
  digitalWrite(pinLed, LOW);
}

Serial.print("Статус: ");
Serial.println(status);
Статус: Норма
  Итоговая лесенка статуса станции:

  temp > 35 ИЛИ temp < 0 ?  --да--> "Авария" (LED включён)
        | нет
        v
  (28 < temp <= 35) ИЛИ свет < 10 ?  --да--> "Предупреждение" (LED выключен)
        | нет
        v
       "Норма" (LED выключен)

Миссия: собери станцию целиком

Возьми программу из прошлого занятия (датчиковая часть) и добавь: пин 9 как выход для светодиода в setup(), блок определения статуса выше, вывод статуса в дашборд. Запусти и проверь все три состояния, меняя показания (ручку LDR можно закрыть рукой в Wokwi, температуру DHT22 в Wokwi можно менять в панели свойств компонента).

Защита проекта

На занятии с преподавателем объясни своими словами: (1) зачем нужны ДВА датчика и что каждый измеряет; (2) почему показания читаются через millis(), а не delay(); (3) зачем скользящее окно, а не просто последнее показание; (4) почему условие «Авария» проверяется РАНЬШЕ «Предупреждения»; (5) что означает включённый светодиод. Если можешь ответить на все пять — проект защищён.

Проверь себя

Контрольный вопрос. srednyayaTemperatura = 20, svetProcent = 50. Какой будет статус?

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

if (srednyayaTemperatura > 35 || srednyayaTemperatura < 0) {
  status = "Авария";
} else if ((srednyayaTemperatura > 28 && srednyayaTemperatura <= 35) || svetProcent < 10) {
  status = "Предупреждение";
} else {
  status = "Норма";
}
ААвария
БНорма
ВПредупреждение

Подсказка: 20 не больше 35 и не меньше 0; 20 не входит в 28..35, и 50 не меньше 10 — какая ветка остаётся?

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

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

Контрольный вопрос. srednyayaTemperatura = 40. Какой будет статус и что произойдёт со светодиодом?

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

if (srednyayaTemperatura > 35 || srednyayaTemperatura < 0) {
  status = "Авария";
  digitalWrite(pinLed, HIGH);
} else if ((srednyayaTemperatura > 28 && srednyayaTemperatura <= 35) || svetProcent < 10) {
  status = "Предупреждение";
  digitalWrite(pinLed, LOW);
} else {
  status = "Норма";
  digitalWrite(pinLed, LOW);
}
АПредупреждение, светодиод выключен
БАвария, светодиод включится
ВНорма, светодиод выключен

Подсказка: 40 больше 35 — первое же условие истинно.

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

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

Контрольный вопрос. srednyayaTemperatura = 30, svetProcent = 50.

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

if (srednyayaTemperatura > 35 || srednyayaTemperatura < 0) {
  status = "Авария";
} else if ((srednyayaTemperatura > 28 && srednyayaTemperatura <= 35) || svetProcent < 10) {
  status = "Предупреждение";
} else {
  status = "Норма";
}
АНорма
БАвария
ВПредупреждение

Подсказка: 30 не больше 35, но 30 больше 28 и не больше 35 — левая часть составного условия истинна.

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

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

Контрольный вопрос. srednyayaTemperatura = 20, svetProcent = 5.

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

if (srednyayaTemperatura > 35 || srednyayaTemperatura < 0) {
  status = "Авария";
} else if ((srednyayaTemperatura > 28 && srednyayaTemperatura <= 35) || svetProcent < 10) {
  status = "Предупреждение";
} else {
  status = "Норма";
}
ААвария
БПредупреждение
ВНорма

Подсказка: Сама по себе температура не переводит станцию в эту ветку, но проверь ВТОРУЮ половину составного условия через || — возможно, сработает она.

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

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

Контрольный вопрос. Почему условие «Авария» должно проверяться ПЕРВЫМ, раньше «Предупреждения»?

АЭто требование синтаксиса C++ — else if обязан идти по возрастанию сложности
БПорядок условий не имеет значения — else if всегда проверяет самое опасное первым автоматически
ВЕсли бы «Предупреждение» стояло первым, при аварийной температуре 40 условие (temp > 28 && temp <= 35) было бы ложным, но до реальной проверки «Авария» дело бы дошло всё равно правильно — проблема была бы, только если строгое условие «слабее» подходило бы раньше по ошибке

Подсказка: Вспомни занятие про пороговую логику: правило — проверять от самого строгого условия к самому мягкому, чтобы не потерять более серьёзный случай.

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

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

Задание. Напиши код сам. Допиши составное условие вместо ___ для ветки «Предупреждение»: температура строго больше 28 И не больше 35, ИЛИ освещённость меньше 10.

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

} else if (___) {
  status = "Предупреждение";
  digitalWrite(pinLed, LOW);
}

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

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

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

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

Контрольный вопрос. srednyayaTemperatura равна РОВНО 35, svetProcent = 50.

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

if (srednyayaTemperatura > 35 || srednyayaTemperatura < 0) {
  status = "Авария";
} else if ((srednyayaTemperatura > 28 && srednyayaTemperatura <= 35) || svetProcent < 10) {
  status = "Предупреждение";
} else {
  status = "Норма";
}
АНорма
БАвария
ВПредупреждение

Подсказка: 35 > 35 ложно (строгое неравенство) — первая ветка не сработает. Проверь вторую: 35 <= 35 истинно.

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

Задание. Напиши блок целиком (около 10 строк): определение переменной status (String) и if/else if/else по правилам этого занятия (авария: temp>35 || temp28 && temp<=35) || свет<10; иначе норма), плюс digitalWrite для pinLed в каждой ветке и финальный вывод статуса в Serial.

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

// используй переменные srednyayaTemperatura, svetProcent, pinLed (уже объявлены)

Подсказка: Собери всё из материала занятия: объявление String status, три ветки if/else if/else с нужными условиями и digitalWrite, затем Serial.print(«Статус: «) + Serial.println(status).

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

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

Задание. Мини-проект. В датчиковую часть станции (занятие 10) добавь: pinMode(9, OUTPUT) в setup(), и внутри неблокирующего блока (после расчёта srednyayaTemperatura и svetProcent) — блок определения статуса и управления светодиодом по правилам этого занятия, с выводом статуса в Serial. Принято, если: пин 9 настроен как выход в setup(); статус определяется в правильном порядке (авария проверяется первой); светодиод включается ТОЛЬКО в статусе «Авария»; в Serial печатается строка «Статус: ».

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

// добавь pinMode(9, OUTPUT) в setup() и блок статуса в loop() датчиковой части занятия 10

Подсказка: pinMode добавляется одной строкой в setup(); блок статуса — тот же, что ты написал в задании этого занятия про if/else if/else, вставленный после строк с svetProcent.

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

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

Задание. Финальный проект. Напиши ПОЛНУЮ программу станции мониторинга с нуля (около 45 строк): библиотека DHT22 (пин 4) + датчик освещённости LDR (A0) + скользящее окно из 5 температур + функции vyvestiPokazanie и sredneeMassiva + неблокирующий интервал 2000 мс + определение статуса (авария/предупреждение/норма) + светодиод на пине 9 + дашборд со всеми значениями и статусом. Принято, если: все части из занятий 6-11 присутствуют и работают вместе (компилируется и логически верна последовательность датчик → окно → среднее → статус → сигнал → дашборд); пороги и их порядок — как в этом занятии; вывод в Serial содержит температуру, среднюю температуру, освещённость и статус.

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

// напиши #include, объекты/переменные, setup() и loop() — соберите ВСЮ станцию по описанию выше

Подсказка: Это сборка того, что ты уже написал по частям на занятиях 6, 7, 8, 10 и в этом занятии — собери куски друг за другом в одном файле, ничего принципиально нового придумывать не нужно.

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

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

Курс пройден

Ты прошёл путь от первой мигающей лампочки до полноценной станции мониторинга на двух датчиках с сигнализацией. Это ровно тот фундамент программирования микроконтроллеров, на который опираются вузовские дисциплины «Микропроцессорная техника» и «Системы программного управления» — дальше вуз даст схемотехнику и теорию управления, а код ты уже писать умеешь.

Итог: станция мониторинга собрана целиком — два датчика, скользящее окно, дашборд, трёхуровневая сигнализация. Курс пройден.

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

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