|
|
<!--
|
|
|
CO_OP_TRANSLATOR_METADATA:
|
|
|
{
|
|
|
"original_hash": "64ad4ddb4de81a18b7252e968f10b404",
|
|
|
"translation_date": "2025-08-28T16:22:17+00:00",
|
|
|
"source_file": "6-consumer/lessons/3-spoken-feedback/single-board-computer-set-timer.md",
|
|
|
"language_code": "uk"
|
|
|
}
|
|
|
-->
|
|
|
# Встановлення таймера - Віртуальне IoT обладнання та Raspberry Pi
|
|
|
|
|
|
У цій частині уроку ви викличете свій безсерверний код для розпізнавання мовлення та встановите таймер на вашому віртуальному IoT пристрої або Raspberry Pi на основі отриманих результатів.
|
|
|
|
|
|
## Встановлення таймера
|
|
|
|
|
|
Текст, який повертається після виклику функції перетворення мовлення в текст, потрібно надіслати до вашого безсерверного коду для обробки за допомогою LUIS, щоб отримати кількість секунд для таймера. Ця кількість секунд може бути використана для встановлення таймера.
|
|
|
|
|
|
Таймери можна встановлювати за допомогою класу Python `threading.Timer`. Цей клас приймає час затримки та функцію, і після закінчення часу затримки функція виконується.
|
|
|
|
|
|
### Завдання - надіслати текст до безсерверної функції
|
|
|
|
|
|
1. Відкрийте проект `smart-timer` у VS Code і переконайтеся, що віртуальне середовище завантажене в терміналі, якщо ви використовуєте віртуальний IoT пристрій.
|
|
|
|
|
|
1. Над функцією `process_text` оголосіть функцію `get_timer_time` для виклику REST-ендпоінту, який ви створили:
|
|
|
|
|
|
```python
|
|
|
def get_timer_time(text):
|
|
|
```
|
|
|
|
|
|
1. Додайте наступний код до цієї функції, щоб визначити URL для виклику:
|
|
|
|
|
|
```python
|
|
|
url = '<URL>'
|
|
|
```
|
|
|
|
|
|
Замініть `<URL>` на URL вашого REST-ендпоінту, який ви створили на попередньому уроці, або на вашому комп'ютері, або в хмарі.
|
|
|
|
|
|
1. Додайте наступний код, щоб встановити текст як властивість, передану у вигляді JSON до виклику:
|
|
|
|
|
|
```python
|
|
|
body = {
|
|
|
'text': text
|
|
|
}
|
|
|
|
|
|
response = requests.post(url, json=body)
|
|
|
```
|
|
|
|
|
|
1. Нижче цього отримайте `seconds` з відповіді, повертаючи 0, якщо виклик не вдався:
|
|
|
|
|
|
```python
|
|
|
if response.status_code != 200:
|
|
|
return 0
|
|
|
|
|
|
payload = response.json()
|
|
|
return payload['seconds']
|
|
|
```
|
|
|
|
|
|
Успішні HTTP-виклики повертають статус-код у діапазоні 200, а ваш безсерверний код повертає 200, якщо текст був оброблений і розпізнаний як намір встановлення таймера.
|
|
|
|
|
|
### Завдання - встановити таймер у фоновому потоці
|
|
|
|
|
|
1. Додайте наступний імпорт на початку файлу для імпорту бібліотеки Python threading:
|
|
|
|
|
|
```python
|
|
|
import threading
|
|
|
```
|
|
|
|
|
|
1. Над функцією `process_text` додайте функцію для озвучення відповіді. Поки що вона просто буде виводити текст у консоль, але пізніше в цьому уроці вона буде озвучувати текст.
|
|
|
|
|
|
```python
|
|
|
def say(text):
|
|
|
print(text)
|
|
|
```
|
|
|
|
|
|
1. Нижче цього додайте функцію, яка буде викликатися таймером для оголошення завершення таймера:
|
|
|
|
|
|
```python
|
|
|
def announce_timer(minutes, seconds):
|
|
|
announcement = 'Times up on your '
|
|
|
if minutes > 0:
|
|
|
announcement += f'{minutes} minute '
|
|
|
if seconds > 0:
|
|
|
announcement += f'{seconds} second '
|
|
|
announcement += 'timer.'
|
|
|
say(announcement)
|
|
|
```
|
|
|
|
|
|
Ця функція приймає кількість хвилин і секунд для таймера та створює речення, яке повідомляє про завершення таймера. Вона перевіряє кількість хвилин і секунд і включає кожну одиницю часу лише якщо вона має значення. Наприклад, якщо кількість хвилин дорівнює 0, то в повідомленні будуть включені лише секунди. Це речення потім передається до функції `say`.
|
|
|
|
|
|
1. Нижче цього додайте наступну функцію `create_timer` для створення таймера:
|
|
|
|
|
|
```python
|
|
|
def create_timer(total_seconds):
|
|
|
minutes, seconds = divmod(total_seconds, 60)
|
|
|
threading.Timer(total_seconds, announce_timer, args=[minutes, seconds]).start()
|
|
|
```
|
|
|
|
|
|
Ця функція приймає загальну кількість секунд для таймера, яка буде передана в команді, і конвертує її в хвилини та секунди. Потім вона створює і запускає об'єкт таймера, використовуючи загальну кількість секунд, передаючи функцію `announce_timer` і список, що містить хвилини та секунди. Коли таймер спрацьовує, він викликає функцію `announce_timer` і передає вміст цього списку як параметри - таким чином, перший елемент списку передається як параметр `minutes`, а другий елемент як параметр `seconds`.
|
|
|
|
|
|
1. До кінця функції `create_timer` додайте код для створення повідомлення, яке буде озвучене користувачеві для оголошення про початок таймера:
|
|
|
|
|
|
```python
|
|
|
announcement = ''
|
|
|
if minutes > 0:
|
|
|
announcement += f'{minutes} minute '
|
|
|
if seconds > 0:
|
|
|
announcement += f'{seconds} second '
|
|
|
announcement += 'timer started.'
|
|
|
say(announcement)
|
|
|
```
|
|
|
|
|
|
Знову ж таки, це включає лише одиницю часу, яка має значення. Це речення потім передається до функції `say`.
|
|
|
|
|
|
1. Додайте наступне до кінця функції `process_text`, щоб отримати час для таймера з тексту, а потім створити таймер:
|
|
|
|
|
|
```python
|
|
|
seconds = get_timer_time(text)
|
|
|
if seconds > 0:
|
|
|
create_timer(seconds)
|
|
|
```
|
|
|
|
|
|
Таймер створюється лише якщо кількість секунд більше 0.
|
|
|
|
|
|
1. Запустіть додаток і переконайтеся, що функція додатка також працює. Встановіть кілька таймерів, і вивід покаже, що таймер встановлено, а потім покаже, коли він спрацює:
|
|
|
|
|
|
```output
|
|
|
pi@raspberrypi:~/smart-timer $ python3 app.py
|
|
|
Set a two minute 27 second timer.
|
|
|
2 minute 27 second timer started.
|
|
|
Times up on your 2 minute 27 second timer.
|
|
|
```
|
|
|
|
|
|
> 💁 Ви можете знайти цей код у папці [code-timer/pi](../../../../../6-consumer/lessons/3-spoken-feedback/code-timer/pi) або [code-timer/virtual-iot-device](../../../../../6-consumer/lessons/3-spoken-feedback/code-timer/virtual-iot-device).
|
|
|
|
|
|
😀 Ваш додаток таймера був успішним!
|
|
|
|
|
|
---
|
|
|
|
|
|
**Відмова від відповідальності**:
|
|
|
Цей документ був перекладений за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильне тлумачення, що виникли внаслідок використання цього перекладу. |