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
2024 May -akda: John Day | [email protected]. Huling binago: 2024-01-30 13:10
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.
Inirerekumendang:
Automated na Pet-Food Bowl Project: 13 Mga Hakbang
Awtomatiko na Pet-Food Bowl Project: Ang itinuturo na ito ay ilalarawan at ipaliwanag kung paano bumuo ng isang awtomatiko, nai-program na tagapagpakain ng alagang hayop na may kalakip na mga mangkok ng pagkain. Nag-attach ako ng video dito na naglalarawan kung paano gumagana ang mga produkto at kung ano ang hitsura nito
Arduino Project: Cat Food Dispenser: 6 Mga Hakbang
Arduino Project: Cat Food Dispenser: Ang itinuturo na ito ay nilikha bilang pagtupad sa kinakailangan ng proyekto ng Makecourse sa University of South Florida (www.makecourse.com)
AUTOMATIC PILL DISPENSER: 14 Mga Hakbang (na may Mga Larawan)
AUTOMATIC PILL DISPENSER: Ito ay isang pill dispenser robot na makapagbibigay sa pasyente ng wastong dami at uri ng mga tabletas sa gamot. Ang dosis ng tableta ay awtomatikong ginaganap sa tamang oras ng araw, na nauna sa pamamagitan ng isang alarma. Kapag walang laman, ang machine ay madaling refil
10 Mga kahalili sa DIY sa Mga Off-The-Shelf na Elektroniko na Mga Bahagi: 11 Mga Hakbang (na may Mga Larawan)
10 Mga Kahalili sa DIY sa Mga Off-The-Shelf na Mga Elektroniko na Bahagi: Maligayang pagdating sa aking kauna-unahang itinuro! Sa palagay mo ba ang ilang mga bahagi mula sa mga tagatingi sa online ay masyadong mahal o may mababang kalidad? Kailangan bang makakuha ng isang prototype nang mabilis at tumatakbo nang mabilis at hindi makapaghintay linggo para sa pagpapadala? Walang mga lokal na electronics distributor? Ang fol
IoT Food Feeder para sa Mga Hayop: 9 Mga Hakbang
IoT Food Feeder para sa Mga Hayop: Sa proyektong ito magtatayo kami ng isang IOT na likidong sistema ng dispenser ng pagkain para sa mga alagang hayop at iba pang mga hayop. Ang proyektong ito kung ipinatupad para sa kapakanan ng mga hayop na naliligaw (aso, pusa, ibon atbp) o pumipigil sa pagkawala ng biodiversity kung gayon makakatulong ito sa atin upang makamit ang smar