Բովանդակություն:

Կենդանիների սննդի ավտոմատ դիսպենսեր `9 քայլ
Կենդանիների սննդի ավտոմատ դիսպենսեր `9 քայլ

Video: Կենդանիների սննդի ավտոմատ դիսպենսեր `9 քայլ

Video: Կենդանիների սննդի ավտոմատ դիսպենսեր `9 քայլ
Video: Կերակրման համար լորի սեփական ձեռքերով / նկարներ / չափսեր: 2024, Դեկտեմբեր
Anonim
Կենդանիների սննդի ավտոմատ դիսպենսեր
Կենդանիների սննդի ավտոմատ դիսպենսեր

Երբևէ զգացե՞լ եք, որ չափազանց շատ ժամանակ եք վատնում ձեր ընտանի կենդանուն կերակրելու համար: Երբևէ ստիպված եղե՞լ եք զանգահարել որևէ մեկին, որպեսզի ձեր ընտանի կենդանիներին կերակրի արձակուրդի ժամանակ: Ես փորձել եմ շտկել այս երկու խնդիրներն էլ իմ ընթացիկ դպրոցական նախագծով ՝ Petfeed!

Պարագաներ

Ազնվամորի Պի 3 բ

Բեռնախցիկ (10 կգ)

HX711 Բեռնախցիկի ուժեղացուցիչ

Waterlevel ցուցիչ (https://www.dfrobot.com/product-1493.html)

Ուլտրաձայնային հարևանության ցուցիչ

LCD 16-կապում

2x stepper շարժիչ 28byj-48

2x stepper motor վարորդ ULN2003

Քայլ 1: Լարերի տեղադրում

Հաղորդալարեր
Հաղորդալարեր
Հաղորդալարեր
Հաղորդալարեր

շատ մալուխներ այստեղ: Դուրս եկեք ձեր թռիչքային մալուխները և սկսեք ամրացնել:

Քայլ 2: Օգտագործեք ձեր բեռնախցիկը

Օգտագործեք ձեր բեռնախցիկը
Օգտագործեք ձեր բեռնախցիկը

բեռնախցիկն օգտագործելու համար նախ պետք է այն ամրացնել երկու ափսեի `ներքևի ափսեի և ափսեի վրա, որի վրա մենք կշռենք մեր սնունդը:

Պտուտակները, որոնք ձեզ անհրաժեշտ են, զույգ M4 պտուտակներ են `համապատասխան պտուտակներով և M5 պտուտակներ` համապատասխան պտուտակներով: Փոսերը պատրաստելու համար ես օգտագործեցի մի փոքր փորվածք:

(նկար ՝

Քայլ 3: Նորմալացված տվյալների շտեմարան

Նորմալացված տվյալների շտեմարան
Նորմալացված տվյալների շտեմարան

մեր տվիչների տվյալները պետք է պահվեն տվյալների բազայում: Պիտոնի ֆայլերին տվյալների բազային միանալու համար տե՛ս ստորև:

ապա ձեզ նույնպես պետք է կազմաձևման ֆայլ.

[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- ի տեսքով որպես GPIOimport ներմուծման ժամանակը hx711- ից ներմուծել HX711 օգնականներից: 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 _ (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 = LCD

այստեղ մենք նախաստորագրում ենք LoadCell դասը և քարտեզագրում կապում:

def run (self):

try: while True: self.hx711.reset () # Նախքան սկսելը, զրոյացրեք HX711 (պարտադիր չէ) masë_avg = գումար (self.hx711.get_raw_data ()) / 5 քաշ = կլոր ((masë_avg - TARRA_CONSTANT) / GRAM_CONSTANT, 0) տպել («քաշը ՝ {0}». Ձևաչափ (քաշ)) 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 emitten") writeWeight = "քաշ:" + str (db_weight) msg = "PETFEED" LCDWrite.message () if int (db_weight [:-2]) <= 100: StepperFood.run () time.sleep (20) բացառությամբ բացառությամբ որպես e: print («Կշռման սխալ» + փող (ե))

Քայլ 5: Sրի տվիչի կոդավորում

ներմուծման ժամանակ ներմուծում թելեր պահեստներից: DataRepository ներմուծում DataRepository RPi- ից ներմուծում GPIOGPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) GPIO_Water = 18 GPIO.setup (GPIO_Water, GPIO. IN) դաս WaterSensor (թելադրում. 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 [" կարգավիճակ "] գործողություն = ջուր [" գործողություն "] DataRepository.insert_water (փող (կարգավիճակ), գործողություն) data_water = DataRepository.get_data_sensor (2) historyId = data_water [" SensorsHistory "] value = data_water [" 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) բացառությամբ բացառության, օրինակ ՝ տպել (նախկին) տպել («սխալ ընտրություն ջրային սենսոր») def is_water (self): կարգավիճակ = GPIO. մուտքագրում (GPIO_Wate ժ) եթե self.vorige_status == 0 և կարգավիճակ == 1: տպել ('ջրի gedetecteerd') sensorData = {"կարգավիճակ". կարգավիճակ, "գործողություն". "ջուր 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) if self.vorige_status == 1 և կարգավիճակ == 0: տպել ('ջուր weg') սենսորՏվյալ = {"կարգավիճակ". կարգավիճակ, "գործողություն". "ջուր weg"} self.vorige_status = կարգավիճակի կարգավիճակ = GPIO.input (GPIO_Water) եթե self.vorige_status == 0 և կարգավիճակ == 0: տպել ('startpositie') կարգավիճակ = 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) GPIO. GPU. 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, «Մոտեցում» ՝ prox, «"ամանակ» ՝ DataRepository.serializeDateTime (actionTime)}) last_reading = current_milli_time () բացառությամբ բացառության, օրինակ ՝ print (ex) de f հեռավորություն (ինքնակառավարում). time.time () # save StartTime while GPIO.input (GPIO_Echo) == 0: StartTime = time.time () # խնայել ժամանման ժամանակը, մինչ GPIO.input (GPIO_Echo) == 1: StopTime = time.time () # մեկնարկի և ժամանման միջև եղած տարբերությունը TimeElapsed = StopTime - StartTime # բազմապատկեք ձայնային արագությամբ (34300 սմ / վ) # և բաժանեք 2 -ով, քանի որ այնտեղ և հետևի հեռավորությունը = (TimeElapsed * 34300) / 2 վերադարձի հեռավորություն

Քայլ 7: Stepper Motors- ի կոդավորում

ներմուծել RPi. GPIO- ն որպես GPIOimport ժամանակ ներմուծել թելը GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) control_pins = [12, 16, 20, 21] pin_ in control_pins: GPIO.setup (pin, GPIO. OUT) GPIO. ելք (քորոց, 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 = LCD (E, RS, [D0, D1, D2, D3, D4, D5, D6, D7]) LCD դասարանԳրել: def հաղորդագրություն (msg): try: print ("try") lcd.init_LCD () lcd.send_instruction (12) lcd.clear_display () lcd.write_message (msg, '1') բացառությամբ: տպել ("սխալ LCDWrite")

Քայլ 9: Վերջ

Վերջ
Վերջ
Վերջ
Վերջ

վերջնական արդյունքը. ինչպես կազմեցինք այն, թե ինչպես ավարտվեց:

Խորհուրդ ենք տալիս: