Përmbajtje:
- Furnizimet
- Hapi 1: Instalimet elektrike
- Hapi 2: Bëni qelizën tuaj të ngarkesës të përdorshme
- Hapi 3: Baza e të dhënave e normalizuar
- Hapi 4: Kodimi i qelizës së ngarkesës
- Hapi 5: Kodimi i sensorit të ujit
- Hapi 6: Kodimi i sensorit të afërsisë
- Hapi 7: Kodimi i Stepper Motors
- Hapi 8: Kodimi i LCD -së
- Hapi 9: Fundi
Video: Shpërndarës ushqimor automatik i kafshëve shtëpiake: 9 hapa
2024 Autor: John Day | [email protected]. E modifikuara e fundit: 2024-01-30 12:10
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
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
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
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
rezultati përfundimtar: si e hartuam atë se si përfundoi.
Recommended:
Asnjë urinim tani, Pajisja për rregullimin e sjelljes së kafshëve shtëpiake që ndalon që macet të urinojnë në shtëpinë tuaj: 4 hapa
Jo Pee Tani, Pajisja e Përshtatjes së Sjelljes së Kafshëve që ndalon macet të urinojnë në shtëpinë tuaj: Unë u shqetësova aq shumë nga macja ime saqë asaj i pëlqen të urinojë në shtratin tim, kontrollova gjithçka që i duhej dhe gjithashtu e çova te veterineri. Pasi kam zgjidhur gjithçka që mund të mendoj dhe dëgjoj fjalën e mjekut, e kuptoj që ajo thjesht ka një sjellje të keqe. Pra th
Dispenser për ushqimin e kafshëve shtëpiake: 3 hapa
Dispenser për ushqimin e kafshëve shtëpiake: Para los amantes de mascotas, kjo është një produkt që ju nevojitet për të bërë! 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
Ushqyes i zgjuar i kafshëve shtëpiake: 9 hapa
Ushqyes i zgjuar i kafshëve shtëpiake: A keni një kafshë shtëpiake? Jo: adoptoni një! (dhe kthehuni te kjo e udhëzueshme). Po: punë e mirë! A nuk do të ishte mirë nëse mund të ushqeni dhe t'i jepni ujë të dashurit tuaj pa anuluar planet në mënyrë që të ktheheni në shtëpi në kohë? Ne themi mos u shqetëso
Ushqyes automatik i kafshëve shtëpiake duke përdorur AtTiny85: 6 hapa
Ushqyesi i kafshëve automatike duke përdorur AtTiny85: O trabalho Ushqyesi automatik i kafshëve duke përdorur AtTiny85 de PET Engenharia de Computação está licenciado com uma Licensë Creative Commons - Atribuição 4.0 Internacional
Ushqyes automatik i kafshëve shtëpiake duke përdorur një orë të vjetër dixhitale: 10 hapa (me fotografi)
Ushqyes automatik i kafshëve shtëpiake duke përdorur një orë të vjetër dixhitale: Përshëndetje, në këtë udhëzues do t'ju tregoj se si kam bërë një ushqyes automatik të kafshëve shtëpiake duke përdorur një orë dixhitale të vjetër. Kam futur gjithashtu një video se si e bëra këtë ushqyes. Ky udhëzues do të futet në konkursin e PCB dhe si favor do të bëja