فهرست مطالب:

توزیع کننده غذای خودکار حیوان خانگی: 9 مرحله
توزیع کننده غذای خودکار حیوان خانگی: 9 مرحله

تصویری: توزیع کننده غذای خودکار حیوان خانگی: 9 مرحله

تصویری: توزیع کننده غذای خودکار حیوان خانگی: 9 مرحله
تصویری: لزبازی لیلا اوتادی چه لبی میگیره (نبینی از دستت رفته) 2024, نوامبر
Anonim
توزیع کننده غذای خودکار حیوانات خانگی
توزیع کننده غذای خودکار حیوانات خانگی

آیا تا به حال احساس کرده اید که برای تغذیه حیوان خانگی خود وقت زیادی را هدر می دهید؟ آیا تا به حال مجبور بوده اید که در تعطیلات با شخصی تماس بگیرید تا به حیوانات خانگی شما غذا بدهد؟ من سعی کردم هر دو این مسائل را با پروژه مدرسه فعلی خود برطرف کنم: Petfeed!

تدارکات

تمشک پای 3b

بار بار (10 کیلوگرم)

HX711 تقویت کننده سلول بار

سنسور سطح آب (https://www.dfrobot.com/product-1493.html)

سنسور مجاورت فراصوت

LCD 16 پین

استپر موتور 2 برابر 28byj-48

2X راننده موتور پله ULN2003

مرحله 1: سیم کشی

سیم کشی
سیم کشی
سیم کشی
سیم کشی

کابل کشی زیاد در اینجا کابل های بلوز خود را بیرون آورده و سنجاق را شروع کنید!

مرحله 2: سلول بار خود را قابل استفاده کنید

سلول بار خود را قابل استفاده کنید
سلول بار خود را قابل استفاده کنید

برای استفاده از لودسل ، ابتدا باید آن را به دو بشقاب وصل کنیم: یک صفحه پایینی و یک بشقاب که غذای خود را روی آن وزن می کنیم.

پیچ های مورد نیاز شما یک جفت پیچ M4 با پیچ های تطبیق دهنده و یک جفت پیچ M5 با پیچ و مهره های تطبیق دهنده است. من از یک مته کوچک برای ایجاد سوراخ ها استفاده کردم.

(عکس:

مرحله 3: پایگاه داده عادی شده

پایگاه داده عادی شده
پایگاه داده عادی شده

اطلاعات سنسورهای ما باید در پایگاه داده ذخیره شود. برای اتصال فایل های پایتون به پایگاه داده: به زیر مراجعه کنید.

سپس به یک فایل پیکربندی نیز نیاز دارید:

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

مرحله 4: کدگذاری سلول بار

وارد کردن RPi. GPIO به عنوان GPIOimport زمان وارد کردن موضوع از hx711 وارد کردن HX711 از یاران. stepperFood وارد کردن StepperFood از کمکها. LCD نوشتن LCD وارد کردن از مخازن.

پس از وارد کردن همه کتابخانه های خود (توجه داشته باشید ، ما از کتابخانه HX711 برای هدایت لودسل استفاده می کنیم) می توانیم نوشتن کد واقعی خود را شروع کنیم.

TARRA_CONSTANT = 80600

GRAM_CONSTANT = 101

برای یافتن ثابت های ما ، ابتدا TARRA_CONSTANT = 0 و GRAM_CONSTANT = 1 را تنظیم کنید.

در مرحله بعد ما باید مقداری را که لودسل ما می خواند هنگامی که هیچ چیزی وزن نمی شود ، پیدا کنیم. این مقدار TARRA_CONSTANT خواهد بود.

در مورد GRAM_CONSTANT ، به سادگی یک شیء را که وزن آن را می دانید بردارید (من از یک بسته اسپاگتی استفاده کردم) ، آن را وزن کنید و بازخوانی لودسل را با وزن واقعی شی تقسیم کنید. برای من این 101 بود.

کلاس LoadCell (threading. Thread):

def _init _ (self، socket، lcd): threading. Thread._ init _ (self) self.hx711 = HX711 (dout_pin = 5، pd_sck_pin = 6، channel = 'A'، gain = 64) self.socket = socket self.lcd = ال سی دی

در اینجا ما کلاس LoadCell را راه اندازی می کنیم و پین ها را نقشه می کنیم.

def run (خود):

try: while True: self.hx711.reset () # قبل از شروع ، HX711 (اجباری نیست) را بازنشانی کنید masë_avg = sum (self.hx711.get_raw_data ()) / 5 وزن = دور ((اندازه ها_اوگ - 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 ('weight_weight'، {"id": historyId، "Weight": db_weight، "Time": DataRepository.serializeDateTime (actionTime)}) print ("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: کدگذاری سنسور آب

وارد کردن زمان وارد کردن موضوع از مخازن. DataRepository وارد کردن DataRepository از RPi وارد کردن GPIOGPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) GPIO_Water = 18 GPIO.setup (GPIO_Water، GPIO. IN) کلاس WaterSensor (thread_. Th) self، socket): threading. Thread._ init _ (self) 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) به جز استثنا به عنوان مثال: print (ex) print ('error bij watersensor') def is_water (self): status = GPIO. ورودی (GPIO_Wate r) if self.vorige_status == 0 و وضعیت == 1: print ('water gedetecteerd') sensorData = {"status": status، "action": "water gedetecteerd"} self.vorige_status = وضعیت وضعیت = GPIO.input (GPIO_Water) if self.vorige_status == 1 و وضعیت == 1: print ('water aanwezig') sensorData = {"status": status، "action": "water aanwezig"} status = GPIO.input (GPIO_Water) اگر self.vorige_status == 1 و وضعیت == 0: چاپ ('water weg') sensorData = {"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"} return sensorData

مرحله 6: کدگذاری سنسور مجاورت

وارد کردن زمان وارد کردن موضوع از مخازن. DataRepository وارد کردن DataRepository از RPi وارد کردن GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) GPIO_Trig = 4 GPIO_Echo = 17 GPIO.setup (GPIO_Trig، GPIO. OUEcho). IN) def current_milli_time (): return int (round (time.time () * 1000)) class UltrasonicSensor (threading. Thread): def _init _ (self، socket): threading. Thread._ init _ (self) self.socket = socket def run (self): try: last_reading = 0 interval = 5000 while True: if current_milli_time ()> last_reading + interval: 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": prox، "Time": DataRepository.serializeDateTime (actionTime)}) last_reading = current_milli_time () به جز استثنا به عنوان مثال: print (ex) de f distance (self): # set Trigger to HIGH GPIO.output (GPIO_Trig، True) # set Trigger after 0.01ms to 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 به عنوان GPIOimport زمان وارد کردن رشته 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 گنجانده شده است

از دستیارها. 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]) کلاس LCD نوشتن: پیام دف (msg): try: print ("try") lcd.init_LCD () lcd.send_instruction (12) lcd.clear_display () lcd.write_message (msg، '1') جز: print ("error LCDWrite")

مرحله 9: پایان

پایان
پایان
پایان
پایان

نتیجه نهایی: چگونه آن را ترسیم کردیم در مقابل چگونه به پایان رسید.

توصیه شده: