Скачиваний:
2
Добавлен:
14.02.2024
Размер:
119.13 Кб
Скачать

МИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ,

СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА» (СПбГУТ)

Кафедра информационно-управляющих систем

Лабораторная работа № 3

«Создание системы дистанционного управления»

по дисциплине «Технологии распределённых информационно-управляющих систем»

Студент гр. ИСТ-112_____________________________ Медведева С.Г.

(подпись)

Приняла ___________________________ Козлова О.А.

(оценка и подпись)

Цель работы: реализовать систему автоматического управления, находящуюся на удаленном расстоянии от объекта управления.

В качестве предметной области была выбрана система «Умный дом», точнее управление осветительными приборами, такими как лампы, светильники и другое. Объектом управления являются осветительные приборы, управляющим устройством на расстоянии мобильное устройство пользователя.

Для работы системы необходимы две составляющие: мобильное приложение и сами осветительные приборы. Через мобильное приложение будет отправляться запросы на включение/выключение, контролироваться степень освещенности, а также настраиваться автоматическое включение в определенное время и выбираться режим включения. Режима будет предусмотрено два «Мягкий», которой за час до назначенного времени включения будет постепенно увеличивать яркость осветительного прибора до 100%. «Резкий» режим в установленное время включает лампа и устанавливает яркость на 100%.

Рис. 1 – Структурная схема

Описанный процесс был смоделирован на языке программирования Java 1.8 с использованием библиотеки Swing для создания графического интерфейса.

Рис. 2 – Смоделированная система

Рис. 3 – Пример работы

Рис. 4 – Пример работы в режиме «Мягкий»

ЛИСТИНГ КОДА

package org.example; class SmartLamp { private boolean isOn; private double brightness; public SmartLamp() { this.isOn = false; this.brightness = 0; } public boolean isOn() { return isOn; } public void turnOn() { isOn = true; System.out.println("Lamp is turned on."); } public void turnOff() { isOn = false; System.out.println("Lamp is turned off."); } public void adjustBrightness(double newBrightness) { brightness = newBrightness; System.out.println("Brightness adjusted to " + brightness + "%."); } public double getBrightness(){ return brightness; } public void setIntensity(double currentIntensity) { brightness = currentIntensity; } }

package org.example; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class SmartHomeGUI extends JFrame{ private SmartHome smartHome; private MobileApp mobileApp; private JLabel timeLabel; private long currentTimeMillis = 0; private JComboBox<String>[] morningModeComboBoxes; private JPanel lampsPanel = new JPanel(); private JSpinner[] morningTimeSpinners; // Упростили массив для выбора времени утром public SmartHomeGUI(SmartHome smartHome, MobileApp mobileApp) { this.smartHome = smartHome; this.mobileApp = mobileApp; setTitle("Умный дом"); setSize(800, 400); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); initUI(); setLocationRelativeTo(null); // Чтобы окно открывалось по центру экрана setVisible(true); Timer timer = new Timer(50, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { updateTime(); // Обновляем время } }); timer.start(); ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); scheduler.scheduleAtFixedRate(this::updateTime, 0, 1, TimeUnit.SECONDS); } private void initUI() { JPanel mainPanel = new JPanel(new BorderLayout()); // Панель для отображения ламп в доме lampsPanel.setLayout(new GridLayout(smartHome.getLamps().length, 2)); JPanel timePanel = new JPanel(); timeLabel = new JLabel("Time: "); timePanel.add(timeLabel); mainPanel.add(timePanel, BorderLayout.NORTH); JPanel lampsControlPanel = new JPanel(new GridLayout(smartHome.getLamps().length, 4)); morningModeComboBoxes = new JComboBox[smartHome.getLamps().length]; morningTimeSpinners = new JSpinner[smartHome.getLamps().length]; // Упростили массив для выбора времени утром for (int i = 0; i < smartHome.getLamps().length; i++) { // Добавляем элементы управления для выбора режима утром morningModeComboBoxes[i] = new JComboBox<>(new String[]{"Мягкий", "Резкий"}); lampsControlPanel.add(new JLabel("Мод:")); lampsControlPanel.add(morningModeComboBoxes[i]); // Добавляем элементы управления для выбора времени утром morningTimeSpinners[i] = new JSpinner(new SpinnerDateModel()); morningTimeSpinners[i].setEditor(new JSpinner.DateEditor(morningTimeSpinners[i], "HH:mm")); lampsControlPanel.add(new JLabel("Утреннее время")); lampsControlPanel.add(morningTimeSpinners[i]); } mainPanel.add(lampsControlPanel, BorderLayout.CENTER); add(mainPanel); for (int i = 0; i < smartHome.getLamps().length; i++) { SmartLamp lamp = smartHome.getLampInRoom(i); JLabel lampLabel = new JLabel("Ламп " + (i + 1) + ": "); JLabel statusLabel = new JLabel("Статус: " + (lamp.isOn() ? "Вкл" : "Выкл")); JLabel statusLampB = new JLabel("Яркость: " + lamp.getBrightness()+ "%"); lampsPanel.add(lampLabel); lampsPanel.add(statusLabel); lampsPanel.add(statusLampB); } mainPanel.add(lampsPanel, BorderLayout.WEST); // Панель для отображения мобильного приложения JPanel mobileAppPanel = new JPanel(); mobileAppPanel.setLayout(new BoxLayout(mobileAppPanel, BoxLayout.Y_AXIS)); for (int i = 0; i < smartHome.getLamps().length; i++) { SmartLamp lamp = smartHome.getLampInRoom(i); JLabel lampLabel = new JLabel("Лампа " + (i + 1) + ": "); JButton toggleButton = new JButton("Включить"); JSlider brightnessSlider = new JSlider(JSlider.HORIZONTAL, 0, 100, 0); final int index = i; // Сделаем копию переменной i JButton applyButton = new JButton("Apply"); applyButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { applyModes(); } }); mainPanel.add(applyButton, BorderLayout.SOUTH); toggleButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { boolean isOn = !lamp.isOn(); int brightness = brightnessSlider.getValue(); mobileApp.controlLight(lamp, isOn, brightness); // Обновляем статус на панели ламп ((JLabel) lampsPanel.getComponent(index * 3 + 1)).setText("Статус: " + (lamp.isOn() ? "Вкл" : "Выкл")); toggleButton.setText("Выключить"); } }); brightnessSlider.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { int brightness = brightnessSlider.getValue(); mobileApp.controlLight(lamp, lamp.isOn(), brightness); ((JLabel) lampsPanel.getComponent(index * 3 + 2)).setText("Яркость: " + (int)lamp.getBrightness()+ "%"); } }); mobileAppPanel.add(lampLabel); mobileAppPanel.add(toggleButton); mobileAppPanel.add(brightnessSlider); } mainPanel.add(mobileAppPanel, BorderLayout.EAST); add(mainPanel); } private void updateTime () { SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm"); // Используем currentTimeMillis для отслеживания времени currentTimeMillis += 10000; // Увеличиваем текущее время на 1 секунду Date acceleratedDate = new Date(currentTimeMillis); String currentTime = dateFormat.format(acceleratedDate); SwingUtilities.invokeLater(() -> { timeLabel.setText("Time: " + currentTime); updateLampsIntensity(currentTime); }); } private void updateLampsIntensity( String timeInP) { for (int i = 0; i < smartHome.getLamps().length; i++) { SmartLamp lamp = smartHome.getLampInRoom(i); mobileApp.adjustIntensity(lamp, timeInP); ((JLabel) lampsPanel.getComponent(i * 3 + 2)).setText("Яркость: " + (int)lamp.getBrightness()+ "%"); ((JLabel) lampsPanel.getComponent(i * 3 + 1)).setText("Статус: " + (lamp.isOn() ? "Вкл" : "Выкл")); } } // Метод для применения выбранных режимов и времени private void applyModes() { for (int i = 0; i < smartHome.getLamps().length; i++) { SmartLamp lamp = smartHome.getLampInRoom(i); String morningMode = (String) morningModeComboBoxes[i].getSelectedItem(); Date morningTime = (Date) morningTimeSpinners[i].getValue(); mobileApp.setMorningMode(lamp, morningMode, morningTime); } } }

package org.example; class SmartHome { private SmartLamp[] lamps; public SmartHome(int numberOfRooms) { lamps = new SmartLamp[numberOfRooms]; for (int i = 0; i < numberOfRooms; i++) { lamps[i] = new SmartLamp(); } } public SmartLamp getLampInRoom(int roomNumber) { return lamps[roomNumber]; } public SmartLamp[] getLamps() { return lamps; } }

package org.example; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; public class MobileApp { private Map<SmartLamp, String> morningModes; private Map<SmartLamp, Date> morningTimes; public MobileApp() { morningModes = new HashMap<>(); morningTimes = new HashMap<>(); } public void setMorningMode(SmartLamp lamp, String mode, Date time) { morningModes.put(lamp, mode); morningTimes.put(lamp, time); } // Добавлен метод для управления интенсивностью света public void adjustIntensity(SmartLamp lamp, String time) { Date morningTime = morningTimes.getOrDefault(lamp, null); if (morningTime != null ) { String morningMode = morningModes.getOrDefault(lamp, "Мягкий"); if (morningMode.equals("Резкий")&& time.equals(new SimpleDateFormat("HH:mm").format(morningTime))) { // Если режим "Резкий", устанавливаем яркость на 100 lamp.setIntensity(100); lamp.turnOn(); } else if (morningMode.equals("Мягкий")) { try { SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); Date timeInSystem = sdf.parse(time); Calendar calendar = Calendar.getInstance(); calendar.setTime(morningTime); // Уменьшаем время на один час calendar.add(Calendar.HOUR_OF_DAY, -1); if (timeInSystem.before(morningTime) && timeInSystem.after(calendar.getTime())) { if (lamp.getBrightness() <= 100) lamp.setIntensity(lamp.getBrightness() + 0.26); lamp.turnOn(); } } catch (ParseException e) { e.printStackTrace(); } } } } public void controlLight(SmartLamp lamp, boolean turnOn, int brightness) { if (turnOn) { lamp.turnOn(); } else { lamp.turnOff(); } lamp.adjustBrightness(brightness); } }

package org.example; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class Main { public static void main(String[] args) { SmartHome smartHome = new SmartHome(3); MobileApp mobileApp = new MobileApp(); SwingUtilities.invokeLater(() -> new SmartHomeGUI(smartHome, mobileApp)); } }

Вывод: В ходе выполнения работы была реализована система автоматического управления, находящаяся на удаленном расстоянии от объекта управления.

Соседние файлы в папке Лаб 3