สารบัญ:

เครื่องจ่ายอาหารสัตว์เลี้ยงอัตโนมัติ: 9 ขั้นตอน
เครื่องจ่ายอาหารสัตว์เลี้ยงอัตโนมัติ: 9 ขั้นตอน

วีดีโอ: เครื่องจ่ายอาหารสัตว์เลี้ยงอัตโนมัติ: 9 ขั้นตอน

วีดีโอ: เครื่องจ่ายอาหารสัตว์เลี้ยงอัตโนมัติ: 9 ขั้นตอน
วีดีโอ: เครื่องให้อาหารสัตว์อัตโนมัติโซล่าเซลล์ 2024, มิถุนายน
Anonim
เครื่องจ่ายอาหารสัตว์เลี้ยงอัตโนมัติ
เครื่องจ่ายอาหารสัตว์เลี้ยงอัตโนมัติ

เคยรู้สึกว่าเสียเวลามากเกินไปในการให้อาหารสัตว์เลี้ยงของคุณ? เคยต้องโทรหาใครสักคนเพื่อให้อาหารสัตว์เลี้ยงของคุณในขณะที่คุณไปเที่ยวพักผ่อนหรือไม่? ฉันได้ลองแก้ไขปัญหาทั้งสองนี้กับโครงการโรงเรียนปัจจุบันของฉันแล้ว: Petfeed!

เสบียง

ราสเบอร์รี่ Pi 3b

บาร์โหลดเซลล์ (10กก.)

HX711 โหลดเซลล์แอมพลิฟายเออร์

เซ็นเซอร์ระดับน้ำ (https://www.dfrobot.com/product-1493.html)

อัลตราโซนิกพร็อกซิมิตีเซนเซอร์

LCD 16 พิน

2x สเต็ปเปอร์มอเตอร์ 28byj-48

ตัวขับสเต็ปเปอร์มอเตอร์ 2x ULN2003

ขั้นตอนที่ 1: การเดินสายไฟ

การเดินสายไฟ
การเดินสายไฟ
การเดินสายไฟ
การเดินสายไฟ

มีสายมากมายที่นี่ ดึงสายจัมเปอร์ออกแล้วเริ่มปักหมุด!

ขั้นตอนที่ 2: ทำให้โหลดเซลล์ของคุณใช้งานได้

ทำให้โหลดเซลล์ของคุณใช้งานได้
ทำให้โหลดเซลล์ของคุณใช้งานได้

ในการใช้โหลดเซลล์ ก่อนอื่นเราต้องติดไว้กับแผ่นสองแผ่น: แผ่นด้านล่างและแผ่นที่เราจะชั่งน้ำหนักอาหารของเรา

สกรูที่คุณต้องการคือสกรู M4 หนึ่งคู่พร้อมสลักเกลียวที่เข้าชุดกัน และสกรู M5 หนึ่งคู่พร้อมสลักเกลียวที่เข้าชุดกัน ฉันใช้สว่านขนาดเล็กเพื่อทำรู

(รูป:

ขั้นตอนที่ 3: ฐานข้อมูลปกติ

ฐานข้อมูลมาตรฐาน
ฐานข้อมูลมาตรฐาน

ข้อมูลจากเซ็นเซอร์ของเราจะต้องถูกบันทึกไว้ในฐานข้อมูล สำหรับไฟล์ python เพื่อเชื่อมต่อกับฐานข้อมูล: ดูด้านล่าง

คุณต้องมีไฟล์ปรับแต่งด้วย:

[connector_python]user = *yourusername* host = 127.0.0.1 #if local port = 3306 password = *yourpassword* database = *yourdb* [application_config] driver = 'SQL Server'

ขั้นตอนที่ 4: การเข้ารหัสโหลดเซลล์

นำเข้า RPi. GPIO เป็น GPIOนำเข้าเวลานำเข้าเธรดจาก hx711 นำเข้า HX711 จาก helpers.stepperFood นำเข้า StepperFood จาก helpers. LCDWrite นำเข้า LCDWrite จากที่เก็บ DataRepository นำเข้า DataRepository

หลังจากนำเข้าไลบรารีทั้งหมดของเราแล้ว (หมายเหตุ เรากำลังใช้ไลบรารี HX711 เพื่อขับเคลื่อนโหลดเซลล์) เราสามารถเริ่มเขียนโค้ดจริงของเราได้

TARRA_CONSTANT = 80600

GRAM_CONSTANT = 101

สำหรับการหาค่าคงที่ของเรา ก่อนอื่นให้ตั้งค่า TARRA_CONSTANT = 0 และ GRAM_CONSTANT = 1

ต่อไป เราต้องค้นหาค่าโหลดเซลล์ของเราที่อ่านเมื่อไม่มีการชั่งน้ำหนัก ค่านี้จะเป็น TARRA_CONSTANT

สำหรับ GRAM_CONSTANT เพียงแค่นำวัตถุที่คุณทราบน้ำหนักของ (ฉันใช้ปาเก็ตตี้หนึ่งห่อ) ชั่งน้ำหนักและแบ่งการอ่านโหลดเซลล์ด้วยน้ำหนักจริงของวัตถุ สำหรับฉันนี่คือ 101

คลาส LoadCell(threading. Thread):

def _init_ (ตัวเอง, ซ็อกเก็ต, LCD): threading. Thread._init_ (ตัวเอง) self.hx711 = HX711 (dout_pin=5, pd_sck_pin=6, channel='A', gain=64) self.socket = socket self.lcd = จอแอลซีดี

ที่นี่เราเริ่มต้นคลาส LoadCell และแมปพิน

def รัน (ตัวเอง):

ลอง: ในขณะที่ True: self.hx711.reset() # ก่อนที่เราจะเริ่ม ให้รีเซ็ต HX711 (ไม่บังคับ) Measuring_avg = sum(self.hx711.get_raw_data()) / 5 weight = round((measures_avg - TARRA_CONSTANT) / GRAM_CONSTANT, 0) พิมพ์ ("น้ำหนัก: {0}".format (น้ำหนัก)) DataRepository.insert_weight (น้ำหนัก) data_weight = DataRepository.get_data_sensor(3) historyId = data_weight["SensorsHistory"] db_weight = data_weight["value"] actionTime = data_weight ["actionTime"] self.socket.emit('data_weight', { "id": historyId, "Weight": db_weight, "Time": DataRepository.serializeDateTime(actionTime)}) พิมพ์ ("zou moeten emitten") writeWeight = "weight: " + str(db_weight) msg = "PETFEED" LCDWrite.message() if int(db_weight[:-2]) <= 100: StepperFood.run() time.sleep(20) ยกเว้นข้อยกเว้นเช่น e: print ("ข้อผิดพลาดในการชั่งน้ำหนัก" + str(e))

ขั้นตอนที่ 5: การเข้ารหัสเซ็นเซอร์น้ำ

นำเข้า timeimport threading จาก repositories. DataRepository นำเข้า DataRepository จาก RPi นำเข้า GPIOGPIO.setmode(GPIO. BCM) GPIO.setwarnings(False) GPIO_Water = 18 GPIO.setup(GPIO_Water, GPIO. IN) class WaterSensor(threading. Threadit_): def _in ตัวเอง, ซ็อกเก็ต): threading. Thread._init_ (ตัวเอง) self.socket = socket self.vorige_status = 0 def run (ตัวเอง): ลอง: ในขณะที่ True: water = self.is_water() พิมพ์ (น้ำ) สถานะ = น้ำ [" สถานะ"] action = water["action"] DataRepository.insert_water(str(status), action) data_water = DataRepository.get_data_sensor(2) historyId = data_water["SensorsHistory"] value = data_water["value"] if value == "0": value = "te weinig water" else: value = "genoeg water" actionTime = data_water["actionTime"] self.socket.emit('data_water', { "id": historyId, "value": ค่า "เวลา": DataRepository.serializeDateTime(actionTime), "action": action}) time.sleep(5) ยกเว้นข้อยกเว้นเช่น: print(ex) print('error bij watersensor') def is_water(self): status = GPIO.input(GPIO_Wate r) ถ้า self.vorige_status == 0 และสถานะ == 1: พิมพ์ ('water gedetecteerd') sensorData = {"status": สถานะ "action": "water gedetecteerd"} self.vorige_status = สถานะสถานะ = GPIO.input (GPIO_Water) ถ้า self.vorige_status == 1 และสถานะ == 1: print('water aanwezig') sensorData = {"status": status, "action": "water aanwezig"} status = GPIO.input(GPIO_Water) if self.vorige_status == 1 และสถานะ == 0: print('water weg') sensorData = {"status": status, "action": "water weg"} self.vorige_status = status status = GPIO.input(GPIO_Water) ถ้า self.vorige_status == 0 และ status == 0: print('startpositie') status = GPIO.input(GPIO_Water) sensorData = {"status": status, "action": "startpositie"} return sensorData

ขั้นตอนที่ 6: การเข้ารหัสพร็อกซิมิตีเซนเซอร์

นำเข้าไทม์อิมพอร์ตเธรดจากที่เก็บ DataRepository นำเข้า DataRepository จาก RPi นำเข้า GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (เท็จ) GPIO_Trig = 4 GPIO_Echo = 17 GPIO.setup (GPIO_Trig, GPIO. OUT) GPIO_Echo. IN) def current_milli_time(): return int(round(time.time() * 1000)) คลาส UltrasonicSensor(threading. Thread): def _init_(self, socket): threading. Thread._init_(self) self.socket = socket def run (ตัวเอง): ลอง: last_reading = 0 ช่วงเวลา = 5000 ในขณะที่ True: if current_milli_time() > last_reading + ช่วงเวลา: dist = self.distance () พิมพ์ ("ระยะทางที่วัดได้ = %.1f cm" % dist) DataRepository insert_proximity(dist) data_prox = DataRepository.get_data_sensor (1) historyId = data_prox["SensorsHistory"] prox = data_prox["value"] actionTime = data_prox["actionTime"] self.socket.emit ('data_proximity', { "id": historyId, "Proximity": prox, "Time": DataRepository.serializeDateTime(actionTime)}) last_reading = current_milli_time() ยกเว้นข้อยกเว้น เช่น: print(ex) de ระยะทาง f (ตัวเอง): # ตั้งค่าทริกเกอร์เป็น HIGH GPIO.output (GPIO_Trig, True) # ตั้งค่าทริกเกอร์หลังจาก 0.01ms ถึง LOW time.sleep (0.00001) GPIO.output (GPIO_Trig, False) StartTime = time.time () StopTime = time.time () # บันทึก StartTime ในขณะที่ GPIO.input (GPIO_Echo) == 0: StartTime = time.time () # ประหยัดเวลาในการมาถึงในขณะที่ GPIO.input (GPIO_Echo) == 1: StopTime = time.time () # ความแตกต่างของเวลาระหว่างจุดเริ่มต้นและการมาถึง TimeElapsed = StopTime - StartTime # คูณด้วยความเร็วโซนิค (34300 cm/s) # และหารด้วย 2 เนื่องจากระยะที่นั่นและระยะถอยหลัง = (TimeElapsed * 34300) / 2 ระยะทางกลับ

ขั้นตอนที่ 7: การเข้ารหัส Stepper Motors

นำเข้า RPi. GPIO เป็น GPIO เวลานำเข้า เธรดการนำเข้า GPIO.setmode(GPIO. BCM) GPIO.setwarnings(False) control_pins = [12, 16, 20, 21] สำหรับพินใน control_pins: GPIO.setup(pin, GPIO. OUT) GPIO.output(pin, 0) halfstep_seq =

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

ขั้นตอนที่ 8: การเข้ารหัส LCD

โค้ดเยอะแต่ใกล้เสร็จแล้ว

คลาส LCD ถูกรวมเป็นไฟล์ LCD.py

จาก helpers. LCD นำเข้า LCD

E = 26 RS = 25 D0 = 19 D1 = 13 D2 = 24 D3 = 22 D4 = 23 D5 = 8 D6 = 7 D7 = 10 จอแอลซีดี = LCD (E, RS, [D0, D1, D2, D3, D4, D5, D6, D7]) คลาส LCDWrite: def message(msg): try: print("try") lcd.init_LCD() lcd.send_instruction(12) lcd.clear_display() lcd.write_message(msg, '1') ยกเว้น: print("ข้อผิดพลาด LCDWrite")

ขั้นตอนที่ 9: จุดจบ

ตอนจบ
ตอนจบ
ตอนจบ
ตอนจบ

ผลลัพธ์สุดท้าย: เราวาดมันอย่างไรกับมันจบลงอย่างไร

แนะนำ: