Главная страница

Отчет по учебной практике по пм. 03 Участие в интеграции программных модулей


Скачать 7.89 Mb.
НазваниеОтчет по учебной практике по пм. 03 Участие в интеграции программных модулей
Дата14.03.2022
Размер7.89 Mb.
Формат файлаdocx
Имя файла982_Shishkin_NYu_TRiZBD_U1P (1).docx
ТипОтчет
#396888



Министерство цифрового развития, связи и массовых коммуникаций РФ

Уральский технический институт связи и информатики (филиал)

ФГБОУ ВО «Сибирский государственный университет

телекоммуникаций и информатики» в г Екатеринбурге

(УрТИСИ СибГУТИ)

Цикловая комиссия ИТ и АСУ кафедры ИСТ


Отчет

по учебной практике

по ПМ.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;

}

}



написать администратору сайта