Բովանդակություն:
- Պարագաներ
- Քայլ 1: Լարերի տեղադրում
- Քայլ 2: Օգտագործեք ձեր բեռնախցիկը
- Քայլ 3: Նորմալացված տվյալների շտեմարան
- Քայլ 4: Բեռնախցիկի կոդավորում
- Քայլ 5: Sրի տվիչի կոդավորում
- Քայլ 6: Կոդավորման հարևանության ցուցիչ
- Քայլ 7: Stepper Motors- ի կոդավորում
- Քայլ 8: LCD- ի կոդավորում
- Քայլ 9: Վերջ
Video: Կենդանիների սննդի ավտոմատ դիսպենսեր `9 քայլ
2024 Հեղինակ: John Day | [email protected]. Վերջին փոփոխված: 2024-01-30 09:45
Երբևէ զգացե՞լ եք, որ չափազանց շատ ժամանակ եք վատնում ձեր ընտանի կենդանուն կերակրելու համար: Երբևէ ստիպված եղե՞լ եք զանգահարել որևէ մեկին, որպեսզի ձեր ընտանի կենդանիներին կերակրի արձակուրդի ժամանակ: Ես փորձել եմ շտկել այս երկու խնդիրներն էլ իմ ընթացիկ դպրոցական նախագծով ՝ 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: Վերջ
վերջնական արդյունքը. ինչպես կազմեցինք այն, թե ինչպես ավարտվեց:
Խորհուրդ ենք տալիս:
Կենդանիների սննդի ամանի ավտոմատ նախագիծ. 13 քայլ
Կենդանիների սննդի գավաթների ավտոմատ նախագիծ. Այս հրահանգը կներկայացնի և կբացատրի, թե ինչպես կարելի է կառուցել ավտոմատացված, ծրագրավորվող ընտանի կենդանիների սնուցող սարք `կցված սննդի ամաններով: Ես կցել եմ այստեղ տեսանյութ, որը պատկերում է, թե ինչպես են գործում ապրանքները և ինչ տեսք ունի
Կենդանիների սննդի դիսպենսեր `3 քայլ
Կենդանիների սննդի դիսպենսեր. Para los amantes de mascotas, este es un proyecto que les puede ser muy útil! Un alimentador automático que te permite observar cual es el pesaje de la comida, y solo es necesario que oprimas un botón.Un mecanismo sencillo que podrás armar desde tu
Կենդանիների ավտոմատ սնուցող ՝ օգտագործելով AtTiny85: 6 քայլ
Կենդանիների ավտոմատ սնուցող ՝ օգտագործելով AtTiny85
IDC2018IOT միացված ընտանի կենդանիների սննդի, ջրի և մոնիտորի համակարգ. 7 քայլ
IDC2018IOT Connected Pet սննդի, ջրի և մոնիտորի համակարգ. Ներածություն Անկախ նրանից, թե ուսանող եք ճնշման տակ, աշխատասեր անձնավորություն, կամ պարզապես տնից հեռու եք օրական ավելի քան մի քանի ժամով: Որպես խնամող ընտանի կենդանիների սեփականատերեր, մենք ցանկանում ենք համոզվել, որ մեր սիրելիները մնում են առողջ, սնված և, իհարկե, ՉՊԱՐՏՎՈՄ
IoT Treat դիսպենսեր ընտանի կենդանիների համար. 7 քայլ (նկարներով)
IoT Treat դիսպենսեր ընտանի կենդանիների համար. Ես ունեմ երկու կատու, և օրական մոտ 3 անգամ նրանց հյուրասիրելը պետք է բավականին տհաճություն պատճառի: Նրանք ինձ էին նայում իրենց սրամիտ դեմքերով և բուռն հայացքներով, այնուհետև վազում էին դեպի կատվի կանաչիով լի տուփը, հաչում և մուրում նրանց համար: Ես որոշել էի