วันที่ 7 ก.ค. 2565, 09:15 น. 101

ให้อาหารแมวอัตโนมัติโดยใช้ Raspberry pi

เครื่องให้อาหารแมวอัตโนมัติโดยใช้ Board Raspberry pi  และ Raspberry pi Camera 

 

เรามักจะไปเที่ยวในช่วงสุดสัปดาห์ แต่เราก็มีสัตว์ตัวเล็กๆ ขนยาวที่ต้องรับผิดชอบอยู่ที่บ้านด้วย ดังนั้น เครื่องป้อนอาหารอัตโนมัติคือคำตอบ!

 

 

เรามักจะให้อาหารมันเวลาประมาณ 07.00 น. ทุกเช้า และเมื่อเรากลับจากที่ทำงาน เวลา 19.00 น. ของทุกเย็น

 

แต่ตัวป้อนนี้มีข้อจำกัดบางประการ โดยหลักแล้ว มีเพียง 1 ตัวจับเวลาเท่านั้น คุณสามารถกำหนดช่วงเวลาระหว่างฟีดเท่านั้น ดังนั้นเพื่อให้อาหารได้ทุกๆ 12 ชั่วโมง เราจึงต้องตั้งเวลาไว้ที่ 12 ชั่วโมง เวลา 07.00 น.

 

ฉันต้องการที่จะสามารถให้อาหารได้ตลอดเวลาที่ฉันเลือก 

 

แผนของฉันคือการใช้พอร์ต GPIO (เอาต์พุตอินพุตวัตถุประสงค์ทั่วไป) เพื่อส่งสัญญาณไปยังตัวป้อน ซึ่งจะ 'กดปุ่ม' และใช้การควบคุมเวลาจากตัวป้อน และให้ฉัน 'โปรแกรม' เวลาโดยนี่คือที่มาของ Raspberry Pi

 

นอกจากนี้ ฉันยังสามารถถ่ายรูปโดยใช้ PiCamera เมื่อชามเปิดขึ้น และส่งอีเมลถึงตัวเองด้วย แบบนี้ค่อยสบายใจหน่อยนะครับ :)

 

รวบรวมแผนในการเขียนโค้ด

ส่วนใหญ่เราต้องการ 4 สิ่งที่เกิดขึ้น

  • ส่งสัญญาณไปที่พิน GPIO เพื่อเปิดตัวป้อน
  • ถ่ายภาพหนึ่งภาพหรือหลายภาพ
  • ส่งรูปภาพเหล่านี้ไปให้ใครซักคน
  • ตั้งเวลาเพื่อให้เหตุการณ์เหล่านี้เกิดขึ้นในช่วงเวลาหนึ่งของวัน

 

 

ก่อนอื่นเราต้องตั้งค่าไคลเอนต์อีเมล คำแนะนำของฉันคือให้คุณสร้างบัญชี Gmail ใหม่ คุณสามารถตั้งชื่อมันว่าเกี่ยวข้องกับ raspberry Pi ของคุณ เนื่องจากคุณสามารถใช้สิ่งนี้กับหลาย ๆ โครงการได้หากต้องการ (แต่ขึ้นอยู่กับคุณ)


 

import RPi.GPIO as GPIO
import time
from picamera import PiCamera
import datetime
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email import encoders

 

 

ไลบรารีเหล่านี้เป็นไลบรารีที่จำเป็นสำหรับพอร์ต GPIO, กล้อง, ไคลเอ็นต์ SMTP (อีเมล) และการเข้ารหัสข้อความ/รูปภาพ เพื่อเพิ่มรูปภาพ รวมทั้ง datetime และเวลา เพื่อให้เราสามารถเพิ่มวันที่และเวลาลงในอีเมลได้

ต่อไปเราจะเริ่มต้นการตั้งค่าอีเมล (ใช้อีเมล/รหัสผ่านของคุณเองที่นี่)

SMTP_SERVER = 'smtp.gmail.com'
SMTP_PORT = 587
GMAIL_USERNAME = 'YOUREMAIL@gmail.com'
GMAIL_PASSWORD = 'YOURPASSWORD'

 

จากนั้นเราเริ่มต้นกล้องและถ่ายภาพ 'แรก' ของเรา

camera = PiCamera() camera.start_preview()
camera.capture('/home/pi/Desktop/FeedCapPre.jpg')
camera.stop_preview()

 

เริ่มต้นพอร์ต GPIO ที่เราต้องการใช้

GPIO.setmode(GPIO.BOARD)
GPIO.setup(11,GPIO.OUT)

 

GPIO.BOARD' แค่บอกโปรแกรมว่าเรากำลังใช้หมายเลข 'บอร์ด'และคำสั่ง 'GPIO.OUT' จะตั้งค่าพินเป็นเอาต์พุต

ต่อไป เรารอ 1 วินาที (เพื่อบันทึกรูปภาพ) และตั้งค่าหมุดเป็น 'จริง' รอครึ่งวินาทีแล้วจึงทดสอบ จากนั้นเราล้างพอร์ต GPIO เนื่องจากเราใช้งานเสร็จแล้ว

time.sleep(1)
GPIO.output(11,True)
time.sleep(0.5)
GPIO.output(11,False)
GPIO.cleanup()

 

ตอนนี้ เรารอ 5 วินาที เพื่อให้เวลาแมวเดินไปที่เครื่องให้อาหาร เริ่มกิน ก่อนที่เราจะถ่ายรูป 'หลัง' นอกจากนี้เรายังปิดกล้องเนื่องจากเราใช้มันเสร็จแล้ว

time.sleep(5)
camera.start_preview()
camera.capture('/home/pi/Desktop/FeedCapPost.jpg')
camera.stop_preview()
camera.close()

 

class Emailer:
    def sendmail(self, recipient, subject, content, image1, image2):
          
        #Create Headers
        emailData = MIMEMultipart()
        emailData['Subject'] = subject
        emailData['To'] = recipient
        emailData['From'] = GMAIL_USERNAME
 
        #Attach our text data  
        emailData.attach(MIMEText(content))
 
        #Create our Image Data from the defined image
        imageData = MIMEImage(open(image1, 'rb').read(), 'jpg') 
        imageData.add_header('Content-Disposition', 'attachment; filename="image.jpg"')
        emailData.attach(imageData)#Create our Image Data from the defined image
        imageData2 = MIMEImage(open(image2, 'rb').read(), 'jpg') 
        imageData2.add_header('Content-Disposition', 'attachment; filename="image.jpg"')
        emailData.attach(imageData2)
  
        #Connect to Gmail Server
        session = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
        session.ehlo()
        session.starttls()
        session.ehlo()
  
        #Login to Gmail
        session.login(GMAIL_USERNAME, GMAIL_PASSWORD)
  
        #Send Email & Exit
        session.sendmail(GMAIL_USERNAME, recipient, emailData.as_string())
        session.quit
  
sender = Emailer()

 

sendTo = 'SENDTOEMAIL@gmail.com'
emailSubject = "Olly has been fed! - " + time.ctime()
emailContent = "Olly fed at: " + time.ctime()
image1 = '/home/pi/Desktop/FeedCapPre.jpg'
image2 = '/home/pi/Desktop/FeedCapPost.jpg'
sender.sendmail(sendTo, emailSubject, emailContent, image1,image2)

 

sudo crontab -e

 

30 19 * * * python /home/pi/FeedOlly.py &

 

หากต้องการบันทึกและออก ให้กด Ctrl+X (เพื่อออก) และ Y เพื่อบันทึกการเปลี่ยนแปลง

_____

วิดีโอสร้างแบบเต็มที่นี่:
Part1 : https://youtu.be/JkKmJ7eeQjQ
Part2:  https://youtu.be/tp6coaSNY9I

_____

ขอบคุณข้อมูลจาก 

Automated cat feeder using a Raspberry Pi and Pi Camera

https://medium.com/@ian.k9.burton/automated-cat-feeder-using-a-raspberry-pi-and-pi-camera-31743f7f05da