Агуулгын хүснэгт:

Гэрийн тэжээвэр амьтдын хоолны автомат хуваарилалт: 9 алхам
Гэрийн тэжээвэр амьтдын хоолны автомат хуваарилалт: 9 алхам

Видео: Гэрийн тэжээвэр амьтдын хоолны автомат хуваарилалт: 9 алхам

Видео: Гэрийн тэжээвэр амьтдын хоолны автомат хуваарилалт: 9 алхам
Видео: Food as Medicine: Preventing and Treating the Most Common Diseases with Diet 2024, Арваннэгдүгээр
Anonim
Гэрийн тэжээвэр амьтдын хоолны автомат хуваарилагч
Гэрийн тэжээвэр амьтдын хоолны автомат хуваарилагч

Гэрийн тэжээвэр амьтнаа тэжээхэд хэт их цаг алдах мэт санагдаж байсан уу? Амралтаараа явж байхдаа гэрийн тэжээвэр амьтдаа тэжээхээр хэн нэгэн рүү залгах шаардлагатай байсан уу? Би эдгээр асуудлыг хоёуланг нь одоо хэрэгжүүлж буй сургуулийнхаа төслийн тусламжтайгаар шийдвэрлэхийг хичээсэн: Petfeed!

Хангамж

Raspberry Pi 3b

Баарны ачаалах үүр (10кг)

HX711 Ачаалах үүр өсгөгч

Усны түвшний мэдрэгч (https://www.dfrobot.com/product-1493.html)

Хэт авианы ойролцоо мэдрэгч

LCD 16 зүү

2х stepby мотор 28byj-48

2x stepper мотор жолооч ULN2003

Алхам 1: Цахилгааны утас

Цахилгаан утас
Цахилгаан утас
Цахилгаан утас
Цахилгаан утас

маш олон кабель энд байна. Холбогч кабелийг гаргаж, бэхлээд эхлээрэй!

Алхам 2: Ачаалах үүрээ ашиглах боломжтой болго

Ачааллын үүрээ ашиглах боломжтой болго
Ачааллын үүрээ ашиглах боломжтой болго

Ачааллын үүрийг ашиглахын тулд бид эхлээд хоёр хавтан дээр бэхлэх хэрэгтэй: доод хавтан, хоолоо жигнэх таваг.

Танд хэрэгтэй эрэг бол тохирох боолттой хос М4 эрэг, тохирох боолттой М5 боолт юм. Би нүх гаргахдаа жижиг өрөм ашигласан.

(зураг:

Алхам 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 -ийг импортлох.

Манай бүх номын санг импортлосны дараа (ачаалах үүрийг жолоодохын тулд бид HX711 номын санг ашиглаж байна), бид жинхэнэ кодоо бичиж эхлэх боломжтой.

TARRA_CONSTANT = 80600

GRAM_CONSTANT = 101

Бидний тогтмолуудыг олж мэдэхийн тулд эхлээд TARRA_CONSTANT = 0 ба GRAM_CONSTANT = 1 -ийг тохируулна уу.

Дараа нь юу ч жинлээгүй байхад бидний ачааны үүр ямар утгатай болохыг олж мэдэх хэрэгтэй. Энэ утга TARRA_CONSTANT байх болно.

GRAM_CONSTANT -ийн хувьд жингээ мэддэг объектоо аваад (би спагетти хэрэглэдэг байсан) жинлээд, ачааны эсийн уншилтыг тухайн объектын бодит жинд хуваа. Миний хувьд энэ нь 101 байсан.

LoadCell анги (threading. Thread):

def _init _ (өөрөө, сокет, lcd): урсгал = lcd

энд бид LoadCell ангийг эхлүүлж, тээглүүрүүдийг зурна.

def run (өөрөө):

үзээрэй: while True: self.hx711.reset () # Эхлэхээсээ өмнө HX711 (заавал биш) хэмжүүрүүдийг_авг = нийлбэр (өөрөө.hx711.get_raw_data ()) / 5 жин = дугуй ((хэмжүүрүүд_avg - TARRA_CONSTANT) / GRAM_CONSTANT, 0) хэвлэх ("жин: {0}". Формат (жин)) 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) in exceptions from e: print ("Жинлэхэд гарсан алдаа" + str (e))

Алхам 5: Усны мэдрэгчийг кодлох

репозиторуудаас цаг импортлох урсгал импортлох. DataRepository нь RPi -аас DataRepository оруулах self, socket): threading. Thread._ init _ (self) self.socket = socket self.vorige_status = 0 def run (self): try: while True: water = self.is_water () хэвлэх (ус) төлөв = ус [" status "] action = water [" action "] DataRepository.insert_water (str (status), action) data_water = DataRepository.get_data_sensor (2) historyId = data_water [" SensorsHistory "] утга = 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) ex Exception -ээс бусад тохиолдолд: print (ex) print ('error bij watersensor') def is_water (өөрөө): төлөв = GPIO. оруулах (GPIO_Wate r) хэрэв self.vorige_status == 0 ба status == 1: print ('water gedetecteerd') sensorData = {"status": status, "action": "water gedetecteerd"} self.vorige_status = status status = GPIO.input (GPIO_Water) if self.vorige_status == 1 and status == 1: print ('water aanwezig') sensorData = {"status": status, "action": "water aanwezig"} status = GPIO.input (GPIO_Water) if self.vorige_status == 1 ба status == 0: print ('water weg') sensorData = {"status": status, "action": "water weg"} self.vorige_status = status status = GPIO.input (GPIO_Water) if self.vorige_status == 0 and status == 0: print ('startpositie') status = GPIO.input (GPIO_Water) sensorData = {"status": status, "action": "startpositie"} sensorData буцах

Алхам 6: Ойролцоох мэдрэгчийг кодлох

өгөгдлийн сангаас RPi -аас импортлох GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (худал) GPIO_Trig = 4 GPIO_Echo = 17 GPIO.setup (GPIO_Trig, GPIO. OUT) GPIO.setup, GPIO_Ech. IN) def current_milli_time (): return int (round (time.time () * 1000)) class UltrasonicSensor (threading. Thread): def _init _ (өөрөө, залгуур): threading. Thread._ init _ (өөрөө) өөрөө.сокет = socket def run (self): try: last_reading = 0 interval = 5000 while True: if current_milli_time ()> last_reading + interval: dist = self.distance () print ("Хэмжсэн зай = %.1f см" % дист) 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, "Ойролцоо байдал": прокс, "Цаг": DataRepository.serializeDateTime (actionTime)}) last_reading = current_milli_time () ex: ex (хэвлэх) (ex) f зай (өөрөө): # Trigger -ийг HIGH GPIO.output (GPIO_Trig, True) болгож тохируулах time.time () # StartTime -ийг GPIO.input (GPIO_Echo) байхад хадгалах == 0: StartTime = time.time () # GPIO.input (GPIO_Echo) == 1: StopTime = time.time () # эхлэх ба ирэх хоёрын хоорондох хугацааны ялгаа

Алхам 7: Stepper Motors -ийг кодлох

GPIO импортлох урсгал GPIO.setmode (GPIO. BCM) GPIO.setwarnings (Худал) control_pins = [12, 16, 20, 21] in pin_ in pin_pin: GPIO.setup (pin, GPIO. OUT) GPIO.output (pin, 0) halfstep_seq =

Энэ кодыг бусад stepper моторт дахин ашиглах боломжтой, зүгээр л хяналтын зүүний дугаарыг засах зүү рүү нь тохируулаад классаа StepperWater болгон өөрчилнө үү.

Алхам 8: LCD дэлгэцийг кодлох

Маш олон код, гэхдээ бид бараг дууссан.

LCD ангиллыг LCD.py файл болгон оруулсан болно

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]) анги LCDWrite: def message (msg): try: print ("try") lcd.init_LCD () lcd.send_instruction (12) lcd.clear_display () lcd.write_message (msg, '1'): хэвлэх ("LCDWrite алдаа")

Алхам 9: Төгсгөл

Төгсөв
Төгсөв
Төгсөв
Төгсөв

Эцсийн үр дүн: бид үүнийг хэрхэн зурсан, хэрхэн дууссан.

Зөвлөмж болгож буй: