Sadržaj:

AUTOMATSKI DOSAVAČ HRANE ZA Hrana za kućne ljubimce: 9 koraka
AUTOMATSKI DOSAVAČ HRANE ZA Hrana za kućne ljubimce: 9 koraka

Video: AUTOMATSKI DOSAVAČ HRANE ZA Hrana za kućne ljubimce: 9 koraka

Video: AUTOMATSKI DOSAVAČ HRANE ZA Hrana za kućne ljubimce: 9 koraka
Video: OSIGURACI - Automatski osiguraci 2024, Studeni
Anonim
AUTOMATSKI DOSAVAČ HRANE ZA PET
AUTOMATSKI DOSAVAČ HRANE ZA PET

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

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

puno kabliranja ovdje. Izvucite kratkospojne kabele i počnite pričvršćivati!

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

Učinite svoju mjernu stanicu upotrebljivom
Učinite svoju mjernu stanicu 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

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

Kraj
Kraj
Kraj
Kraj

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

Preporučeni: