# ตั้งเวลา - ฮาร์ดแวร์ IoT เสมือนและ Raspberry Pi ในส่วนนี้ของบทเรียน คุณจะเรียกใช้โค้ดแบบไร้เซิร์ฟเวอร์ของคุณเพื่อทำความเข้าใจคำพูด และตั้งเวลาในอุปกรณ์ IoT เสมือนหรือ Raspberry Pi ตามผลลัพธ์ที่ได้ ## ตั้งเวลา ข้อความที่ได้จากการแปลงเสียงเป็นข้อความจำเป็นต้องถูกส่งไปยังโค้ดแบบไร้เซิร์ฟเวอร์ของคุณเพื่อให้ LUIS ประมวลผล และส่งกลับจำนวนวินาทีสำหรับการตั้งเวลา จำนวนวินาทีนี้สามารถใช้ในการตั้งเวลาได้ คุณสามารถตั้งเวลาได้โดยใช้คลาส `threading.Timer` ของ Python คลาสนี้รับค่าความล่าช้าและฟังก์ชัน และหลังจากเวลาความล่าช้าผ่านไป ฟังก์ชันจะถูกเรียกใช้งาน ### งาน - ส่งข้อความไปยังฟังก์ชันแบบไร้เซิร์ฟเวอร์ 1. เปิดโปรเจกต์ `smart-timer` ใน VS Code และตรวจสอบให้แน่ใจว่าสภาพแวดล้อมเสมือนถูกโหลดในเทอร์มินัล หากคุณใช้อุปกรณ์ IoT เสมือน 1. เหนือฟังก์ชัน `process_text` ให้ประกาศฟังก์ชันชื่อ `get_timer_time` เพื่อเรียก REST endpoint ที่คุณสร้างขึ้น: ```python def get_timer_time(text): ``` 1. เพิ่มโค้ดต่อไปนี้ในฟังก์ชันนี้เพื่อกำหนด URL ที่จะเรียกใช้: ```python url = '' ``` แทนที่ `` ด้วย URL ของ REST endpoint ที่คุณสร้างขึ้นในบทเรียนที่ผ่านมา ไม่ว่าจะอยู่ในคอมพิวเตอร์ของคุณหรือในคลาวด์ 1. เพิ่มโค้ดต่อไปนี้เพื่อกำหนดข้อความเป็น property ที่ส่งผ่าน 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 ที่สำเร็จจะคืนค่า status code ในช่วง 200 และโค้ดแบบไร้เซิร์ฟเวอร์ของคุณจะคืนค่า 200 หากข้อความถูกประมวลผลและรับรู้ว่าเป็น intent การตั้งเวลา ### งาน - ตั้งเวลาในเธรดพื้นหลัง 1. เพิ่มคำสั่ง import ต่อไปนี้ที่ด้านบนของไฟล์เพื่อ import ไลบรารี threading ของ Python: ```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) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้