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/zh/6-consumer/lessons/3-spoken-feedback/single-board-computer-set-t...

138 lines
5.6 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-25T00:04:25+00:00",
"source_file": "6-consumer/lessons/3-spoken-feedback/single-board-computer-set-timer.md",
"language_code": "zh"
}
-->
# 设置计时器 - 虚拟物联网硬件和树莓派
在本课的这一部分中,您将调用无服务器代码来理解语音,并根据结果在虚拟物联网设备或树莓派上设置计时器。
## 设置计时器
从语音转文本调用返回的文本需要发送到您的无服务器代码,由 LUIS 处理,并返回计时器的秒数。这个秒数可以用来设置计时器。
计时器可以使用 Python 的 `threading.Timer` 类来设置。这个类接受一个延迟时间和一个函数,在延迟时间后执行该函数。
### 任务 - 将文本发送到无服务器函数
1. 在 VS Code 中打开 `smart-timer` 项目,并确保如果您使用的是虚拟物联网设备,终端中已加载虚拟环境。
1.`process_text` 函数上方,声明一个名为 `get_timer_time` 的函数,用于调用您创建的 REST 端点:
```python
def get_timer_time(text):
```
1. 在该函数中添加以下代码以定义要调用的 URL
```python
url = '<URL>'
```
`<URL>` 替换为您在上一课中构建的 REST 端点的 URL无论是在您的计算机上还是在云端。
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) 文件夹中找到此代码。
😀 您的计时器程序成功了!
**免责声明**
本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。我们对于因使用此翻译而引起的任何误解或误读不承担责任。