جدول المحتويات:

موزع طعام الحيوانات الأليفة الأوتوماتيكي: 9 خطوات
موزع طعام الحيوانات الأليفة الأوتوماتيكي: 9 خطوات

فيديو: موزع طعام الحيوانات الأليفة الأوتوماتيكي: 9 خطوات

فيديو: موزع طعام الحيوانات الأليفة الأوتوماتيكي: 9 خطوات
فيديو: حركة تخلى القط يحبك ❤️ الجزء الاول 🐱 #يوميات_مرعى_براو #cats #pets #قطط 2024, يونيو
Anonim
موزع طعام الحيوانات الأليفة الأوتوماتيكي
موزع طعام الحيوانات الأليفة الأوتوماتيكي

هل شعرت يومًا بإضاعة الكثير من الوقت في إطعام حيوانك الأليف؟ هل اضطررت يومًا إلى الاتصال بشخص ما لإطعام حيواناتك الأليفة أثناء إجازتك؟ لقد حاولت إصلاح هاتين المشكلتين مع مشروع مدرستي الحالي: Petfeed!

اللوازم

Raspberry Pi 3b

خلية تحميل شريط (10 كجم)

HX711 تحميل خلية مكبر للصوت

مستشعر مستوى الماء (https://www.dfrobot.com/product-1493.html)

مستشعر القرب بالموجات فوق الصوتية

ال سي دي 16 سنون

2x محرك متدرج 28byj-48

2x محرك متدرج سائق ULN2003

الخطوة 1: الأسلاك

الأسلاك
الأسلاك
الأسلاك
الأسلاك

الكثير من الكابلات هنا. أخرج كبلات التوصيل الخاصة بك وابدأ في التثبيت!

الخطوة 2: اجعل خلية الحمل قابلة للاستخدام

اجعل خلية الحمل قابلة للاستخدام
اجعل خلية الحمل قابلة للاستخدام

لاستخدام خلية الحمل ، نحتاج أولاً إلى إرفاقها بصفيحتين: صفيحة سفلية ولوحة نزن طعامنا عليها.

البراغي التي تحتاجها هي زوج من البراغي M4 مع مسامير متطابقة وزوج من البراغي M5 مع براغي مطابقة. لقد استخدمت مثقابًا صغيرًا لعمل الثقوب.

(الموافقة المسبقة عن علم:

الخطوة 3: قاعدة البيانات المقيسة

قاعدة بيانات تمت تسويتها
قاعدة بيانات تمت تسويتها

يجب حفظ البيانات من أجهزة الاستشعار لدينا في قاعدة بيانات. لملفات python للاتصال بقاعدة البيانات: انظر أدناه.

فأنت بحاجة أيضًا إلى ملف تهيئة:

[connector_python] user = * yourusername * host = 127.0.0.1 #if port المحلي = 3306 password = * yourpassword * database = * yourdb * [application_config] driver = 'SQL Server'

الخطوة 4: ترميز خلية التحميل

استيراد RPi. GPIO كـ GPIOimport استيراد خيوط وقت الاستيراد من hx711 استيراد HX711 من مساعدين.stepper

بعد استيراد جميع مكتباتنا (لاحظ أننا نستخدم مكتبة HX711 لتشغيل خلية التحميل) يمكننا البدء في كتابة الكود الفعلي الخاص بنا

TARRA_CONSTANT = 80600

GRAM_CONSTANT = 101

لمعرفة الثوابت ، اضبط أولاً TARRA_CONSTANT = 0 و GRAM_CONSTANT = 1.

بعد ذلك ، نحتاج إلى معرفة القيمة التي تقرأها خلية الحمل عندما لا يكون هناك أي وزن يتم وزنه. ستكون هذه القيمة TARRA_CONSTANT.

بالنسبة إلى GRAM_CONSTANT ، ما عليك سوى أن تأخذ شيئًا تعرف وزنه (لقد استخدمت عبوة من السباغيتي) ، ووزنها وقسم قراءات خلية التحميل بالوزن الفعلي للكائن. بالنسبة لي كان هذا 101.

فئة LoadCell (مؤشر ترابط الترابط):

def _init _ (self، socket، lcd): threading. Thread._ init _ (self) self.hx711 = HX711 (dout_pin = 5، pd_sck_pin = 6، channel = 'A'، كسب = 64) self.socket = socket self.lcd = شاشات الكريستال السائل

هنا نقوم بتهيئة فئة LoadCell وتعيين المسامير.

المدى def (النفس):

جرب: while True: self.hx711.reset () # قبل أن نبدأ ، أعد ضبط HX711 (غير ملزم) Meas_avg = sum (self.hx711.get_raw_data ()) / 5 weight = round ((sources_avg - TARRA_CONSTANT) / GRAM_CONSTANT ، 0) print ("weight: {0}". format (weight)) DataRepository.insert_weight (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)}) print ("zou moeten emitten") writeWeight = "weight:" + str (db_weight) msg = "PETFEED" LCDWrite.message () إذا كان int (db_weight [: - 2]) <= 100: StepperFood.run () time.sleep (20) باستثناء استثناء كـ e: print ("خطأ في الوزن" + str (e))

الخطوة الخامسة: ترميز مستشعر المياه

استيراد خيوط استيراد الوقت من المستودعات. self ، socket): threading. Thread._ init _ self.socket = socket self.vorige_status = 0 def run (self): try: while True: water = self.is_water () print (water) status = water [" status "] 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": value، "الوقت": DataRepository.serializeDateTime (actionTime)، "action": action}) time.sleep (5) باستثناء Exception as ex: print (ex) print ('error bij waterensor') def is_water (self): status = GPIO.input (GPIO_Wate r) if self.vorige_status == 0 والحالة == 1: print ('water gedetecteerd') sensorData = {"status": status، "action": "water gedetecteerd"} self.vorige_status = status status = GPIO.input (GPIO_Water) إذا self.vorige_status == 1 والحالة == 1: مستشعر طباعة ('water aanwezig') sensorData = {"status": status، "action": "water aanwezig"} status = GPIO.input (GPIO_Water) إذا self.vorige_status == 1 والحالة == 0: مستشعر طباعة ('weg') data = {"status": status، "action": "water weg"} self.vorige_status = status status = GPIO.input (GPIO_Water) if self.vorige_status == 0 والحالة == 0: print ('startpositie') status = GPIO.input (GPIO_Water) sensorData = {"status": status، "action": "startpositie"} إرجاع مستشعر البيانات

الخطوة 6: تشفير مستشعر القرب

استيراد خيوط استيراد الوقت من المستودعات.. IN) def current_milli_time (): return int (round (time.time () * 1000)) class UltrasonicSensor (threading. Thread): def _init _ (self ، socket): threading. Thread._ init _ self.socket = تشغيل socket def (ذاتي): جرب: last_reading = 0 فاصل زمني = 5000 بينما صحيح: if current_milli_time ()> last_reading + الفاصل الزمني: dist = self.distance () print ("Measured 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": بروكسي، "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 () # save StartTime while GPIO.input (GPIO_Echo) == 0: StartTime = time.time () # حفظ وقت الوصول بينما GPIO.input (GPIO_Echo) == 1: StopTime = time.time () # فرق التوقيت بين وقت البدء والوصول. TimeElapsed = StopTime - StartTime # اضرب بالسرعة الصوتية (34300 سم / ثانية) # وقسمه على 2 ، لأن هناك والمسافة الخلفية = (TimeElapsed * 34300) / 2 مسافة العودة

الخطوة 7: ترميز Stepper Motors

استيراد RPi. GPIO كـ GPIO استيراد وقت استيراد مؤشر الترابط GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) control_pins = [12 ، 16 ، 20 ، 21] لـ pin in control_pins: GPIO.setup (pin، GPIO. OUT) GPIO.output (pin، 0) halfstep_seq =

هذا الرمز قابل لإعادة الاستخدام للمحرك السائر الآخر ، ما عليك سوى تعيين أرقام دبوس التحكم على دبابيس repective وإعادة تسمية الفئة إلى StepperWater:

الخطوة 8: تشفير شاشة LCD

الكثير من التعليمات البرمجية ، لكننا على وشك الانتهاء.

يتم تضمين فئة LCD كملف LCD.py

من helpers. LCD استيراد شاشات الكريستال السائل

E = 26 RS = 25 D0 = 19 D1 = 13 D2 = 24 D3 = 22 D4 = 23 D5 = 8 D6 = 7 D7 = 10 LCD = LCD (E ، RS ، [D0 ، D1 ، D2 ، D3 ، D4 ، D5 ، D6، D7]) class LCDWrite: def message (msg): حاول: print ("try") lcd.init_LCD () lcd.send_instruction (12) lcd.clear_display () lcd.write_message (msg، '1') باستثناء: print ("error LCDWrite")

الخطوة 9: النهاية

النهاية
النهاية
النهاية
النهاية

النتيجة النهائية: كيف رسمناها مقابل كيف انتهى الأمر.

موصى به: