สารบัญ:
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-13 06:58
ตู้แช่แข็งของเราอยู่ในห้องเอนกประสงค์ซึ่งแยกออกจากพื้นที่อยู่อาศัยของเรา บางครั้งประตูช่องแช่แข็งปิดไม่สนิทและสัญญาณเตือนจะดับลง ปัญหาคือเราจะไม่ได้ยินมันหากเราอยู่ในพื้นที่อยู่อาศัยของเรา เราได้รับข้อความว่าประตูช่องแช่แข็งเปิดอยู่ได้อย่างไร? นี่เป็นปัญหาทั่วไป เรามีอุปกรณ์ในบ้านที่คุยกับเรา แต่จะเกิดอะไรขึ้นถ้าเราไม่ได้ยินด้วยเหตุผลใดก็ตาม ฉันเริ่มต้นสิ่งนี้ด้วยความสนุกสนาน แต่อาจนำไปใช้ในแอปพลิเคชันที่จริงจังกว่านี้
ปัญหานี้มีอยู่ 2 ส่วน เราต้องการวิธีการตรวจจับสัญญาณเตือนภัยที่ดับลง และวิธีการถ่ายทอดข้อเท็จจริงนี้ไปยังพื้นที่อยู่อาศัยของเรา การออกแบบที่ฉันใช้คือการใช้ Raspberry Pi เพื่อฟังสัญญาณเตือนช่องแช่แข็งที่ดับลง จากนั้นจึงส่งข้อความเตือนที่ได้ยินไปยังวิทยุในประเทศของฉันซึ่งเปิดใช้งาน uPNP Universal Plug and Play (UpnP) เป็นมาตรฐานสำหรับการค้นหาและโต้ตอบกับบริการต่างๆ ที่นำเสนอโดยอุปกรณ์ต่างๆ บนเครือข่าย รวมถึงเซิร์ฟเวอร์สื่อและเครื่องเล่น แม้ว่าฉันไม่คิดว่าตู้แช่แข็งจะถูกสร้างขึ้นเมื่อมีการพัฒนามาตรฐาน ข้อความเตือนมีเสียงดังและน่ารำคาญ และซ้ำไม่รู้จบจนกระทั่งปิดวิทยุ
ฉันเลือกที่จะตรวจจับการเตือนด้วย Raspberry Pi Zero W และ Seeed ReSpeaker 2-Mics Pi HAT Raspberry PI Zero เป็นรุ่นราคาประหยัดของ Raspberry Pi และตัวเลือก W มี WiFi ในตัว ในขณะที่ Seeed Pi HAT จำหน่ายในราคาต่ำกว่า $10 มีไฟ LED ในตัวและปุ่มผู้ใช้ Pi HAT เป็นการ์ดต่อที่เสียบเข้ากับ Raspberry Pi โดยตรง ทำให้มีขั้นตอนการประกอบที่ง่ายมาก รุ่น Pi ใด ๆ จะมีความสามารถมากกว่างานนี้และไมโครโฟนที่เลือกสามารถถูกแทนที่ได้แม้ว่าฉันจะใช้ไฟ LED ในตัวในโครงสร้างนี้
ง่ายที่จะตรวจสอบว่าวิทยุหรือทีวีเหมาะกับคุณหรือไม่ มีแนวโน้มที่จะอธิบายว่า "เปิดใช้งาน DLNA" หรือคล้ายกัน สิ่งนี้ใช้ uPNP ในการสื่อสาร บนพีซีที่ใช้ Windows ให้เลือกไฟล์ mp3 และ “Cast to Device” หากอุปกรณ์ของคุณปรากฏขึ้นและคุณสามารถเล่นไฟล์ได้ แสดงว่าคุณพร้อมแล้ว
ฉันแบ่งซอฟต์แวร์ออกเป็น 2 สคริปต์ python, checkFreezer.py เพื่อตรวจสอบว่ามีการทริกเกอร์การแจ้งเตือนช่องแช่แข็งหรือไม่ และ RaiseAlarm.py เพื่อส่งสัญญาณเตือน สคริปต์เหล่านี้สามารถพัฒนาและทดสอบแยกกันได้ และสามารถดัดแปลงหรือแทนที่ได้อย่างง่ายดายสำหรับวิธีการส่งเสียงเตือนของไมโครโฟนแบบต่างๆ
เสบียง
- ซอฟต์แวร์ -https://github.com/wapringle/freezer-alarm
- ราสเบอร์รี่ PI Zero W
- Seeed ReSpeaker 2-Mics Pi HAT
- วิทยุที่เปิดใช้งาน uPNP
ขั้นตอนที่ 1: การออกแบบตัวตรวจจับ
เมื่อเปิดประตูช่องแช่แข็งทิ้งไว้และอุณหภูมิสูงขึ้น ช่องแช่แข็งจะส่งเสียงเตือน "บี๊บบี๊บ" เช่นเดียวกับเสียงบี๊บอิเล็กทรอนิกส์ส่วนใหญ่ นี่คือความถี่เดียว แนวคิดคือการสุ่มตัวอย่างอินพุตเสียง ดำเนินการ Fast Fourier Transform (FFT) ซึ่งแปลงสัญญาณตามเวลาเป็นความถี่ตาม กล่าวอีกนัยหนึ่งคือการแยกสัญญาณเพื่อแสดงความถี่ต่างๆ ในสัญญาณ ดู Raspberry Pi Spectrum Analyzer ที่สอนได้พร้อมแถบ LED RGB เราสามารถค้นหาจุดสูงสุดที่ความถี่เสียงกริ่งและเรียกการเตือนเมื่อเสียงกริ่งเปิดใช้งานอยู่ระยะหนึ่ง
เครื่องตรวจจับนี้มีข้อกำหนด 2 ข้อ
- ควรตรวจจับเสียงกริ่งแม้ในที่ที่มีเสียงรบกวนรอบข้าง (กำจัดลบเท็จ)
- ไม่ควรถูกกระตุ้นโดยเสียงรบกวนรอบข้าง (กำจัดผลบวกที่ผิดพลาด)
ฉันตัดสินใจว่าการใช้ฮูเวอร์ในห้องเอนกประสงค์จะเป็นการทดสอบที่ดี ไม่ควรส่งสัญญาณเตือน และควรเปิดสัญญาณเตือนเมื่อเสียงกริ่งของช่องแช่แข็งดับลงและฮูเวอร์กำลังทำงาน
ขั้นตอนที่ 2: การกำหนดค่าตัวตรวจจับ
ด้วยโทรศัพท์ของฉัน ฉันเก็บตัวอย่างเสียงเป็นไฟล์ WAV ของออดช่องแช่แข็งเพียงอย่างเดียว โดยมีพื้นหลังที่มีเสียงดัง และขณะที่ฮูเวอร์ทำงาน ฉันปรับโค้ดเพื่อดำเนินการ FFT จากโพสต์ Reading Audio Stream สำหรับ FFT (หากมีข้อสงสัย ให้ลอกเลียนแบบ) และใช้สคริปต์ fourierTest.py เพื่อพล็อตตัวอย่างแบบ Raw และ Fourier Transformed ของออดในพื้นหลังที่เงียบ มีเสียงดัง และมีเสียงดังมาก การเพิ่มขึ้นของระดับที่ความถี่ 645 นั้นเด่นชัดในโครงเรื่องแรกและยังคงมีนัยสำคัญโดยมีพื้นหลังที่มีเสียงดังมาก
ขั้นตอนที่ 3: การสร้างตัวตรวจจับ
การประกอบเครื่องตรวจจับ
ง่ายมาก. Pi W มาพร้อมกับ Wifi ในตัวและ HAT เสียบเข้ากับหมุด GPIO บน Pi การกำหนดค่าซอฟต์แวร์ต้องใช้ขั้นตอน
- ติดตั้ง raspbian distro บน Raspberry Pi มีคำแนะนำมากมายเกี่ยวกับเรื่องนี้ที่สามารถอธิบายได้ดีกว่าที่ฉันทำได้
- ตั้งค่า Wifi (เหมือนกันด้านบน)
- ต้องติดตั้งแพ็คเกจ alsa
$ sudo apt-get ติดตั้ง libasound-dev
$ pip ติดตั้ง pyalsaaudio
- เชื่อมต่อ HAT กับราสเบอร์รี่ PI
- ทำตามคำแนะนำบนเว็บไซต์ seeed เพื่อติดตั้งไดรเวอร์สำหรับ HAT
- เรียกใช้ seeed diagnostics เพื่อตรวจสอบว่า HAT ทำงานและกำหนดค่าอย่างเหมาะสม
โปรแกรมตรวจจับจะอ่านกลุ่มข้อมูลเป็นตัวอย่างจากไมโครโฟน ทำ FFT และตัดสินใจว่าจะตรวจพบสัญญาณเสียงในตัวอย่างหรือไม่ ฉันพยายามสร้างบล็อกให้นานที่สุดโดยลดอัตราการสุ่มตัวอย่างเสียงเป็น 16kHz และใช้บัฟเฟอร์ที่ใหญ่ที่สุดที่ผู้อ่านยอมรับได้ ฉันกังวลว่าการคำนวณ FFT อาจทำให้เฟรมหลุด แต่ก็ไม่เกิดขึ้น
การบันทึกตัวอย่างไว้ล่วงหน้าบนโทรศัพท์ทำให้การสร้างเครื่องตรวจจับง่ายขึ้นมาก เนื่องจากฉันสามารถประกอบโครงสร้างทั้งหมดบนม้านั่งก่อนที่จะทำการทดสอบในแหล่งกำเนิดโดยใช้ช่องแช่แข็ง
การฝึกอบรมเครื่องตรวจจับ
เครื่องตรวจจับได้รับการฝึกฝนโดยการสแกนแต่ละตัวอย่างเมื่อมีการเล่นการบันทึก WAV ของออดไปที่เครื่องตรวจจับ โปรแกรมจะแสดงตำแหน่งในสเปกตรัม FFT ที่มีระดับพลังงานสูงสุด (ความถี่สูงสุด) ร่วมกับระดับของความถี่สูงสุดนั้น การหาความถี่ของออดและระดับกำลังที่เปล่งออกมานั้นเป็นเรื่องง่าย
มี 2 วิธีในการตรวจสอบว่าเสียงบี๊บเกิดขึ้นหรือไม่:-
- ความถี่เสียงกริ่งเป็นความถี่สูงสุดในตัวอย่างหรือไม่
- หรือระดับพลังงานที่ความถี่ออดเกินเกณฑ์หรือไม่?
ทั้งสองวิธีทำงานในตัวอย่างที่เงียบ แต่วิธีที่สองดีกว่ากับตัวอย่างที่มีเสียงดัง ดังนั้นฉันจึงใช้วิธีนั้น
บางครั้งตัวอย่างก็ปิดเสียงบี๊บ บางครั้งก็อยู่ระหว่างเสียงบี๊บ และหลังจากเสียงบี๊บทุกๆ 3 ครั้ง จะมีการหยุดยาวก่อนจะส่งเสียงบี๊บครั้งต่อไป เพื่อตรวจจับได้อย่างน่าเชื่อถือว่ามีชุดของเสียงบี๊บเกิดขึ้น แต่ละตัวอย่างมีการโหวตเห็นด้วยหากตรวจพบเสียงบี๊บ และโหวตลงหากไม่มี คะแนนเหล่านี้ถูกถ่วงน้ำหนักเพื่อตั้งค่าการนับซึ่งจะชนกับตัวอย่างเสียงบี๊บและค่อยๆ ลดลงระหว่างช่วงเวลาต่างๆ เมื่อการนับถึงเกณฑ์ สัญญาณเตือนก็จะเริ่มทำงาน หากตรวจพบสัญญาณรบกวนแบบสุ่มเป็นตัวอย่างเสียงบี๊บ การนับจะเลื่อนกลับไปเป็นศูนย์
เราต้องการน้ำหนักสำหรับ upvote และ downvote พร้อมกับเกณฑ์ ฉันทำสิ่งนี้ด้วยการลองผิดลองถูกกับตัวอย่างจำนวนหนึ่ง ฉันไม่จำเป็นต้องกำหนดความถี่เสียงกริ่งจริง ฉันแค่มองหาความถี่ที่โดดเด่นในสเปกตรัม fft
ขั้นตอนที่ 4: การส่งข้อความไปยังวิทยุ
การปลุกด้วยสคริปต์แยกต่างหาก หน้าที่คือเปิดวิทยุถ้าจำเป็น เจาะเข้าไปในสิ่งที่วิทยุกำลังเล่นอยู่ และทำซ้ำข้อความเตือนจนกว่าวิทยุจะปิดอีกครั้ง ฉันต้องวิศวกรรมย้อนกลับโปรโตคอล uPnP ที่ใช้เนื่องจากฉันมีปัญหามากในการรับข้อมูลหรือตัวอย่างที่เชื่อถือได้ ข้อมูลอ้างอิงที่ฉันพบว่ามีประโยชน์คือ
- www.electricmonk.nl/log/2016/07/05/exploring-upnp-with-python/ นี่เป็นภาพรวมที่ดีว่าทุกอย่างเข้ากันได้อย่างไร
- developer.sony.com/develop/audio-control-api/get-started/browse-dlna-file
- stackoverflow.com/questions/28422609/how-to-send-setavtransporturi-using-upnp-c/35819973
ฉันใช้ Wireshark ที่ทำงานบนพีซีที่ใช้ Windows เพื่อยกเลิกการเลือกลำดับข้อความเมื่อเล่นไฟล์ตัวอย่างจากพีซีของฉันทางวิทยุ และหลังจากเล่นซอเล็กน้อย ฉันก็ได้ลำดับคำสั่งที่ใช้งานได้ นี่คือ
- เปิดเว็บเซิร์ฟเวอร์ป๊อปอัปเพื่อแสดงข้อความเตือนเมื่อวิทยุร้องขอ
- ตั้งระดับเสียงเป็น LOUD (ข้อความเตือนควรดึงดูดความสนใจของทุกคน)
- ส่ง uri ของข้อความเตือนไปยังวิทยุ
- โพลวิทยุจนสถานะปัจจุบันเป็น "STOPPED"
- รับวิทยุเพื่อ "เล่น" uri
- ทำซ้ำ 2 ขั้นตอนสุดท้ายจนกระทั่งสถานะปัจจุบันเป็น "NO MEDIA PRESENT" ซึ่งหมายความว่าระบบตอบรับการปลุกโดยการปิดวิทยุ
- สุดท้ายปิดเว็บเซิร์ฟเวอร์และออก
นี่คือสคริปต์ riseAlarm.py
ขั้นตอนที่ 5: ลงมือทำเอง
โมเดล "ตัวตรวจจับ" และ "สัญญาณเตือนภัย" ไม่ได้มีไว้สำหรับตู้แช่แข็งเท่านั้น แต่ยังมีประโยชน์ในทุกที่ที่ต้องการส่งสัญญาณเตือนภัยอัตโนมัติผ่านสื่ออื่น ถ้าจะน่าสนใจขนาดนี้ เชิญเลยครับ
การตั้งค่า PI Zero W รวมถึงไมโครโฟน
- ประกอบฮาร์ดแวร์ตามขั้นตอนที่3
- ดาวน์โหลดสคริปต์การเตือนช่องแช่แข็งจากคำแนะนำนี้ หรือจากที่เก็บ git ซึ่งมีแทร็กโบนัสสองสามแทร็ก
$ git cloneคุณต้องติดตั้งซอฟต์แวร์เพื่อใช้ไฟ LED APA102 บนบอร์ด ฉันได้รวมสำเนาของ apa102.py ไว้ในไดเร็กทอรีการทำงาน git
ฝึกเครื่องตรวจจับของคุณ
ฉันได้เพิ่มตัวเลือกการฝึกอบรมให้กับสคริปต์ checkFreezer.py การดำเนินการนี้จะรันแบบสแตนด์อโลนและพิมพ์การวินิจฉัยไปยังบรรทัดคำสั่ง แต่ก่อนอื่น คุณต้องบันทึกตัวอย่างการเตือนบางส่วนในสภาพแวดล้อมที่เงียบเป็นไฟล์ WAV และทำเช่นเดียวกันกับไฟล์ที่มีสัญญาณรบกวน ในการฝึกให้สำเร็จ คุณต้องหาความถี่ FFT ที่มีระดับสูงสุดก่อน ("ความถี่สูงสุด") จากนั้นจึงหาระดับเกณฑ์สำหรับความถี่นั้นเพื่อตั้งค่าทริกเกอร์ ในการดำเนินการนี้ ให้เรียกใช้สคริปต์ checkFreezer ในโหมดการฝึก ด้วยตัวเลือก '-t' และเล่นการบันทึกการเตือน
$ หลาม checkFreezer.py -t
การดำเนินการนี้สคริปต์ในโหมดการฝึกอบรม มันพิมพ์ว่า "พร้อม" เมื่อเริ่มต้น HAT ที่เห็นแล้วและไฟ LED เปลี่ยนเป็นสีเขียว จากนั้นจะเป็นเส้นสำหรับเสียงที่ไม่สำคัญที่ได้ยิน เช่น
$ หลาม checkFreezer.py -t
ความถี่สูงสุดพร้อม 55 ทริกเกอร์ระดับ 1 ถูกทริกเกอร์หรือไม่ ความถี่สูงสุดผิดพลาด 645 ระดับทริกเกอร์ 484 ถูกทริกเกอร์หรือไม่ ความถี่สูงสุดผิดพลาด 645 ระดับทริกเกอร์ 380 ถูกทริกเกอร์หรือไม่ เท็จ
ความถี่สูงสุดคือ ในกรณีนี้คือ 645 และนั่นจะกลายเป็นความถี่ทริกเกอร์ ตอนนี้เพื่อให้ได้ระดับทริกเกอร์ ให้รัน checkFreezer อีกครั้ง ตั้งค่า trigger
$ หลาม checkFreezer.py -t --trigger=645
ความถี่สูงสุดพร้อม 645 ระดับทริกเกอร์ 1273 ถูกทริกเกอร์หรือไม่ ความถี่สูงสุดผิดพลาด 645 ระดับทริกเกอร์ 653 ถูกทริกเกอร์หรือไม่ ความถี่สูงสุดผิดพลาด 645 ระดับทริกเกอร์ 641 ถูกทริกเกอร์หรือไม่ ความถี่สูงสุดผิดพลาด 645 ระดับทริกเกอร์ 616 ถูกทริกเกอร์หรือไม่ เท็จ
สุดท้าย เราต้องการธรณีประตูทริกเกอร์ที่จะเริ่มทำงานเมื่อตรวจพบเสียงบี๊บ แต่จะไม่สนใจเสียงรบกวน เช่น
$ หลาม checkFreezer.py -t --trigger=645 --threshold=500
ความถี่สูงสุดพร้อม 645 ระดับทริกเกอร์ 581 ถูกทริกเกอร์หรือไม่ ความถี่สูงสุดที่แท้จริง 645 ระดับทริกเกอร์ 798 ถูกทริกเกอร์หรือไม่ ความถี่สูงสุดที่แท้จริง 645 ระดับทริกเกอร์ 521 ถูกทริกเกอร์หรือไม่ จริง
ทดสอบกับตัวอย่างที่มีสัญญาณรบกวนสองสามตัวอย่าง และคุณควรจะสามารถสร้างค่าเกณฑ์ที่แยกแยะระหว่างเสียงของตัวไล่เสียงและเสียงรอบข้างได้ คุณควรเห็นไฟ LED เปลี่ยนเป็นสีแดงเมื่อมีการเรียงลำดับเสียงบี๊บเป็นเวลาสองสามวินาที หากจะเร็ว/ช้าในการแก้ไขการตั้งค่าในสคริปต์
การเชื่อมต่อกับวิทยุ
ในการกำหนดค่าสคริปต์สำหรับการตั้งค่าของคุณเอง คุณต้องค้นหาที่อยู่ IP และหมายเลขพอร์ตที่อุปกรณ์ของคุณใช้สำหรับบริการ UPnP การตั้งค่าวิทยุควรมีสิ่งเหล่านี้ หมายเลขพอร์ตเริ่มต้นคือ 8080 และจะแปลกใจหากแตกต่างกัน
ฉันได้ระบุข้อความเตือนเริ่มต้นที่ชื่อตู้แช่แข็ง.mp3 รู้สึกอิสระที่จะแทนที่ด้วยข้อความของคุณเอง
แก้ไขสคริปต์ด้วยที่อยู่ IP ที่เหมาะสมและเรียกใช้สคริปต์
$ หลาม riseAlarm.py
ถ้าทุกอย่างเรียบร้อยดี ข้อความเตือนที่ดังและน่ารำคาญจะระเบิดออกจากวิทยุของคุณจนกว่าวิทยุจะปิด เป็นการยกเลิกการปลุก
ในขณะที่สคริปต์กำลังทำงานอยู่ จะรันเว็บเซิร์ฟเวอร์ขนาดเล็กเพื่อให้บริการเสียงเตือน mp3 ไปยังวิทยุ อาจเป็นปัญหาด้านความปลอดภัย แต่จะใช้งานได้เฉพาะในขณะที่ข้อความเตือนกำลังเล่นอยู่
กำลังถ่ายทอดสด
ลบแฟล็กการฝึก '-t' และเรียกใช้ checkFreezer ด้วยค่าของคุณเอง เช่น
$ หลาม checkFreezer.py --trigger=645 --threshold=200
หากต้องการเริ่มต้นการรีบูต ให้เพิ่มในไฟล์ /etc/rc.local
cd /home/pi/ตู้แช่แข็ง-นาฬิกาปลุก
(หลาม checkFreezer.py --trigger=645 --threshold=200 > /tmp/freezer 2> /tmp/freezererror &) & ออก 0
ไฟ LED สีเขียวจะสว่างขึ้นและคุณพร้อมสำหรับการดำเนินการ เล่นเสียงบี๊บเตือนของคุณ หลังจากนั้นไม่กี่วินาที ไฟ LED จะเปลี่ยนเป็นสีแดง และข้อความเตือนจะเล่นทางวิทยุของคุณ
ในที่สุด
วาง PI ไว้ที่ตำแหน่งใกล้กับช่องแช่แข็ง ให้พ้นทาง และข้างแหล่งจ่ายไฟ เปิดเครื่องและไฟ LED สีเขียวควรติด ทดสอบการปลุกโดยการเปิดประตูทิ้งไว้ ไฟควรเปลี่ยนเป็นสีแดงและข้อความเตือนจะเล่นทางวิทยุ
ความสำเร็จ !! คุณทำได้แล้ว ให้รางวัลตัวเองด้วยเครื่องดื่มเย็นๆ จากช่องแช่แข็ง แต่อย่าลืมปิดประตูช่องแช่แข็ง!