Taula de continguts:

DISPENSADOR AUTOMÀTIC D'ALIMENTS PER A PET: 9 passos
DISPENSADOR AUTOMÀTIC D'ALIMENTS PER A PET: 9 passos

Vídeo: DISPENSADOR AUTOMÀTIC D'ALIMENTS PER A PET: 9 passos

Vídeo: DISPENSADOR AUTOMÀTIC D'ALIMENTS PER A PET: 9 passos
Vídeo: ЗАПРЕЩЁННЫЕ ТОВАРЫ с ALIEXPRESS 2023 ШТРАФ и ТЮРЬМА ЛЕГКО! 2024, Juny
Anonim
DISPENSADOR AUTOMÀTIC D'ALIMENTS PER A PETS
DISPENSADOR AUTOMÀTIC D'ALIMENTS PER A PETS

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

Cablejat
Cablejat
Cablejat
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

Feu que la vostra cel·la de càrrega sigui útil
Feu que la vostra cel·la 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

Base de dades normalitzada
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

El final
El final
El final
El final

resultat final: com el vam elaborar vs. com va acabar.

Recomanat: