Inhoudsopgave:

AUTOMATISCHE DISPENSER VOOR HUISDIER - Ajarnpa
AUTOMATISCHE DISPENSER VOOR HUISDIER - Ajarnpa

Video: AUTOMATISCHE DISPENSER VOOR HUISDIER - Ajarnpa

Video: AUTOMATISCHE DISPENSER VOOR HUISDIER - Ajarnpa
Video: Automatische diervoeder en drinkbak 3.8L 2024, Juni-
Anonim
AUTOMATISCHE HUISDIERENVOEDSELDISPENSER
AUTOMATISCHE HUISDIERENVOEDSELDISPENSER

Heb je ooit zin gehad om te veel tijd te verspillen aan het voeren van je huisdier? Ooit iemand moeten bellen om uw huisdieren te voeren terwijl u op vakantie was? Ik heb geprobeerd beide problemen op te lossen met mijn huidige schoolproject: Petfeed!

Benodigdheden

Raspberry Pi 3b

Staafladingcel (10kg)

HX711 Load Cell-versterker

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

Ultrasone nabijheidssensor

LCD 16-pins

2x stappenmotor 28byj-48

2x stappenmotor driver ULN2003

Stap 1: Bedrading

Bedrading
Bedrading
Bedrading
Bedrading

veel bekabeling hier. Haal je startkabels tevoorschijn en begin met pinnen!

Stap 2: Maak uw loadcel bruikbaar

Maak uw loadcel bruikbaar
Maak uw loadcel bruikbaar

om de load cell te gebruiken, moeten we deze eerst aan twee borden bevestigen: een bodemplaat en een plaat waarop we ons voedsel gaan wegen.

De schroeven die je nodig hebt zijn een paar M4-schroeven met bijpassende bouten en een paar M5-schroeven met bijpassende bouten. Ik gebruikte een kleine boor om de gaten te maken.

(foto:

Stap 3: Genormaliseerde database

Genormaliseerde database
Genormaliseerde database

gegevens van onze sensoren moeten worden opgeslagen in een database. Voor de python-bestanden om verbinding te maken met de database: zie hieronder.

dan heb je ook een configuratiebestand nodig:

[connector_python]gebruiker = *uwgebruikersnaam* host = 127.0.0.1 #if lokale poort = 3306 wachtwoord = *uwwachtwoord* database = *uwdb* [application_config] driver = 'SQL Server'

Stap 4: De laadcel coderen

importeer RPi. GPIO als GPIOimporteer threading importtijd van hx711 importeer HX711 van helpers.stepperFood importeer StepperFood van helpers. LCDWrite importeer LCDWrite uit repositories. DataRepository import DataRepository

Na het importeren van al onze bibliotheken (let op, we gebruiken de HX711-bibliotheek om de laadcel aan te sturen) kunnen we beginnen met het schrijven van onze eigenlijke code

TARRA_CONSTANT = 80600

GRAM_CONSTANT = 101

Om onze constanten te vinden, stelt u eerst TARRA_CONSTANT = 0 en GRAM_CONSTANT = 1 in.

Vervolgens moeten we de waarde achterhalen die onze loadcel aangeeft als er niets wordt gewogen. Deze waarde is TARRA_CONSTANT.

Wat betreft GRAM_CONSTANT, neem gewoon een object waarvan je het gewicht kent (ik heb een pak spaghetti's gebruikt), weeg het en deel de uitlezing van de load cell door het werkelijke gewicht van het object. Voor mij was dit 101.

klasse 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

hier initialiseren we de LoadCell-klasse en brengen we de pinnen in kaart.

def uitvoeren (zelf):

probeer: while True: self.hx711.reset() # Voordat we beginnen, reset de HX711 (niet verplicht) metingen_avg = sum(self.hx711.get_raw_data()) / 5 weight = round((measures_avg - TARRA_CONSTANT) / GRAM_CONSTANT, 0) print("weight: {0}".format(weight)) 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, "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) behalve uitzondering als e: print ("Fout met wegen" + str(e))

Stap 5: De watersensor coderen

import timeimport threading uit repositories. DataRepository importeer DataRepository uit RPi import GPIOGPIO.setmode(GPIO. BCM) GPIO.setwarnings(False) GPIO_Water = 18 GPIO.setup(GPIO_Water, GPIO. IN) class WaterSensor(threading. Thread): def _init_(self, socket): threading. Thread._init_(self) self.socket = socket self.vorige_status = 0 def run(self): 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) behalve uitzondering als ex: print(ex) print('error bij watersensor') def is_water(self): status = GPIO.invoer (GPIO_Wate) r) if self.vorige_status == 0 and status = 1: print('water zei') sensorData = {"status": status, "action": "water vector"} 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 en 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

Stap 6: De nabijheidssensor coderen

import timeimport threading uit repositories. DataRepository importeer DataRepository uit RPi importeer GPIO GPIO.setmode(GPIO. BCM) GPIO.setwarnings(False) GPIO_Trig = 4 GPIO_Echo = 17 GPIO.setup(GPIO_Trig, GPIO. OUT) GPIO.setup(GPIO_Echo, 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("Gemeten afstand = %.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() uitzondering Uitzondering als ex: print(ex) de f distance(self): # stel Trigger in op HOOG GPIO.output (GPIO_Trig, True) # stel Trigger na 0,01 ms in op LAAG 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() # tijdsverschil tussen start en aankomst TimeElapsed = StopTime - StartTime # vermenigvuldig met de sonische snelheid (34300 cm/s) # en deel door 2, want heen en terug afstand = (TimeElapsed * 34300) / 2 retourafstand

Stap 7: het coderen van de stappenmotoren

importeer RPi. GPIO als GPIOimporteer tijd import threading GPIO.setmode(GPIO. BCM) GPIO.setwarnings(False) control_pins = [12, 16, 20, 21] voor pin in control_pins: GPIO.setup(pin, GPIO. OUT) GPIO.output (pin, 0) halfstep_seq =

Deze code is herbruikbaar voor de andere stappenmotor, stel gewoon de controle-pinnummers in op hun respectieve pinnen en hernoem de klasse naar StepperWater:

Stap 8: Het LCD coderen

Veel code, maar we zijn bijna klaar.

De klasse LCD is opgenomen als bestand LCD.py

van helpers. 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]) klasse LCDWrite: def message(msg): try: print("try") lcd.init_LCD() lcd.send_instruction(12) lcd.clear_display() lcd.write_message(msg, '1') behalve: print("fout LCDWrite")

Stap 9: het einde

Het einde
Het einde
Het einde
Het einde

eindresultaat: hoe we het hebben opgesteld vs. hoe het is geëindigd.

Aanbevolen: