Inhoudsopgave:
- Benodigdheden
- Stap 1: Bedrading
- Stap 2: Maak uw loadcel bruikbaar
- Stap 3: Genormaliseerde database
- Stap 4: De laadcel coderen
- Stap 5: De watersensor coderen
- Stap 6: De nabijheidssensor coderen
- Stap 7: het coderen van de stappenmotoren
- Stap 8: Het LCD coderen
- Stap 9: het einde
Video: AUTOMATISCHE DISPENSER VOOR HUISDIER - Ajarnpa
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:14
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
veel bekabeling hier. Haal je startkabels tevoorschijn en begin met pinnen!
Stap 2: 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
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
eindresultaat: hoe we het hebben opgesteld vs. hoe het is geëindigd.
Aanbevolen:
Installatie voor externe Bluetooth GPS-provider voor Android-apparaten: 8 stappen
Installatie voor externe Bluetooth GPS-provider voor Android-apparaten: deze instructable legt uit hoe u uw eigen externe Bluetooth-compatibele GPS voor uw telefoon kunt maken, wat dan ook voor ongeveer $ 10. Materiaallijst: NEO 6M U-blox GPSHC-05 bluetooth-module Kennis van interface Blutooth Low energy-modulesArdui
Leo: de kat als huisdier: 7 stappen (met afbeeldingen)
Leo: the Pet Cat: Hallo, dit is mijn eerste instructables. De eerste versie van "Sony Aibo Robot (1999)" trokken me op vierjarige leeftijd naar robotica, sindsdien was het mijn droom om een huisdierenrobot voor me te maken. Dus bedacht ik "Leo: the Pet Cat" w
Automatische infraroodwaterkraan voor $ 5: 12 stappen (met afbeeldingen)
Automatische infraroodwaterkraan voor $ 5: in dit project maken we een automatische aan-uit-waterkraan voor slechts $ 5. We zullen een IR-sensor en een waterschakelaar gebruiken om deze automatische infraroodwaterkraan te maken. Er wordt geen microcontroller gebruikt om deze automatische infrarood waterkraan te maken. Plaats eenvoudig uw
Idee voor doe-het-zelf-activiteit voor weerstations voor 12+ jaar: 4 stappen
Idee voor doe-het-zelf-weerstationactiviteit voor 12-plussers: in deze activiteit zullen deelnemers hun weerstation opzetten, de lucht in sturen en de opnames (licht, temperatuur, vochtigheid) in realtime volgen via de Blynk-app. Bovendien leert u hoe u de geregistreerde waarden publiceert
Voeg een pc-synchronisatie-aansluiting toe aan een Nikon Sc-28 Ttl-kabel (gebruik de automatische instellingen voor een aan-cameraflits en trigger-uit-cameraflitsen!!): 4 stappen
Voeg een Pc Sync-aansluiting toe aan een Nikon Sc-28 TTL-kabel (gebruik Auto-instellingen voor een on Camera Flash en Trigger Off Camera Flashes !!): in deze instructable laat ik je zien hoe je een van die vervelende gepatenteerde 3-pins TTL-connectoren op de zijkant van een Nikon SC-28 off-camera TTL-kabel en vervang deze door een standaard pc-synchronisatieconnector. hierdoor kunt u een speciale flitser gebruiken, s