Sadržaj:
- Pribor
- 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 DOSAVAČ HRANE ZA Hrana za kućne ljubimce: 9 koraka
2024 Autor: John Day | [email protected]. Zadnja promjena: 2024-01-30 09:32
Jeste li se ikada osjećali kao da ste gubili previše vremena hraneći svog ljubimca? Jeste li ikada morali nazvati nekoga da nahrani vaše ljubimce dok ste bili na odmoru? Pokušao sam riješiti oba ova problema svojim trenutnim školskim projektom: Petfeed!
Pribor
Malina Pi 3b
Šipka mjerna ćelija (10 kg)
HX711 Pojačalo s 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 kabliranja ovdje. Izvucite kratkospojne kabele i počnite pričvršć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. Za bušenje sam upotrijebio malu bušilicu.
(slika:
Korak 3: Normalizirana baza podataka
podaci s naših senzora moraju se spremiti u bazu podataka. Za povezivanje python datoteka s bazom podataka: 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 knjižnica (imajte na umu da koristimo knjižnicu HX711 za pogon ćelije opterećenja) možemo početi pisati naš stvarni kod
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 bit će TARRA_CONSTANT.
Što se tiče GRAM_CONSTANT, jednostavno uzmite predmet čija je težina poznata (upotrijebio sam paket špageta), izvažite ga i podijelite očitanje mjerne ćelije sa stvarnom težinom predmeta. Za mene je ovo bio 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 obvezuje se) 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 emitten") writeWeight = "weight:" + str (db_weight) msg = "PETFEED" LCDWrite.message () if int (db_weight [:-2]) <= 100: StepperFood.run () time.sleep (20) osim iznimke kao e: print ("Pogreška s vaganjem" + str (e))
Korak 5: Kodiranje senzora vode
import timeimport threading from repositories. DataRepository uvoz DataRepository iz RPi import GPIOGPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) 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.ulaz (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
uvoz timeimport threading iz spremišta. DataRepository uvoz DataRepository iz RPi uvoz GPIO GPIO.način rada (GPIO. BCM) GPIO.setwarnings (Netačno) GPIO_Trig = 4 GPIO_Echo = 17 GPIO.setup (GPIO_Trig, GPIO. OUT) GPIO.setup (GPIO_, GPIO_. IN) def current_milli_time (): return int (round (time.time () * 1000)) class UltrasonicSensor (threading. Thread): def _init _ (self, utičnica): threading. Thread._ init _ (self) self.socket = 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 udaljenost (samo): # postavite okidač na VISOK GPIO.izlaz (GPIO_Trig, True) # postavite okidač nakon 0,01 ms na LOW time.sleep (0,00001) GPIO.izlaz (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 tamo i natrag udaljenost = (TimeElapsed * 34300) / 2 povratna udaljenost
Korak 7: Kodiranje koračnih motora
uvoz RPi. GPIO kao GPIOuvoz vremena uvoz uvoja 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.izlaz (pin, 0) halfstep_seq =
Ovaj se kôd može ponovno upotrijebiti za drugi koračni motor, samo postavite brojeve upravljačkih pinova na njihove repetitivne pinove i preimenujte klasu u StepperWater:
Korak 8: Kodiranje LCD -a
Mnogo koda, ali skoro smo gotovi.
LCD klasa uključena je kao datoteka LCD.py
od pomagača. 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čeni:
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
Dozator hrane za kućne ljubimce: 3 koraka
Dozator hrane za kućne ljubimce: 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
Automatski dodavač hrane za kućne ljubimce: 5 koraka
Auto PetFeeder: Bok, ja se zovem Gilian, studiram na Howest Kortrijk u Belgiji i student sam MCT-a. Kao završni zadatak morao sam napraviti IOT-uređaj. Imam psa kod kuće koji se hrani 2 puta dnevno u određeno vrijeme i količina hrane je preferencija pa dva puta dnevno
Napravite 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 slatkog malog psića ili mačića ili vjerojatno čak i riblju obitelj u svom domu. No zbog užurbanog života često sumnjamo u sebe: 'Hoću li se moći brinuti za svog ljubimca?' Primarna odgovornost
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 i sl.), Bacanje loptica i još mnogo toga!: Pozdrav i dobrodošli u moju prvu Instructable! Naš pas VOLI svoju hranu, doslovno će je pojesti u roku od nekoliko sekundi. Smišljao sam načine kako to usporiti, od loptica s hranom unutra do bacanja po cijelom dvorištu. Nevjerojatno, ona je