Отчет по учебной практике по пм. 03 Участие в интеграции программных модулей
Скачать 7.89 Mb.
|
Министерство цифрового развития, связи и массовых коммуникаций РФ Уральский технический институт связи и информатики (филиал) ФГБОУ ВО «Сибирский государственный университет телекоммуникаций и информатики» в г Екатеринбурге (УрТИСИ СибГУТИ) Цикловая комиссия ИТ и АСУ кафедры ИСТ Отчет по учебной практике по ПМ.03 «Участие в интеграции программных модулей» (МДК 03.01 «Технология разработки программного обеспечения», МДК 03.03 «Документирование и сертификация») студента III курса 982 группы Фамилия Шишкин Имя, отчество Никита Юрьевич Факультет Инфокоммуникаций, информатики и управления Специальность 09.02.03 «Программирование в компьютерных системах» Екатеринбург, 2021 Отзыв руководителя Содержание ВведениеС целью овладения видом профессиональной деятельности «Участие в интеграции программных модулей» и соответствующими профессиональными компетенциями в ходе освоения учебной практики необходимо: 1) иметь практический опыт: − в проектировании технического задания; − в написании программного кода для микроконтроллера. – в создании модели устройства. 2) знать и уметь: − работать с Arduino; – строить схемы подключения датчиков к электронному устройству; – уметь писать код на С++; − основные принципы процесса разработки устройства; − принципы построения, структуры и приемы работы с инструментальными средствами, поддерживающими создание устройства. Целью учебной практики по ПМ.03 «Участие в интеграции программных модулей» является отработка практических навыков, полученных в период изучения МДК 03.03 «Документирование и сертификация» и МДК 03.01 «Технология разработки программного обеспечения» посредством доработки системы автоматического подсчета людей и управления освещением в помещении. В соответствии с целью были поставлены следующие задачи: 1) разработать и описать проект технического задания для выпускной квалификационной работы (ВКР); 2) изменить схему подключения датчиков к электронному устройству; 3) создать код для системы автоматического подсчета людей и управления освещением в комнату; 4) собрать модель устройства. 1 Разработка проекта технического заданияНа рисунке 1.1 продемонстрирован титульный лист технического задания на выпускную квалификационную работу. Рисунок 1.1 – Титульный лист На рисунке 1.2 представлен второй лист технического задания, содержащий тему выпускной квалификационной работы, срок сдачи выпускной квалификационной работы и исходные данные к выпускной квалификационной работы. Рисунок 1.2 – Второй лист На рисунке 1.3 представлен третий лист технического задания, содержащий структуру выпускной квалификационной работы. Рисунок 1.3 – Третий лист На рисунке 1.4 представлен четвёртый лист технического задания, содержащий перечень графического материала, перечень используемых информационных технологий при выполнении и защите выпускной квалификационной работы и список консультантов по выпускной квалификационной работы. Рисунок 1.4 – Четвертый лист 2. Доработка системы управлением освещением2.1 Формулировка задания Необходимо доработать систему управлением освещением, построенной на принципе подсчёта количества людей в комнату, если число людей в комнате больше нуля включается светодиод. Для этого необходимо: – создать код; – изменить схему подключения; – изменить модель системы. 2.2 Причины доработки системы Причиной доработки является проблема большинства систем управления светом: – необходимость каждые несколько минут изображать движение перед датчиком; – помехи из-за которых в старой системе мог самопроизвольно включится свет. В предыдущей системе принцип управления светом был построен на включении света при обнаружении объекта, на рисунке 2.1 продемонстрирована схема подключения. Рисунок 2.1 – Предыдущая схема подключения На рисунке 2.2 продемонстрирована предыдущая собранная система. Рисунок 2.2 – Предыдущая собранная система 2.3 Реализация доработанной системы освещения На рисунке 2.3 продемонстрирована доработанная схема подключения датчиков E18-D80NK, макетной платы с светодиодом к Arduino UNO, в которой был добавлен еще один датчик E18-D80NK для обнаружения человека одним датчиком и подтверждением его другим, благодаря этому убираются помехи из-за которых в старой системе мог самопроизвольно включится свет. Рисунок 2.3 – Схема подключения датчиков На рисунке 2.4 продемонстрирован код для запуска системы в Arduino, созданная библиотека для системы автоматического подсчета людей и управления освещением в комнате продемонстрирован в Приложение А, благодаря созданной библиотеке решается необходимость каждые несколько минут изображать движение перед датчиком. Рисунок 2.4 – Код для запуска системы в Arduino На рисунке 2.5 продемонстрирована собранная система, в которой согласно схеме подключения были подключены датчики и светодиод. Рисунок 2.5 – Готовая система Для демонстрации вывода значений сигналов датчиков на Arduino IDE был дописан код подсчета людей. На рисунке 2.6 продемонстрирован монитор порта, и пока зафиксирована 0 людей. Рисунок 2.6 – Подсчет людей На рисунках 2.7 и 2.8 продемонстрирован движущийся объект, проходящий через датчики приближения. Рисунок 2.7 – Движущийся объект Рисунок 2.8 – Движущийся объект На рисунке 2.9 продемонстрирован зафиксированный объект, который прошел через датчики приближения, поэтому на мониторинге порта вместо 0 выводится 1. Рисунок 2.9 – Зафиксированный объект После движения объекта на рисунке 2.10 продемонстрирован горящий светодиод благодаря системе автоматического подсчета людей в помещении. Рисунок 2.10 – Горящий светодиод 2.4 Перспективы развития системы В дальнейшем из-за незащищенности компонентов системы и не совершенствовании устройства планируется: – отказаться от макетной платы и маленького светодиода, и подключить лампу освещения; – подключить твердотельное реле, которое предназначено для замыкания выходной цепи переменного тока (с номинальным напряжением до 240 В), при подаче управляющего сигнала 5 В постоянного тока на вход модуля. Данный модуль будет использоваться для управления осветительной лампой, подключаемой к сети 220 В; – разработать и разместить все компоненты системы в корпус, для защиты всех частей системы. ЗаключениеВ ходе прохождения учебной практики в рамках междисциплинарного курса «Документирование и сертификация» был разработан проект технического задания и осуществлено документирование с применением программы Microsoft Word. В рамках междисциплинарного курса «Технология разработки программного обеспечения» были выполнены следующие задачи: – создан код для автоматического подсчета количества входящих и выходящих людей в помещении для решения проблемы в необходимости каждые несколько минут изображать движение перед датчиком; – изменена схема подключения датчиков к электронному устройству добавлением еще одного датчика E18-D80NK, благодаря этому убираются помехи, из-за которых в старой системе мог самопроизвольно включится свет; – доработана добавлением датчика E18-D80NK, и собрана модель устройства. Таким образом, все поставленные задачи учебной практики выполнены и цель достигнута. Приложение А(справочное) Листинг программы Листинг кода в файле LabRazum_PeopleCounter.h: #pragma once #include class Room { public: Room(byte pinSensor1, byte pinSensor2, byte pinRelay); Room(byte pinSensor1, byte pinSensor2, byte pinRelay, byte pinHandMode); Room(byte pinSensor1, byte pinSensor2, byte pinRelay, byte pinHandMode, byte pinPhotoSensor, int photoSensorThreshold); byte lightControl(); //включает управление освещением по счетчику людей byte getCountPeople(); //возвращает текущее количество людей в комнате bool getLightRoom(); //возвращает текущее состояние света в комнате - вкл (1) или выкл (0) void begin(); //настройка портов МК void debug(bool onDebug); //активация режима отладки (1), отключение режима (0) private: void start_timer_people(); //таймер на 500 мс для задержки между срабатываниями датчиков byte timerIRsensor1(byte mode); //тамеры на 10 мс для защиты от ложных срабатываний - помех byte timerIRsensor2(byte mode); byte count_people_val(); //метод определяет очередность срабатывания датчиков и выдает количество людей в комнате void lightRoom(bool lightOn); //метод изменяет значение количества людей в комнате, если оно изменилось void valuePeopleChange(); //меняет значение счетчика людей, если количество человек в комнате изменилось byte _pinSensor1, _pinSensor2, _pinHandMode, _pinRelay, _pinPhotoSensor, _handModeInit, _photoSensorInit; bool _firstSensor1, _firstSensor2, _IRsensor1, _IRsensor2, _timerIRsensor1On, _timerIRsensor2On, _darkLight, _lightOn, _onDebug, _signalSensorGood; unsigned long _timerPeople, _oldTimerPeople, _valTimerIRsensor1, _valTimerIRsensor2, _oldTimerIRsensor1, _oldTimerIRsensor2; byte _valuePeople; int _photoSensorThreshold; }; Листинг кода в файле LabRazum_PeopleCounter.cpp: #include #include Room::Room(byte pinSensor1, byte pinSensor2, byte pinRelay) { _pinSensor1 = pinSensor1; _pinSensor2 = pinSensor2; _pinRelay = pinRelay; _handModeInit = 0; _photoSensorInit = 0; } Room::Room(byte pinSensor1, byte pinSensor2, byte pinRelay, byte pinHandMode) { _pinSensor1 = pinSensor1; _pinSensor2 = pinSensor2; _pinHandMode = pinHandMode; _pinRelay = pinRelay; _handModeInit = 1; _photoSensorInit = 0; } Room::Room(byte pinSensor1, byte pinSensor2, byte pinRelay, byte pinHandMode, byte pinPhotoSensor, int photoSensorThreshold) { _pinSensor1 = pinSensor1; _pinSensor2 = pinSensor2; _pinHandMode = pinHandMode; _pinRelay = pinRelay; _pinPhotoSensor = pinPhotoSensor; _photoSensorThreshold = photoSensorThreshold; _handModeInit = 1; _photoSensorInit = 1; } void Room::begin() { pinMode(_pinSensor1, INPUT); pinMode(_pinSensor2, INPUT); pinMode(_pinRelay, OUTPUT); digitalWrite(_pinRelay, LOW); if(_handModeInit == 1) { pinMode(_pinHandMode, INPUT); } if(_photoSensorInit== 1) { pinMode(_pinPhotoSensor, INPUT); } } void Room::debug(bool onDebug) { _onDebug = onDebug; } //функция считывает показания двух ИК-датчиков, определяет, какой сработал первым byte Room::count_people_val() { _IRsensor1 = digitalRead(_pinSensor1); _IRsensor2 = digitalRead(_pinSensor2); //фильтрация помех датчика №1 - при помехе (старт/остановка двигателя, включение/отключение мощной нагрузки) //сигнал датчика переключается на 3-5мс и восстанавливается обратно, поэтому ставим таймер на 10 мс (с запасом) if((_IRsensor1 == 0) && (_timerIRsensor1On == 0)) //если пришел сигнал с датчика и таймер помехи не был запущен { _timerIRsensor1On = 1; //запускаем таймер и ставим флаг запуска timerIRsensor1(1); } if((_IRsensor1 == 1) && (_timerIRsensor1On == 1)) //если во время работы таймера (10 мс), датчик меняет состояние, значит это была помеха { timerIRsensor1(0); //останавливаем _timerIRsensor1On = 0; } if((_IRsensor1 == 0) && (timerIRsensor1(2) >= 10)) //если сигнал "держится" на нуле больше 10 мс { _signalSensorGood = 1; //говорим, что сигнал "хороший" timerIRsensor1(0); //останавливаем таймер _timerIRsensor1On = 0; } //фильтрация помех датчика №2 if((_IRsensor2 == 0) && (_timerIRsensor2On == 0)) //если пришел сигнал с датчика и таймер помехи не был запущен { _timerIRsensor2On = 1; //запускаем таймер и ставим флаг запуска timerIRsensor2(1); } if((_IRsensor2 == 1) && (_timerIRsensor2On == 1)) //если во время работы таймера помехи (10 мс), датчик меняет состояние, значит это была помеха { timerIRsensor2(0); //останавливаем таймер _timerIRsensor2On = 0; } if((_IRsensor2 == 0) && (timerIRsensor2(2) >= 10)) //если сигнал "держится" на нуле больше 10 мс { _signalSensorGood = 1; //говорим, что сигнал "хороший" timerIRsensor2(0); //останавливаем таймер _timerIRsensor2On = 0; } if(_onDebug == 1) { Serial.print("IR_sensor_1:" + String(_IRsensor1) + " IR_sensor_2:" + String(_IRsensor2)); } //определяем, какой датчик сработал первым if((_firstSensor2 == 0) && (_firstSensor1 == 0) && (_signalSensorGood == 1)) { if((_IRsensor1 == 0) && (_IRsensor2 == 1)) { start_timer_people(); _firstSensor1 = 1; } if((_IRsensor2 == 0) && (_IRsensor1 == 1)) { start_timer_people(); _firstSensor2 = 1; } } valuePeopleChange(); return _valuePeople; } //меняет значение счетчика людей, если количество человек в комнате изменилось void Room::valuePeopleChange() { if((_firstSensor1 == 1) || (_firstSensor2 == 1)) { _timerPeople = millis() - _oldTimerPeople; if(_timerPeople < 500) { if(_firstSensor1) { if(_IRsensor2 == 0) { _valuePeople++; _firstSensor1 = 0; _signalSensorGood = 0; } } if(_firstSensor2) { if((_IRsensor1 == 0) && (_valuePeople > 0)) { _valuePeople--; _firstSensor2 = 0; _signalSensorGood = 0; } } } else { _firstSensor1 = 0; _firstSensor2 = 0; _signalSensorGood = 0; } } } void Room::start_timer_people() { _oldTimerPeople = millis(); _timerPeople = 0; } byte Room::timerIRsensor1(byte mode) { switch (mode) { case 0: //сброс счетчика _valTimerIRsensor1 = 0; return 0; break; case 1: //старт счетчика - запоминаем, чему был равен millis() _oldTimerIRsensor1 = millis(); _valTimerIRsensor1 = 0; return 1; break; case 2: //показания счетчика _valTimerIRsensor1 = millis() - _oldTimerIRsensor1; return _valTimerIRsensor1; break; } } byte Room::timerIRsensor2(byte mode) { switch (mode) { case 0: //сброс счетчика _valTimerIRsensor2 = 0; return 0; break; case 1: //старт счетчика - запоминаем, чему был равен millis() _oldTimerIRsensor2 = millis(); _valTimerIRsensor2 = 0; return 1; break; case 2: //показания счетчика _valTimerIRsensor2 = millis() - _oldTimerIRsensor2; return _valTimerIRsensor2; break; } } byte Room::lightControl() { if(_handModeInit == 1) { if(digitalRead(_pinHandMode) == 0) //если с кнопки пришел 0, включаем "ручной" режим { lightRoom(0); //выключить свет в этой комнате _valuePeople = 0; //обнулить счетчик людей } else { if (count_people_val() > 0) //если есть люди в комнате { lightRoom(1); //включить свет в этой комнате } else { lightRoom(0); //выключить свет в этой комнате _valuePeople = 0; } return _valuePeople; } } else { if (count_people_val() > 0) //если есть люди в комнате { lightRoom(1); //включить свет в этой комнате } else { lightRoom(0); //выключить свет в этой комнате _valuePeople = 0; } return _valuePeople; } } byte Room::getCountPeople() { return _valuePeople; } void Room::lightRoom(bool lightOn) { _lightOn = lightOn; if(_photoSensorInit == 1) { int sunlightValue = analogRead(_pinPhotoSensor); if(_onDebug == 1) { Serial.print(" PhotoSensor:" + String(sunlightValue)); if(_darkLight == 1) Serial.println(" Light in Room: "+ String(_lightOn)); else Serial.println(" Light in Room: 0"); } if(sunlightValue > _photoSensorThreshold) { _darkLight = 1; } if(sunlightValue < (_photoSensorThreshold-100)) { _darkLight = 0; digitalWrite(_pinRelay, 0); } if(_darkLight == 1) { digitalWrite(_pinRelay, _lightOn); } } else { digitalWrite(_pinRelay, _lightOn); } } bool Room::getLightRoom() { if(_darkLight == 1) { return _lightOn; } else { return 0; } } |