Sadržaj:
- Supplies
- Korak 1: Ožičenje
- Korak 2: Učinite svoju ćeliju učitavanja upotrebljivom
- Korak 3: Normalizirana baza podataka
- Korak 4: Kodiranje ćelije učitavanja
- Korak 5: Kodiranje senzora vode
- Korak 6: Kodiranje senzora blizine
- Korak 7: Kodiranje koračnih motora
- Korak 8: Kodiranje LCD -a
- Korak 9: Kraj
Video: AUTOMATSKI DOSAČ ZA Hranu za kućne ljubimce: 9 koraka
2024 Autor: John Day | [email protected]. Zadnja izmjena: 2024-01-30 08:04
Jeste li se ikada osjećali kao da gubite previše vremena hraneći svog ljubimca? Jeste li ikada morali pozvati nekoga da nahrani vaše ljubimce dok ste bili na odmoru? Pokušao sam riješiti oba ova problema sa svojim trenutnim školskim projektom: Petfeed!
Supplies
Raspberry Pi 3b
Šipka merna ćelija (10 kg)
HX711 Pojačalo sa učitavanjem ćelija
Senzor vodostaja (https://www.dfrobot.com/product-1493.html)
Ultrazvučni senzor blizine
LCD 16-pinski
2x koračni motor 28byj-48
2x vozač koračnog motora ULN2003
Korak 1: Ožičenje
puno kablovskih veza ovdje. Izvadite kratkospojne kablove i počnite zakačivati!
Korak 2: Učinite svoju ćeliju učitavanja upotrebljivom
da bismo koristili mjernu ćeliju, prvo je moramo pričvrstiti na dvije ploče: donju ploču i ploču na kojoj ćemo vagati hranu.
Vijci koji su vam potrebni su par vijaka M4 s odgovarajućim vijcima i par vijaka M5 s odgovarajućim vijcima. Koristio sam malu bušilicu da napravim rupe.
(slika:
Korak 3: Normalizirana baza podataka
podaci sa naših senzora moraju biti sačuvani u bazi podataka. Za povezivanje python datoteka s bazom podataka: pogledajte dolje.
tada vam je potrebna i konfiguracijska datoteka:
[connection_python] user = * vaše korisničko ime * host = 127.0.0.1 #ako je lokalni port = 3306 lozinka = * vaša lozinka * baza podataka = * yourdb * [application_config] driver = 'SQL Server'
Korak 4: Kodiranje ćelije učitavanja
uvoz RPi. GPIO kao GPIOimport threading vrijeme uvoza iz hx711 uvoz HX711 iz helpers.stepperFood uvoz StepperFood iz helpers. LCDWrite uvoz LCDWrite iz spremišta. DataRepository uvoz DataRepository
Nakon uvoza svih naših biblioteka (imajte na umu da koristimo biblioteku HX711 za pogon ćelije opterećenja) možemo započeti pisanje našeg stvarnog koda
TARRA_CONSTANT = 80600
GRAM_CONSTANT = 101
Da biste saznali naše konstante, prvo postavite TARRA_CONSTANT = 0 i GRAM_CONSTANT = 1.
Zatim moramo saznati vrijednost koju očitava mjerna ćelija kada nema vaganja. Ova vrijednost će biti TARRA_CONSTANT.
Što se tiče GRAM_CONSTANT, jednostavno uzmite predmet za koji znate težinu (koristio sam paket špageta), izvažite ga i podijelite očitanje mjerne ćelije sa stvarnom težinom objekta. Za mene je ovo bilo 101.
klasa 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
ovdje inicijaliziramo klasu LoadCell i mapiramo pinove.
def run (self):
try: while True: self.hx711.reset () # Prije nego što počnemo, resetirajte HX711 (ne obavezuje se) 0) print ("težina: {0}". Format (težina)) 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 = "weight:" + str (db_weight) msg = "PETFEED" LCDWrite.message () ako je int (db_weight [:-2]) <= 100: StepperFood.run () time.sleep (20) osim iznimke kao e: print ("Greška pri vaganju" + str (e))
Korak 5: Kodiranje senzora vode
uvoziti timeimport threading iz spremišta. DataRepository uvoz DataRepository iz RPi uvoz GPIOGPIO.setmode (GPIO. BCM) GPIO.setwarnings (Netačno) GPIO_Water = 18 GPIO.setup (GPIO_Water, GPIO. IN) klasa WaterSensor (threading. Thread): def _in 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 [" status "] akcija = voda [" akcija "] DataRepository.insert_water (str (status), akcija) data_water = DataRepository.get_data_sensor (2) historyId = data_water [" SensorsHistory "] vrijednost = data_water [" vrijednost "] ako je vrijednost == "0": value = "te weinig water" else: value = "genoeg water" actionTime = data_water ["actionTime"] self.socket.emit ('data_water', {"id": historyId, "value": vrijednost, "Vrijeme": DataRepository.serializeDateTime (actionTime), "action": action}) time.sleep (5) osim iznimke kao ex: print (ex) print ('error bij watersensor') def is_water (self): status = GPIO.input (GPIO_Wate r) ako self.vorige_status == 0 i status == 1: print ('water gedetecteerd') sensorData = {"status": status, "action": "water gedetecteerd"} self.vorige_status = status status = GPIO.input (GPIO_Water) if self.vorige_status == 1 i status == 1: print ('water aanwezig') sensorData = {"status": status, "action": "water aanwezig"} status = GPIO.input (GPIO_Water) if self.vorige_status == 1 i status == 0: print ('weg weg') sensorData = {"status": status, "action": "weg weg"} self.vorige_status = status status = GPIO.input (GPIO_Water) if self.vorige_status == 0 i status == 0: print ('startpositie') status = GPIO.input (GPIO_Water) sensorData = {"status": status, "action": "startpositie"} return sensorData
Korak 6: Kodiranje senzora blizine
uvoziti timeimport threading iz spremišta. DataRepository uvoz DataRepository iz RPi uvoz GPIO GPIO.režim rada (GPIO. BCM) GPIO.setwarnings (Netačno) GPIO_Trig = 4 GPIO_Echo = 17 GPIO.setup (GPIO_Trig, GPIO. OUT) GPIO.setup (GPIO_, GPIO_ IN socket def run (self): try: last_reading = 0 interval = 5000 while True: ako current_milli_time ()> last_reading + interval: dist = self.distance () print ("Izmjerena udaljenost = %.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 () osim iznimke kao ex: print (ex) de f distance (self): # set Trigger to HIGH GPIO.output (GPIO_Trig, True) # set Trigger after 0.01ms to LOW time.sleep (0.00001) GPIO.output (GPIO_Trig, False) StartTime = time.time () StopTime = time.time () # spremi StartTime dok je GPIO.input (GPIO_Echo) == 0: StartTime = time.time () # spremi vrijeme dolaska dok GPIO.input (GPIO_Echo) == 1: StopTime = time.time () # vremenska razlika između početka i dolaska TimeElapsed = StopTime - StartTime # pomnožite sa zvučnom brzinom (34300 cm / s) # i podijelite s 2, jer je udaljenost tamo i nazad = (TimeElapsed * 34300) / 2 povratna udaljenost
Korak 7: Kodiranje koračnih motora
uvoz RPi. GPIO kao GPIOuvoz vreme uvoženja niti GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) control_pins = [12, 16, 20, 21] za pin u control_pins: GPIO.setup (pin, GPIO. OUT) GPIO.output (pin, 0) halfstep_seq =
Ovaj kôd se može koristiti za drugi koračni motor, samo postavite brojeve kontrolnih pinova na njihove repetitivne pinove i preimenujte klasu u StepperWater:
Korak 8: Kodiranje LCD -a
Mnogo koda, ali skoro smo gotovi.
LCD klasa je uključena kao datoteka LCD.py
od helpers. LCD uvoz 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]) klasa LCDWrite: def poruka (msg): try: print ("try") lcd.init_LCD () lcd.send_instruction (12) lcd.clear_display () lcd.write_message (msg, '1') osim: print ("greška LCDWrite")
Korak 9: Kraj
konačni rezultat: kako smo ga sastavili u odnosu na to kako je završio.
Preporučuje se:
Projekt automatizirane zdjele za hranu za kućne ljubimce: 13 koraka
Projekt automatizirane zdjele za hranu za kućne ljubimce: Ova instrukcija će prikazati i objasniti kako izgraditi automatiziranu, programabilnu hranilicu za kućne ljubimce s pričvršćenim zdjelama za hranu. Ovdje sam priložio video koji prikazuje kako proizvodi funkcioniraju i kako izgledaju
Napravi najjednostavniji automatski hranilica za kućne ljubimce s Arduinom: 3 koraka
Napravi najjednostavniji automatski hranilica za kućne ljubimce s Arduinom: Pozdrav ljubiteljima ljubimaca! Duboko u sebi svi mi želimo imati slatko malo štene ili mače ili vjerovatno čak i riblju porodicu u svom domu. No, zbog našeg užurbanog života, često sumnjamo u sebe: 'Hoću li se moći brinuti o svom ljubimcu?' Primarna odgovornost
AUTOMATSKI DOSAČ PILATA: 14 koraka (sa slikama)
AUTOMATSKI ISPORAZIVAČ PILATA: Ovo je robot za doziranje pilula koji može pacijentu pružiti odgovarajuću količinu i vrstu tableta. Doziranje tablete se vrši automatski u tačno doba dana, prethodi alarm. Kada se isprazni, mašina se lako dopunjava
IDC2018IOT Povezani sistem za hranu, vodu i monitor za kućne ljubimce: 7 koraka
IDC2018IOT Povezani sistem za hranu, vodu i monitor za kućne ljubimce: Uvod Bilo da ste student pod pritiskom, vrijedna osoba ili jednostavno odsutan od kuće više od nekoliko sati dnevno. Kao brižni vlasnici kućnih ljubimaca, želimo osigurati da naši voljeni ostanu zdravi, nahranjeni i naravno NE leže na t
Automatski katapult za bacanje hrane za kućne ljubimce (pas, mačka, piletina itd), bacanje loptica i još mnogo toga!: 4 koraka (sa slikama)
Automatski katapult za bacanje hrane za kućne ljubimce (pas, mačka, piletina, itd.), Bacanje loptica i još mnogo toga!: Zdravo i dobrodošli u moju prvu instrukciju! Naš pas VOLI svoju hranu, doslovno će je pojesti u roku od nekoliko sekundi. Smišljao sam načine da to usporim, od loptica s hranom unutra do bacanja po cijelom dvorištu. Nevjerovatno, ona je