You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
IoT-For-Beginners/translations/uk/6-consumer/lessons/3-spoken-feedback/single-board-computer-set-t...

140 lines
9.1 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!--
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). Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильне тлумачення, що виникли внаслідок використання цього перекладу.