- Рекомендации по работе над дипломом
- Описание
- Архитектура устройства
- Многопоточность и синхронизация
- Сбор и индексация событий
- Поиск по журналу
- Конфигурация
- Что является итогом работы
- Этапы реализации проекта
- Техническое задание
- Критерии оценки
- Полезные материалы
- Как задавать вопросы руководителю по дипломной работе
- Начните работу заранее, чтобы осталось время на обратную связь и доработки.
- Делите проект на части и сдавайте их последовательно.
- Присылайте на проверку логически завершённые блоки и фиксируйте прогресс в git.
Создайте симуляцию умного устройства на ESP32 или Arduino Uno в среде Wokwi.
Устройство выполняет:
- сбор данных с датчиков (движение, температура/влажность, освещённость);
- анализ и формирование журнала событий;
- индексацию ключевых событий;
- поиск по журналу через Serial Monitor (по ключевым словам и уровням важности).
Пример сценария: при превышении температуры выше 30°C или фиксации движения устройство генерирует запись, сохраняет её в журнал и позволяет пользователю запросить события по типу или уровню важности.
-
Аппаратная модель:
- ESP32 или Arduino Uno
- Датчики: PIR (движение), DHT (температура/влажность), LDR (освещённость)
-
Программная модель:
- два потока (
std::thread
) - общий контейнер
std::vector<Event>
- синхронизация через
std::mutex
- два потока (
-
Взаимодействие с пользователем:
- ввод запросов через Serial Monitor
- вывод до 10 последних найденных событий
-
В
setup()
создаются два потока:- sensorThread — циклически опрашивает датчики каждые 2 секунды, анализирует данные и формирует события;
- commandThread — обрабатывает команды пользователя, ищет события в журнале и выводит результаты.
-
Для защиты общего ресурса (журнала) используется
std::mutex
иstd::lock_guard
.
-
Журнал событий хранится в
std::vector
(или кольцевом буфере) на 100 записей.- При переполнении удаляются самые старые записи (FIFO).
-
Каждое событие описывается структурой:
struct Event { std::string time; std::string type; // TEMPERATURE, MOTION, LIGHT std::string level; // LOW, MEDIUM, HIGH };
[12:30:05] Тип: TEMPERATURE, Уровень: HIGH
- Температура > 30°C → HIGH
- Движение → MEDIUM или HIGH
- Освещённость < порога → LOW
search TEMPERATURE HIGH
- Захватывает мьютекс.
- Ищет совпадения в журнале.
- Сортирует результаты по важности (HIGH → MEDIUM → LOW).
- Выводит до 10 последних событий.
[12:30:05] Тип: TEMPERATURE, Уровень: HIGH
[12:28:01] Тип: TEMPERATURE, Уровень: HIGH
Пороговые значения температуры, освещённости и интервал опроса задаются в коде.
Рекомендуется вынести их в отдельный файл config.h
:
const int TEMP_THRESHOLD = 30;
const int LIGHT_THRESHOLD = 200;
const int POLL_INTERVAL = 2000; // мс
-
Рабочая симуляция в Wokwi (ESP32/Arduino + датчики).
-
Исходный код на C++ с комментариями.
-
Публичный репозиторий GitHub с:
- исходниками,
- ссылкой на проект Wokwi,
- инструкцией по запуску.
- Создание проекта в Wokwi и подключение датчиков.
- Настройка pthread в wokwi.toml.
- Реализация структуры Event и журнала событий.
- Написание потоков sensorThread и commandThread.
- Добавление синхронизации (std::mutex).
- Реализация поиска и сортировки.
- Тестирование и финальная отладка.
- Создать проект ESP32 с датчиками PIR, DHT, LDR в Wokwi.
- Добавить в wokwi.toml: libraries = ["pthread"]
- Реализовать два потока:
- void sensorThreadFunc() — опрос датчиков каждые 2 секунды;
- void commandThreadFunc() — обработка команд вида search <тип> <уровень>.
- Использовать std::vector для хранения событий.
- Защитить доступ к журналу через std::mutex.
- Добавить сортировку результатов поиска по уровню важности.
- Код должен быть читаемым и содержать комментарии.
- Два потока (sensor + command) работают параллельно.
- Журнал хранит до 100 событий (FIFO).
- Поиск выполняется и сортирует по важности.
- События классифицируются по типам и уровням.
- Реализована синхронизация через std::mutex.
- Код читаемый, содержит комментарии.
- В репозитории есть README и ссылка на проект Wokwi.
Используйте Яндекс Браузер, чтобы переводить англоязычную документацию.
- Сформулируйте вопрос чётко и по пунктам.
- Сперва попробуйте найти ответ самостоятельно.
- Прикладывайте скриншоты и указывайте проблемное место.
- По возможности оставляйте вопросы в комментариях к коду.
Будьте терпеливы: руководитель может отвечать не сразу.