Përmbajtje:

Shpërndarës ushqimor automatik i kafshëve shtëpiake: 9 hapa
Shpërndarës ushqimor automatik i kafshëve shtëpiake: 9 hapa

Video: Shpërndarës ushqimor automatik i kafshëve shtëpiake: 9 hapa

Video: Shpërndarës ushqimor automatik i kafshëve shtëpiake: 9 hapa
Video: 9 hapa si të filloj një biznes të suksesshëm 2024, Qershor
Anonim
Shpërndarës ushqimor automatik për kafshët shtëpiake
Shpërndarës ushqimor automatik për kafshët shtëpiake

A keni menduar ndonjëherë të humbisni shumë kohë duke ushqyer kafshën tuaj? A ju është dashur ndonjëherë të telefononi dikë për të ushqyer kafshët tuaja shtëpiake gjatë kohës që keni qenë me pushime? Unë jam përpjekur t'i rregulloj të dyja këto çështje me projektin tim aktual të shkollës: Petfeed!

Furnizimet

Raspberry Pi 3b

Qeliza e ngarkesës së barit (10kg)

HX711 Përforcuesi i Qelizës së Ngarkesës

Sensori i nivelit të ujit (https://www.dfrobot.com/product-1493.html)

Sensori i afërsisë tejzanor

LCD me 16 kunja

2x stepper motor 28byj-48

Shofer 2x motor stepper ULN2003

Hapi 1: Instalimet elektrike

Instalime elektrike
Instalime elektrike
Instalime elektrike
Instalime elektrike

shumë kabllo këtu. Hiqni kabllot tuaja të bluzave dhe filloni të fiksoheni!

Hapi 2: Bëni qelizën tuaj të ngarkesës të përdorshme

Bëni qelizën tuaj të ngarkesës të përdorshme
Bëni qelizën tuaj të ngarkesës të përdorshme

për të përdorur qelizën e ngarkesës, së pari duhet ta lidhim atë në dy pjata: një pjatë të poshtme dhe një pjatë në të cilën do të peshojmë ushqimin tonë.

Vidhat që ju nevojiten janë një palë vida M4 me bulona që përputhen dhe një palë vida M5 me bulona që përputhen. Kam përdorur një stërvitje të vogël për të bërë vrimat.

(foto:

Hapi 3: Baza e të dhënave e normalizuar

Baza e të dhënave e normalizuar
Baza e të dhënave e normalizuar

të dhënat nga sensorët tanë duhet të ruhen në një bazë të dhënash. Që skedarët python të lidhen me bazën e të dhënave: shiko më poshtë.

atëherë ju gjithashtu keni nevojë për një skedar konfigurimi:

[connector_python] user = * yourusername * host = 127.0.0.1 #ifo port lokal = 3306 password = * yourpassword * database = * yourdb * [application_config] driver = 'SQL Server'

Hapi 4: Kodimi i qelizës së ngarkesës

import RPi. GPIO si GPIOimport koha e filetimit të importit nga hx711 import HX711 nga ndihmësit. stepperFood import StepperFood nga ndihmësit. LCDShkruani import LCD Shkruani nga depot. DataRepository import DataRepository

Pas importimit të të gjitha bibliotekave tona (vini re, ne po përdorim Bibliotekën HX711 për të drejtuar qelizën e ngarkesës) mund të fillojmë të shkruajmë kodin tonë aktual

TARRA_CONSTANT = 80600

GRAM_CONSTANT = 101

Për të gjetur konstantet tona, së pari vendosni TARRA_CONSTANT = 0 dhe GRAM_CONSTANT = 1.

Tjetra ne duhet të zbulojmë vlerën që lexon qeliza jonë e ngarkesës kur nuk peshohet asgjë. Kjo vlerë do të jetë TARRA_CONSTANT.

Sa i përket GRAM_CONSTANT, thjesht merrni një objekt për të cilin e njihni peshën (kam përdorur një paketë spageti), peshojeni atë dhe ndani leximin e qelizës së ngarkesës me peshën aktuale të objektit. Për mua kjo ishte 101.

klasa LoadCell (filetimi. Thread):

def _init _ (vetë, fole, lcd): filetim. Thread._ init _ (self) self.hx711 = HX711 (dout_pin = 5, pd_sck_pin = 6, channel = 'A', gain = 64) self.socket = socket self.lcd = lcd

këtu inicializojmë klasën LoadCell dhe hartojmë kunjat.

def drejtuar (vetja):

provoni: ndërsa E vërtetë: self.hx711.reset () # Para se të fillojmë, rivendosni HX711 (nuk është e detyrueshme) masë_avg = shuma (vetë.hx711.get_raw_data ()) / 5 peshë = rrumbullak ((masë_avg - TARRA_CONSTANT) / GRAM_CONSTANT, 0) print ("pesha: {0}". Format (pesha)) 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, "Pesha": db_weight, "Time": DataRepository.serializeDateTime (actionTime)}) print ("zou moeten emitten") writeWeight = "pesha:" + str (db_weight) msg = "PETFEED" LCDWrite.message () if int (db_weight [:-2]) <= 100: StepperFood.run () time.sleep (20) përveç Përjashtimit si e: print ("Gabim me peshimin" + str (e))

Hapi 5: Kodimi i sensorit të ujit

importim kohë importim filetimi nga depot. DataRepository import DataRepository nga RPi import GPIOGPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) GPIO_Water = 18 GPIO.setup (GPIO_Water, GPIO. IN) class WaterSensor (defting_h) vetja, foleja): filetimi. Thread._ init _ (self) self.socket = fole self.vorige_status = 0 def run (self): try: while True: water = self.is_water () print (ujë) status = ujë [" statusi "] veprimi = uji [" veprimi "] DataRepository.insert_water (str (statusi), veprimi) data_water = DataRepository.get_data_sensor (2) historyId = data_water [" SensorsHistory "] value = data_water [" value "] nëse vlera == "0": value = "ju weinig water" else: value = "genoeg water" actionTime = data_water ["actionTime"] self.socket.emit ('data_water', {"id": historyId, "vlera": vlera, "Koha": DataRepository.serializeDateTime (actionTime), "action": action}) time.sleep (5) me përjashtim të Përjashtimit si psh: print (ex) print ('error bij watersensor') def is_water (self): status = GPIO.input (GPIO_Wate r) nëse self.vorige_status == 0 dhe status == 1: print ('gedetecteerd water') sensorData = {"status": status, "action": "water gedetecteerd"} self.vorige_status = status status = GPIO.input (GPIO_Water) nëse self.vorige_status == 1 dhe statusi == 1: print ('water aanwezig') sensorData = {"status": status, "action": "water aanwezig"} status = GPIO.input (GPIO_Water) nëse self.vorige_status == 1 dhe statusi == 0: print ('ujë weg') sensorData = {"status": status, "action": "weg weg"} self.vorige_status = status status = GPIO.input (GPIO_Water) nëse self.vorige_status == 0 dhe statusi == 0: print ('startpositie') status = GPIO.input (GPIO_Water) sensorData = {"status": status, "action": "startpositie"} sensor sensorData

Hapi 6: Kodimi i sensorit të afërsisë

importim kohë importim fije nga depot. DataRepository import DataRepository nga RPi import GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) GPIO_Trig = 4 GPIO_Echo = 17 GPIO.setup (GPIO_Trig, GPIO. OUE) GPIO. 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 (self): try: last_reading = 0 interval = 5000 while True: if current_milli_time ()> last_reading + interval: dist = self.distance () print ("Distanca e matur = %.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, "Afërsia": prox, "Koha": DataRepository.serializeDateTime (actionTime)}) last_reading = current_milli_time () përveç Përjashtimit si psh: print (ex) de f distanca (vetja): # vendosur Nxjerr në HIGH GPIO.putput (GPIO_Trig, True) # vendosur Trigger pas 0.01ms në LOW time.sleep (0.00001) GPIO.putput (GPIO_Trig, False) StartTime = time.time () StopTime = time.time () # ruaj StartTime ndërsa GPIO.input (GPIO_Echo) == 0: StartTime = time.time () # kurseni kohën e mbërritjes ndërsa GPIO.input (GPIO_Echo) == 1: StopTime = time.time () # diferenca kohore midis fillimit dhe mbërritjes TimeElapsed = StopTime - StartTime # shumëzoni me shpejtësinë zanore (34300 cm / s) # dhe ndani me 2, sepse atje dhe distanca mbrapa = (Koha e kaluar * 34300) / 2 distanca e kthimit

Hapi 7: Kodimi i Stepper Motors

import RPi. GPIO si GPIOimport kohë importimi filetimi GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) control_pins = [12, 16, 20, 21] për pin në control_pins: GPIO.setup (pin, GPIO. OUT) GPIO. dalje (pin, 0) halfstep_seq =

Ky kod është i ripërdorshëm për motorin tjetër stepper, thjesht vendosni numrat e kunjave të kontrollit në kunjat e tyre të ardhshëm dhe riemëroni klasën në StepperWater:

Hapi 8: Kodimi i LCD -së

Shumë kode, por gati e kemi përfunduar.

Klasa LCD përfshihet si skedar LCD.py

nga ndihmësit. LCD import 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]) LCD të klasësShkruaj: mesazh def (msg): provo: print ("provo") lcd.init_LCD () lcd.send_instruction (12) lcd.clear_display () lcd.write_message (msg, '1') përveç: print ("error LCDWrite")

Hapi 9: Fundi

Fund
Fund
Fund
Fund

rezultati përfundimtar: si e hartuam atë se si përfundoi.

Recommended: