Talaan ng mga Nilalaman:
- Mga gamit
- Hakbang 1: Mga kable
- Hakbang 2: Gawing Magagamit ang Iyong Load Cell
- Hakbang 3: Normalisadong Database
- Hakbang 4: Pag-coding ng Load Cell
- Hakbang 5: Pag-coding ng Water Sensor
- Hakbang 6: Pag-coding ng Proximity Sensor
- Hakbang 7: Pag-coding ng Stepper Motors
- Hakbang 8: Pag-coding sa LCD
- Hakbang 9: Ang Wakas
Video: AUTOMATIC PET FOOD DISPENSER: 9 Mga Hakbang
2025 May -akda: John Day | [email protected]. Huling binago: 2025-01-13 06:58
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
maraming cabling dito. Lumabas ang iyong mga jumper cables at simulang mag-pin!
Hakbang 2: 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
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
pangwakas na resulta: kung paano namin iginuhit ito kumpara kung paano ito natapos.