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.
138 lines
8.5 KiB
138 lines
8.5 KiB
<!--
|
|
CO_OP_TRANSLATOR_METADATA:
|
|
{
|
|
"original_hash": "64ad4ddb4de81a18b7252e968f10b404",
|
|
"translation_date": "2025-08-25T22:34:32+00:00",
|
|
"source_file": "6-consumer/lessons/3-spoken-feedback/single-board-computer-set-timer.md",
|
|
"language_code": "fa"
|
|
}
|
|
-->
|
|
# تنظیم یک تایمر - سختافزار مجازی IoT و رزبری پای
|
|
|
|
در این بخش از درس، شما کد بدون سرور خود را فراخوانی میکنید تا گفتار را درک کرده و بر اساس نتایج، یک تایمر روی دستگاه مجازی IoT یا رزبری پای تنظیم کنید.
|
|
|
|
## تنظیم یک تایمر
|
|
|
|
متنی که از فراخوانی تبدیل گفتار به متن بازمیگردد، باید به کد بدون سرور شما ارسال شود تا توسط LUIS پردازش شود و تعداد ثانیههای تایمر را بازگرداند. این تعداد ثانیهها میتواند برای تنظیم تایمر استفاده شود.
|
|
|
|
تایمرها را میتوان با استفاده از کلاس `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` را از payload پاسخ بازیابی کنید و در صورت شکست فراخوانی، مقدار 0 را بازگردانید:
|
|
|
|
```python
|
|
if response.status_code != 200:
|
|
return 0
|
|
|
|
payload = response.json()
|
|
return payload['seconds']
|
|
```
|
|
|
|
فراخوانیهای HTTP موفق کد وضعیت در محدوده 200 بازمیگردانند و کد بدون سرور شما در صورتی که متن پردازش شده و بهعنوان نیت تنظیم تایمر شناسایی شود، کد 200 بازمیگرداند.
|
|
|
|
### وظیفه - تنظیم تایمر در یک رشته پسزمینه
|
|
|
|
1. عبارت import زیر را در بالای فایل اضافه کنید تا کتابخانه 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) ترجمه شده است. در حالی که ما تلاش میکنیم دقت را حفظ کنیم، لطفاً توجه داشته باشید که ترجمههای خودکار ممکن است شامل خطاها یا نادرستیها باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، توصیه میشود از ترجمه حرفهای انسانی استفاده کنید. ما مسئولیتی در قبال سوءتفاهمها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم. |