Taula de continguts:
- Subministraments
- Pas 1: cablejat
- Pas 2: feu que la vostra cèl·lula de càrrega sigui útil
- Pas 3: base de dades normalitzada
- Pas 4: Codificació de la cel·la de càrrega
- Pas 5: Codificació del sensor d'aigua
- Pas 6: Codificació del sensor de proximitat
- Pas 7: Codificació dels motors pas a pas
- Pas 8: Codificació de la pantalla LCD
- Pas 9: el final
Vídeo: DISPENSADOR AUTOMÀTIC D'ALIMENTS PER A PET: 9 passos
2024 Autora: John Day | [email protected]. Última modificació: 2024-01-30 08:11
Alguna vegada heu tingut ganes de perdre massa temps alimentant la vostra mascota? Alguna vegada ha hagut de trucar a algú per alimentar les seves mascotes mentre estava de vacances? He intentat solucionar aquests dos problemes amb el meu projecte escolar actual: Petfeed!
Subministraments
Raspberry Pi 3b
Cèl·lula de càrrega de barres (10 kg)
Amplificador de cèl·lules de càrrega HX711
Sensor de nivell d'aigua (https://www.dfrobot.com/product-1493.html)
Sensor de proximitat per ultrasons
LCD de 16 pins
2x motor pas a pas 28byj-48
2x controlador de motor pas a pas ULN2003
Pas 1: cablejat
un munt de cablejat aquí. Traieu els cables del jumper i comenceu a fixar!
Pas 2: feu que la vostra cèl·lula de càrrega sigui útil
per utilitzar la cel·la de càrrega, primer hem de fixar-la a dues plaques: una placa inferior i una placa sobre la qual pesarem el menjar.
Els cargols que necessiteu són un parell de cargols M4 amb cargols coincidents i un parell de cargols M5 amb cargols coincidents. He fet un petit trepant per fer els forats.
(pic:
Pas 3: base de dades normalitzada
les dades dels nostres sensors s’han de desar a una base de dades. Per a la connexió dels fitxers python a la base de dades: vegeu més avall.
llavors també necessiteu un fitxer de configuració:
[connector_python] user = * nom d’usuari * host = 127.0.0.1 #if port local = 3306 password = * yourpassword * database = * yourdb * [application_config] driver = 'SQL Server'
Pas 4: Codificació de la cel·la de càrrega
importar RPi. GPIO com a GPIOimportar el temps d’importació de la conversió d’hx711 importar HX711 de helpers.stepperFood importar StepperFood d’ajudar. LCDWrite importar LCDWrite de repositoris. DataRepository importar DataRepository
Després d’importar totes les nostres biblioteques (tingueu en compte que estem utilitzant la biblioteca HX711 per conduir la cel·la de càrrega) podem començar a escriure el nostre codi real
TARRA_CONSTANT = 80600
GRAM_CONSTANT = 101
Per esbrinar les nostres constants, primer poseu TARRA_CONSTANT = 0 i GRAM_CONSTANT = 1.
A continuació, hem d'esbrinar el valor que llegeix la nostra cel·la de càrrega quan no es pesa res. Aquest valor serà TARRA_CONSTANT.
Quant a GRAM_CONSTANT, simplement agafeu un objecte del que coneixeu el pes (he utilitzat un paquet d’espaguetis), peseu-lo i dividiu la lectura de la cel·la de càrrega amb el pes real de l’objecte. Per a mi, això era 101.
classe 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
aquí inicialitzem la classe LoadCell i mapem els pins.
def run (auto):
try: while True: self.hx711.reset () # Abans de començar, restableix l'HX711 (no obligatori) mesures_avg = sum (self.hx711.get_raw_data ()) / 5 weight = round ((mesures_avg - TARRA_CONSTANT) / GRAM_CONSTANT, 0) print ("pes: {0}". Format (pes)) DataRepository.insert_weight (pes) 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) excepte Excepció com a e: print ("Error amb el pesatge" + str (e))
Pas 5: Codificació del sensor d'aigua
importar importar fils de repositoris. DataRepository importar DataRepository de RPi importar GPIOGPIO.setmode (GPIO. BCM) GPIO.setwarnings (fals) GPIO_Water = 18 GPIO.setup (GPIO_Water, GPIO. IN) classe WaterSensor (threading. Thread): def _init_ self, socket): threading. Thread._ init _ (self) self.socket = socket self.vorige_status = 0 def run (auto): try: while True: water = self.is_water () print (water) status = water [" status "] action = water [" 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": value, "Time": DataRepository.serializeDateTime (actionTime), "action": action}) time.sleep (5) excepte Exception as ex: print (ex) print ('error bij watersensor') def is_water (self): status = GPIO.input (GPIO_Wate r) if self.vorige_status == 0 and status == 1: print ('water gedetecteerd') sensorData = {"status": status, "action": "water gedetecteerd"} self.vorige_status = status status = GPIO.input (GPIO_Water) si self.vorige_status == 1 i status == 1: print ('water aanwezig') sensorData = {"status": status, "action": "water aanwezig"} status = GPIO.input (GPIO_Water) si self.vorige_status == 1 and 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 and status == 0: print ('startpositie') status = GPIO.input (GPIO_Water) sensorData = {"status": status, "action": "startpositie"} return sensorData
Pas 6: Codificació del sensor de proximitat
importar la importació de fils des de repositoris. DataRepository importar DataRepository des de RPi importar GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (fals) GPIO_Trig = 4 GPIO_Echo = 17 GPIO.setup (GPIO_Trig, GPIO. OUT) GPIO.setup (GPIO_Echo,. 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 ("Distància mesurada =%.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 () except Exception as ex: print (ex) de f distància (auto): # establir Trigger a HIGH GPIO.output (GPIO_Trig, True) # establir Trigger després de 0,01 ms a 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 () # save time of arrival while GPIO.input (GPIO_Echo) == 1: StopTime = time.time () # diferència horària entre inici i arribada TimeElapsed = StopTime - StartTime # multiplica amb la velocitat sonora (34300 cm / s) # i divideix per 2, perquè distància d'anada i tornada = (TimeElapsed * 34300) / 2 distància de retorn
Pas 7: Codificació dels motors pas a pas
importar RPi. GPIO com a GPIO importar temps d'importació de subprocessament GPIO.setmode (GPIO. BCM) GPIO.setwarnings (fals) control_pins = [12, 16, 20, 21] per pin a control_pins: GPIO.setup (pin, GPIO. OUT) GPIO.output (pin, 0) halfstep_seq =
Aquest codi es pot reutilitzar per a l’altre motor pas a pas, només heu d’establir els números dels pins de control als pins respectius i canviar el nom de la classe a StepperWater:
Pas 8: Codificació de la pantalla LCD
Molts codis, però gairebé hem acabat.
La classe LCD s’inclou com a fitxer LCD.py
d’ajudants. LCD d’importació de 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]) classe LCDWrite: missatge def (msg): try: print ("try") lcd.init_LCD () lcd.send_instruction (12) lcd.clear_display () lcd.write_message (msg, '1') excepte: print ("error LCDWrite")
Pas 9: el final
resultat final: com el vam elaborar vs. com va acabar.
Recomanat:
Dispensador d'aliments per a mascotes: 3 passos
Pet Food Dispenser: Per als amants de mascotes, aquest és un projecte que poden ser molt útils! Un alimentador automàtic que permet observar quin és el pesatge del menjar, i només és necessari que oprimis un botó. Un mecanisme senzill que podrà armar des del teu
Dispensador d’aliments per a animals (DAA): 5 Steps
Dispensador De Alimentos Para Animales (DAA): FundamentaciónEn la ciutat de Caacupé existeix una problemàtica d’animals que no tenen un llar, per tant tant ronden per les trucades sense tenir cura algú, sinó que alimenten buscant la forma de sobreviure. Dado que els ciutadans generalment no poden
Projecte Arduino: Dispensador d'aliments per a gats: 6 passos
Projecte Arduino: Dispensador d'aliments per a gats: aquest instructiu es va crear per complir el requisit del projecte del Makecourse de la Universitat del Sud de Florida (www.makecourse.com)
Dispositiu de cobertura de bols per a aliments per a gats: 4 passos
Dispositiu de cobertura de bols de menjar per a gats: aquest instructiu es va crear per complir el requisit del projecte del Makecourse de la Universitat del Sud de Florida (www.makecourse.com). Aquest dispositiu era
Dispensador d'aliments per a gossos alimentat per Arduino: 10 passos (amb imatges)
Distribuïdor d'aliments per a gossos alimentat per Arduino: si la vostra casa és com la meva, és possible que oblideu algunes tasques quan tingueu pressa. No deixeu que la vostra mascota s’oblidi. Aquest dispensador automatitzat d’aliments per a gossos utilitza un Arduino per lliurar la quantitat adequada de pinzellades al moment adequat. Tot pa