Sisukord:

Lemmikloomade toiduainete automaatne dosaator: 9 sammu
Lemmikloomade toiduainete automaatne dosaator: 9 sammu

Video: Lemmikloomade toiduainete automaatne dosaator: 9 sammu

Video: Lemmikloomade toiduainete automaatne dosaator: 9 sammu
Video: 6 viisi, kuidas oma sissetulekuid kasvatada 2024, Detsember
Anonim
AUTOMAATNE Lemmikloomatoidu dosaator
AUTOMAATNE Lemmikloomatoidu dosaator

Kas olete kunagi tundnud, et raiskaksite liiga palju aega oma lemmiklooma toitmiseks? Kas olete pidanud puhkuse ajal kellelegi helistama, et teie lemmikloomi toita? Olen püüdnud mõlemat probleemi lahendada oma praeguse kooliprojektiga: Petfeed!

Tarvikud

Vaarika Pi 3b

Baarikoormus (10 kg)

HX711 koormusanduri võimendi

Veetaseme andur (https://www.dfrobot.com/product-1493.html)

Ultraheli lähedusandur

LCD 16-kontaktiline

2x samm-mootor 28byj-48

2x samm -mootoriga juht ULN2003

Samm: juhtmestik

Juhtmestik
Juhtmestik
Juhtmestik
Juhtmestik

siin on palju kaabeldusi. Võtke hüppajakaablid välja ja alustage kinnitamist!

2. toiming: muutke oma laadimislahtrit kasutatavaks

Muutke oma laadimisandur kasutuskõlblikuks
Muutke oma laadimisandur kasutuskõlblikuks

koormusanduri kasutamiseks peame selle esmalt kinnitama kahe taldriku külge: põhjaplaadi ja taldriku, millel kaalume oma toitu.

Vajalikud kruvid on paar M4 kruvi koos sobivate poltidega ja paar M5 kruvi koos sobivate poltidega. Aukude tegemiseks kasutasin väikest puurit.

(pilt:

3. samm: normaliseeritud andmebaas

Normaliseeritud andmebaas
Normaliseeritud andmebaas

Andurite andmed tuleb salvestada andmebaasi. Python -failide andmebaasiga ühendamiseks: vaadake allpool.

siis vajate ka konfiguratsioonifaili:

[konnektor_python] kasutaja = * teie kasutajanimi * host = 127.0.0.1 #if kohalik port = 3306 parool = * teie parool * andmebaas = * teiedb * [application_config] draiver = 'SQL Server'

4. samm: koormusanduri kodeerimine

importige RPi. GPIO GPIO -ks impordi keermestamise importimise aeg hx711 -st impordi HX711 abistajatest. stepperFood impordi StepperFood abistajatest. LCD kirjutage impordi LCD -kirjutus hoidlatest. DataRepository import DataRepository

Pärast kõigi meie teekide importimist (pange tähele, et laadimisanduri juhtimiseks kasutame raamatukogu HX711), saame hakata kirjutama oma tegelikku koodi

TARRA_KONSTANT = 80600

GRAM_KONSTANT = 101

Meie konstantide väljaselgitamiseks määrake kõigepealt TARRA_CONSTANT = 0 ja GRAM_CONSTANT = 1.

Järgmisena peame välja selgitama väärtuse, mida meie koormusandur loeb, kui midagi ei kaaluta. See väärtus on TARRA_CONSTANT.

Mis puutub GRAM_CONSTANTi, siis võtke lihtsalt objekt, mille kaalu teate (ma kasutasin spagettide pakki), kaaluge seda ja jagage koormusanduri näit objekti tegeliku kaaluga. Minu jaoks oli see 101.

klassi LoadCell (keermestamine. niit):

def _init _ (ise, pistikupesa, LCD): keermestamine. Teema._ init _ (ise) self.hx711 = HX711 (dout_pin = 5, pd_sck_pin = 6, channel = 'A', gain = 64) self.socket = socket self.lcd = LCD

siin lähtestame LoadCelli klassi ja kaardistame tihvtid.

def run (ise):

try: while True: self.hx711.reset () # Enne alustamist lähtestage HX711 (pole kohustuslik) meetmed_avg = summa (self.hx711.get_raw_data ()) / 5 kaal = ümmargune ((meetmed_avg - TARRA_CONSTANT) / GRAM_CONSTANT, 0) print ("kaal: {0}". Formaat (kaal)) DataRepository.insert_weight (kaal) 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 = "kaal:" + str (db_kaal) msg = "PETFEED" LCDWrite.message () if int (db_weight [:-2]) <= 100: StepperFood.run () time.sleep (20), välja arvatud erand kui e: print ("Viga kaalumisel" + str (e))

Samm 5: Veeanduri kodeerimine

impordi aegimporti lõimimine hoidlatest. ise, pistikupesa): keermestamine.niit._ init _ (ise) self.socket = pistikupesa self.vorige_status = 0 def run (self): try: while True: water = self.is_water () print (water) status = water [" status "] action = vesi [" action "] DataRepository.insert_water (str (status), action) data_water = DataRepository.get_data_sensor (2) historyId = data_water [" SensorsHistory "] value = data_water [" value "] if value == "0": value = "te weinig water" else: value = "genoeg water" actionTime = data_water ["actionTime"] self.socket.emit ('data_water', {"id": historyId, "value": väärtus, "Aeg": DataRepository.serializeDateTime (actionTime), "action": action}) time.sleep (5), va Erand nagu näiteks: print (ex) print ('error bij vesiensor') def is_water (self): status = GPIO.input (GPIO_Wate r) kui self.vorige_status == 0 ja 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 and status == 1: print ('water aanwezig') sensorData = {"status": status, "action": "water aanwezig"} status = GPIO.input (GPIO_Water) if self.vorige_status == 1 ja status == 0: print ('water weg') sensorData = {"status": status, "action": "water weg"} self.vorige_status = status status = GPIO.input (GPIO_Water) if self.vorige_status == 0 ja status == 0: print ('startpositie') status = GPIO.input (GPIO_Water) sensorData = {"status": status, "action": "startpositie"} return sensorData

6. samm: lähedusanduri kodeerimine

impordi aegimporti lõimimine hoidlatest.. 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 (ise): 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, "Proximity": prox, "Time": DataRepository.serializeDateTime (actionTime)}) last_reading = current_milli_time (), välja arvatud erand, näiteks ex: print (ex) de f kaugus (ise): # määrake käivitaja väärtuseks HIGH GPIO. väljund (GPIO_Trig, True) # määrake käivitaja pärast 0,01 ms väärtuseks LOW time.sleep (0,00001) GPIO.output (GPIO_Trig, False) StartTime = time.time () StopTime = time.time () # save StartTime while GPIO.input (GPIO_Echo) == 0: StartTime = time.time () # saabumisaja salvestamine GPIO.input (GPIO_Echo) == 1: StopTime = time.time () # ajavahe alguse ja saabumise vahel TimeElapsed = StopTime - StartTime # korrutatakse helikiirusega (34300 cm / s) # ja jagatakse 2 -ga, sest kaugus sinna ja tagasi = (TimeElapsed * 34300) / 2 tagasisõidu kaugus

Samm: samm -mootorite kodeerimine

RPi. GPIO importimine GPIO -ks Impordi aja importimise lõimimine GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) control_pins = [12, 16, 20, 21] pin in control_pins: GPIO.setup (pin, GPIO. OUT) GPIO.väljund (pin, 0) halfstep_seq =

See kood on teise samm -mootori jaoks korduvkasutatav, määrake lihtsalt juhtnuppude numbrid vastavatele tihvtidele ja nimetage klass ümber StepperWateriks:

Samm: LCD -ekraani kodeerimine

Palju koodi, kuid oleme peaaegu valmis.

LCD -klass kuulub faili LCD.py

abistajatelt. LCD impordi 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]) klass LCD Kirjutage: def sõnum (msg): try: print ("try") lcd.init_LCD () lcd.send_instruction (12) lcd.clear_display () lcd.write_message (msg, '1') v.a.: print ("tõrge LCDWrite")

9. samm: lõpp

Lõpp
Lõpp
Lõpp
Lõpp

lõpptulemus: kuidas me selle koostasime ja kuidas see lõppes.

Soovitan: