สารบัญ:
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-13 06:58
ปัญหา - แมวใช้สวนของคุณเป็นห้องน้ำ
วิธีแก้ปัญหา - ใช้เวลามากเกินไปในการออกแบบสปริงเกลอร์แมวด้วยคุณสมบัติอัปโหลด youtube อัตโนมัติ
นี่ไม่ใช่ทีละขั้นตอน แต่เป็นภาพรวมของการก่อสร้างและรหัสบางส่วน
#BeforeYouCallPETA - แมวสบายดี เพราะเป็นสปริงเกอร์แรงดันต่ำเหมือนสายฝน ที่พวกมันวิ่งได้เร็วกว่าที่มันจะหมุนรอบตัวพวกมัน โปรเจ็กต์นี้ไม่ใช่การแช่แมว แต่เพื่อเอาพวกมันออกไปก่อนที่พวกมันจะทิ้งขยะในสวนของฉันด้วย Barkers Eggs เวอร์ชั่นแมว
ขั้นตอนที่ 1: รายการหลักที่จำเป็น
Raspberry Pi zero & การ์ด SD
กล้อง Raspberry Pi
รีเลย์
555 จับเวลา…. (หรือ Arduino และรีเลย์อื่นหากตัวจับเวลา 555 ของคุณไม่มาถึง)
โซลินอยด์
สปริงเกลอร์
ที่อยู่อาศัยบางชนิดสำหรับอุปกรณ์อิเล็กทรอนิกส์
ความเต็มใจที่จะตอกตะปูเปรียบเทียบด้วยค้อนเลื่อนขนาด 6 ตัน
กล้องความละเอียดน้อยจนแทบไม่เห็นน้ำ แต่ยังเห็นแมววิ่งหาที่กำบัง
ขั้นตอนที่ 2: ระบบ
1, กล้อง Pi ตรวจพบวัตถุขนาดแมวที่เคลื่อนไหวสำหรับเฟรมกล้องสองสามเฟรม (อธิบายในขั้นตอนต่อไป)
2, Pi ออกสปริงเกอร์
3 แมววิ่งหาที่กำบัง
4 อัปโหลดวิดีโอไปยัง youtube โดยอัตโนมัติเพื่อความเพลิดเพลินในการรับชม
ขั้นตอนที่ 3: เวลาการเข้ารหัส
การใช้ openCV โดยใช้การลบเฟรม คุณสามารถค้นหาพื้นที่ของเฟรมที่เปลี่ยนแปลงเมื่อเวลาผ่านไป โดยใช้ฟังก์ชันที่ดี คุณจะสามารถทราบได้ว่าการเปลี่ยนแปลงเหล่านี้มีขนาดใหญ่เพียงใดและยังคงมีอยู่เมื่อเวลาผ่านไปหรือไม่ และที่สำคัญที่สุดคือตรวจสอบว่ามีขนาดเท่าแมวหรือไม่
มีบทแนะนำเกี่ยวกับการลบเฟรมค่อนข้างน้อยซึ่งมีรายละเอียดมากหากคุณทำการค้นหาโดย Google อย่างรวดเร็ว
ภาพรวมวิธีการทำงานของโค้ด
1, กล้องยังคงถ่ายเฟรมและเปรียบเทียบกับเฟรมสุดท้าย
2 ถ้าตรวจพบรูปร่างขนาดแมว จะสังเกตเห็น
3 หากการเปลี่ยนแปลงขนาดของแมวยังคงมีอยู่ประมาณ 4 เฟรม pi จะใช้ GPIO เพื่อถ่ายทอดพลังงานเพื่อเริ่ม Arduino
4, Arduino ส่งสัญญาณไปยังรีเลย์ตัวที่สองเป็นเวลา 5 วินาทีซึ่งเปิดใช้งานโซลินอยด์
5, โซลินอยด์เมื่อขับเคลื่อนช่วยให้น้ำไปยังสปริงเกลอร์
6 ในขณะที่สปริงเกอร์กำลังทำงานอยู่ กล้องจะหยุดตรวจจับและบันทึกวิดีโอ
7, วิดีโอถูกอัปโหลดไปยัง Youtube
8, อัปโหลดภาพนิ่งไปยังดรอปบ็อกซ์สำหรับระบบปรับแต่งอย่างละเอียด
หมายเหตุ - ทำไมฉันถึงลงเอยด้วยการใช้รีเลย์ 2 ตัวและ Arduino เพื่อเปิดโซลินอยด์เป็นเวลา 5 วินาที…..
1, pi ไม่สามารถเริ่มและหยุดโซลินอยด์ขณะบันทึกวิดีโอเนื่องจาก python scrips หยุดชั่วคราวจนกว่าวิดีโอจะเสร็จสิ้น ดังนั้นจึงจำเป็นต้องใช้ Arduino (หรือ 555 timer) เพื่อให้โซลินอยด์เปิดและปิดโดยอิสระกับสคริปต์ในขณะที่ วิดีโอยังคงบันทึกอยู่
2, รีเลย์และ Arduino ตัวแรกสามารถแทนที่ด้วยตัวจับเวลา 555 ตัว แต่มาไม่ทันสำหรับโครงการนี้ 555 จะช่วยประหยัดเวลาและขั้นตอนได้มาก
3, pi ไม่สามารถกระตุ้นโซลินอยด์ได้โดยตรงเนื่องจาก Pi GPIO ทำงานบนสูงสุด 3.3v และ 51mA และโซลินอยด์ต้องการ 5V และมากกว่า 51mA เพื่อทริกเกอร์
4 แต่ละเฟรมสามารถครอบตัดเพื่อลบการตรวจจับการเคลื่อนไหวในพื้นที่ที่ไม่ต้องการ เช่น สวนข้างบ้าน หากไม่ทำเช่นนี้จะส่งผลให้เพื่อนบ้านกล่าวว่ามองดูสวนของคุณสับสนเพราะสปริงเกลอร์ดับทุกครั้งที่เขาต้องการเข้าไปในโรงเก็บของ
5 ฉันอาจพลาดบางสิ่งที่ชัดเจนและเสียเวลาตั้งค่าเช่นนี้
รหัสด้านล่าง
นำเข้า cv2import numpy เป็น np นำเข้า argparse #cat เวลานำเข้า นำเข้า RPi. GPIO เป็น GPIO นำเข้าระบบปฏิบัติการ ดรอปบ็อกซ์จาก picamera.array นำเข้า PiRGBArray จาก picamera นำเข้า PiCamera # ------------------ ------------------------------ อัปโหลดไปยัง youtube ------------------ ---------------------- def HDtoYouTube(): ctime = time.strftime("_%H-%M-%S") cdate = time.strftime ("_%d-%m-%Y") vidname = ctime + cdate #Trigger relay GPIO.output (11, True) time.sleep (.5) GPIO.output (11, False) พิมพ์ ("การถ่ายวิดีโอ") ลอง: #Take Video os.system('raspivid -w 1640 -h 922 -o vid{0}.h264 -t 15000'.format(vidname)) #Upload to youtube print("Uploading to YouTube") os system('sudo youtube-upload --title="Cat Got Wet {0}" --client-secrets=client_secret.json vid{0}.h264'.format(vidname)) #ลบไฟล์วิดีโอเมื่อเสร็จแล้ว os.remove ('vid{0}.h264'.format(vidname)) print("วิดีโอที่อัปโหลดและนำออกจาก Pi") ยกเว้น: ผ่าน #-------------------- ------------------------------------ ยังคงดรอปบ็อกซ์ -------------------- -------------------- def St illsToDropbox(): print("Uploading Still To Dropbox Function") access_token = 'Ah ah ah คุณไม่ได้พูดคำวิเศษณ์…อ้า อ้า อ้า คุณไม่ได้พูดคำวิเศษณ์' ctime = time.strftime(" %H:%M:%S") cdate = time.strftime("%d-%m-%Y") ลอง: filename = "/Motion/{0}/DetectedAt_{1}.jpg".format(cdate, ctime) พิมพ์ (ชื่อไฟล์) ไคลเอนต์ = dropbox.client. DropboxClient (access_token) รูปภาพ = เปิด ("ToDropbox.jpg", 'rb') client.put_file (ชื่อไฟล์, รูปภาพ) image.close () os.remove ("ToDropbox.jpg") ยกเว้น: ผ่าน #----------------------------- ------ตรวจจับการเคลื่อนไหว----------------------------------------- def DetectMotion(): #Define vars min_area = 400 tolarance = 25 #change in pixel bluramount = 21 timetoforget = 0.5 kernel = np.ones((5, 5), np.uint8) #used for dialate MotionCounter = 0 MinTargetArea = 600 # ขนาดที่เล็กที่สุดในการตรวจจับ MaxTargetArea = 5000 #ขนาดที่ใหญ่ที่สุดในการตรวจจับตอนนี้ = time.time() จากนั้น = time.time() #initialise camera camera = PiCamera() camera. resolution = (640, 480) camera.framerate = 10 raw Capture = PiRGBArray(camera, size=(640, 480)) #warmup camera time.sleep(1) #Grab first frame & prep it to go in cv2.acumulate weight camera.capture(rawCapture, format="bgr") เฉลี่ย = rawCapture.array #ครอบตัดส่วนที่ไม่ต้องการ PolyCrop = np.array(
#HowToTriggerRealProgrammersWithBadCode
ขั้นตอนที่ 4: นำมันมารวมกัน
ยัดอุปกรณ์ไฟฟ้าลงในกล่องกันน้ำ ขันสกรูเข้ากับผนัง และใช้เทปพันสายไฟและกาวร้อนจำนวนมาก
ขั้นตอนที่ 5: ผลลัพธ์
เมื่อมันทำงานมันทำงาน
ขั้นตอนที่ 6: ผลบวกที่ผิดพลาด
เมื่อไม่พ่นเงาแมว ภรรยาและลูกสาวของคุณ
เคล็ดลับจากมือโปร - วางสวิตช์ข้างประตูเพื่อหยุดโปรแกรมตรวจจับการเคลื่อนไหวชั่วคราว….. จากนั้นลืมใช้และเปียกน้ำเมื่อนำถังขยะออก
หวังว่าฉันจะทำให้ผู้เชี่ยวชาญในการเขียนโปรแกรม อิเล็กทรอนิกส์ และ DIY ประนีประนอมกับข้อผิดพลาดทั้งหมดที่ฉันอาจทำ และโดยเฉพาะอย่างยิ่งหวังว่าคุณจะสนุกกับการสะกดคำผิดทั้งหมดของฉัน