Sadržaj:

AUTOMATSKI DOSAČ ZA Hranu za kućne ljubimce: 9 koraka
AUTOMATSKI DOSAČ ZA Hranu za kućne ljubimce: 9 koraka

Video: AUTOMATSKI DOSAČ ZA Hranu za kućne ljubimce: 9 koraka

Video: AUTOMATSKI DOSAČ ZA Hranu za kućne ljubimce: 9 koraka
Video: Moja omiljena veličina Pe***a 2024, Jun
Anonim
AUTOMATSKI DOSAVAČ ZA HRANU PET
AUTOMATSKI DOSAVAČ ZA HRANU PET

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

Ožičenje
Ožičenje
Ožičenje
Ožičenje

puno kablovskih veza ovdje. Izvadite kratkospojne kablove i počnite zakačivati!

Korak 2: Učinite svoju ćeliju učitavanja upotrebljivom

Učinite svoju ćeliju opterećenja upotrebljivom
Učinite svoju ćeliju opterećenja 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

Normalizovana baza podataka
Normalizovana 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

Kraj
Kraj
Kraj
Kraj

konačni rezultat: kako smo ga sastavili u odnosu na to kako je završio.

Preporučuje se: