Talaan ng mga Nilalaman:

AUTOMATIC PET FOOD DISPENSER: 9 Mga Hakbang
AUTOMATIC PET FOOD DISPENSER: 9 Mga Hakbang

Video: AUTOMATIC PET FOOD DISPENSER: 9 Mga Hakbang

Video: AUTOMATIC PET FOOD DISPENSER: 9 Mga Hakbang
Video: 【MULTI SUB】Anti-routine system EP1-80 2024, Hunyo
Anonim
AUTOMATIC PET FOOD DISPENSER
AUTOMATIC PET FOOD DISPENSER

Naranasan mo bang mag-aksaya ng labis na oras sa pagpapakain sa iyong alaga? Kailangang tumawag sa isang tao upang pakainin ang iyong mga alagang hayop habang nasa isang piyesta opisyal? Sinubukan kong ayusin ang parehong mga isyung ito sa aking kasalukuyang proyekto sa paaralan: Petfeed!

Mga gamit

Raspberry Pi 3b

Bar Load Cell (10kg)

HX711 Load Cell Amplifier

Waterlevel Sensor (https://www.dfrobot.com/product-1493.html)

Sensor ng Proximity ng Ultrason

LCD 16-pin

2x stepper motor 28byj-48

2x stepper motor driver ULN2003

Hakbang 1: Mga kable

Kable
Kable
Kable
Kable

maraming cabling dito. Lumabas ang iyong mga jumper cables at simulang mag-pin!

Hakbang 2: Gawing Magagamit ang Iyong Load Cell

Gawing Magagamit ang Iyong Load Cell
Gawing Magagamit ang Iyong Load Cell

upang magamit ang load cell, kailangan muna nating ilakip ito sa dalawang plato: isang ilalim na plato, at isang plato kung saan timbangin namin ang aming pagkain.

Ang mga tornilyo na kailangan mo ay isang pares ng M4 na turnilyo na may pagtutugma ng mga bolt at isang pares ng M5 na turnilyo na may mga tumutugma na bolt. Gumamit ako ng isang maliit na drill upang makagawa ng mga butas.

(larawan:

Hakbang 3: Normalisadong Database

Normalisadong Database
Normalisadong Database

ang data mula sa aming mga sensor ay dapat na nai-save sa isang database. Para sa mga file ng sawa upang kumonekta sa database: tingnan sa ibaba.

pagkatapos ay kailangan mo rin ng isang config file:

[konektor_python] gumagamit = * yourusername * host = 127.0.0.1 # kung lokal na port = 3306 password = * yourpassword * database = * yourdb * [application_config] driver = 'SQL Server'

Hakbang 4: Pag-coding ng Load Cell

i-import ang RPi. GPIO bilang GPIOimport ang pag-import ng oras sa pag-import mula sa hx711 import HX711 mula sa mga helpers.stepperFood import StepperFood mula sa mga helpers. LCDWrite import LCDWrite mula sa mga repository.

Matapos ang pag-import ng lahat ng aming mga aklatan (tala, ginagamit namin ang HX711 Library upang himukin ang cell ng pag-load) maaari naming simulang isulat ang aming aktwal na code

TARRA_CONSTANT = 80600

GRAM_CONSTANT = 101

Para malaman kung ano ang aming mga Constant, unang itakda ang TARRA_CONSTANT = 0 at GRAM_CONSTANT = 1.

Susunod na kailangan namin upang malaman ang halaga na binabasa ng aming cell ng paglo-load kapag wala itong timbangin. Ang halagang ito ay magiging TARRA_CONSTANT.

Tulad ng para sa GRAM_CONSTANT, kumuha lamang ng isang bagay na alam mo ang bigat ng (gumamit ako ng isang pakete ng spaghetti's), timbangin ito at hatiin ang pagbabasa ng cell ng load sa aktwal na bigat ng bagay. Para sa akin ito ay 101.

klase LoadCell (threading. Thread):

def _init _ (self, socket, lcd): threading. Thread._ init _ (self) self.hx711 = HX711 (dout_pin = 5, pd_sck_pin = 6, channel = 'A', makakuha = 64) self.socket = socket self.lcd = lcd

dito namin pinasimulan ang klase ng LoadCell at mapa ang mga pin.

def run (sarili):

subukan: habang Totoo: self.hx711.reset () # Bago kami magsimula, i-reset ang HX711 (hindi obligahin) 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 emited") writeWeight = "weight:" + str (db_weight) msg = "PETFEED" LCDWrite.message () if int (db_weight [: - 2]) <= 100: StepperFood.run () time.s Sleep (20) maliban sa Exception bilang e: print ("Error sa pagtimbang" + str (e))

Hakbang 5: Pag-coding ng Water Sensor

i-import ang timeimport threading mula sa mga repository. DataRepository import DataRepository mula sa RPi import GPIOGPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) GPIO_Water = 18 GPIO.setup (GPIO_Water, GPIO. IN) klase WaterSensor (threading. Thread): def _init _ (self, socket): threading. Thread._ init _ (self) self.socket = socket self.vorige_status = 0 def run (self): try: habang 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 "] halaga = data_water [" halaga "] kung halaga == "0": value = "te weinig water" else: value = "genoeg water" actionTime = data_water ["actionTime"] self.socket.emit ('data_water', {"id": historyId, "halaga": halaga, "Oras": DataRepository.serializeDateTime (actionTime), "action": action}) time. Sleep (5) maliban sa Exception bilang hal: print (ex) print ('error bij watersensor') def is_water (self): status = GPIO.input (GPIO_Wate r) kung self.vorige_status == 0 at status == 1: print ('water gedetecteerd') sensorData = {"status": status, "action": "water gedetecteerd"} self.vorige_status = status status = GPIO.input (GPIO_Water) kung self.vorige_status == 1 at katayuan == 1: print ('water aanwezig') sensorData = {"status": status, "action": "water aanwezig"} status = GPIO.input (GPIO_Water) kung self.vorige_status == 1 at katayuan == 0: print ('water weg') sensorData = {"status": status, "action": "water weg"} self.vorige_status = status status = GPIO.input (GPIO_Water) kung self.vorige_status == 0 at status == 0: print ('startpositie') status = GPIO.input (GPIO_Water) sensorData = {"status": status, "action": "startpositie"} return sensorData

Hakbang 6: Pag-coding ng Proximity Sensor

i-import ang timeimport threading mula sa mga repository. DataRepository import DataRepository mula sa RPi import GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) GPIO_Trig = 4 GPIO_Echo = 17 GPIO.setup (GPIO_Trig, GPIO. OUT) GPIO.setup (GPIO_Echo, GPIO. 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 habang True: kung current_milli_time ()> last_reading + interval: dist = self.distance () print ("sinusukat na Distansya =%.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 () maliban sa Exception bilang hal: print (ex) de f distansya (sarili): # set Trigger to HIGH GPIO.output (GPIO_Trig, True) # set Trigger after 0.01ms to LOW time.s Sleep (0.00001) GPIO.output (GPIO_Trig, False) StartTime = time.time () StopTime = time.time () # save StartTime habang GPIO.input (GPIO_Echo) == 0: StartTime = time.time () # save time ng pagdating habang GPIO.input (GPIO_Echo) == 1: StopTime = time.time () # pagkakaiba-iba ng oras sa pagitan ng pagsisimula at pagdating TimeElapsed = StopTime - StartTime # multiply gamit ang bilis ng sonik (34300 cm / s) # at hatiin ng 2, dahil doon at pabalik na distansya = (TimeElapsed * 34300) / 2 distansya ng pagbabalik

Hakbang 7: Pag-coding ng Stepper Motors

i-import ang RPi. GPIO bilang GPIOimport ang pag-import ng oras sa pag-thread ng GPIO.setmode (GPIO. BCM) GPIO.setwarnings (Mali) control_pins = [12, 16, 20, 21] para sa pin sa control_pins: GPIO.setup (pin, GPIO. OUT) GPIO.output (pin, 0) halfstep_seq =

Ang code na ito ay magagamit muli para sa iba pang stepper motor, itakda lamang ang mga numero ng control pin sa kanilang mga repective pin at palitan ang pangalan ng klase sa StepperWater:

Hakbang 8: Pag-coding sa LCD

Maraming code, ngunit halos tapos na tayo.

Ang LCD class ay kasama bilang file LCD.py

mula sa mga helpers. LCD import 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]) klase LCDWrite: def message (msg): try: print ("try") lcd.init_LCD () lcd.send_instruction (12) lcd.clear_display () lcd.write_message (msg, '1') maliban: print ("error LCDWrite")

Hakbang 9: Ang Wakas

Wakas
Wakas
Wakas
Wakas

pangwakas na resulta: kung paano namin iginuhit ito kumpara kung paano ito natapos.

Inirerekumendang: