Innehållsförteckning:
- Tillbehör
- Steg 1: Kabeldragning
- Steg 2: Gör din lastcell användbar
- Steg 3: Normaliserad databas
- Steg 4: Kodning av lastcellen
- Steg 5: Kodning av vattensensorn
- Steg 6: Kodning av närhetssensorn
- Steg 7: Kodning av stegmotorerna
- Steg 8: Kodning av LCD -skärmen
- Steg 9: Slutet
Video: AUTOMATISK PET -MATDISPENSER: 9 steg
2024 Författare: John Day | [email protected]. Senast ändrad: 2024-01-30 12:37
Har du någonsin känt att du slösar för mycket tid på att mata ditt husdjur? Har du någonsin behövt ringa någon för att mata dina husdjur medan du var på semester? Jag har försökt fixa båda dessa problem med mitt nuvarande skolprojekt: Petfeed!
Tillbehör
Raspberry Pi 3b
Stånglastcell (10kg)
HX711 Load Cell Amplifier
Vattennivåsensor (https://www.dfrobot.com/product-1493.html)
Ultrasonic närhetssensor
LCD 16-stift
2x stegmotor 28byj-48
2x stegmotordrivrutin ULN2003
Steg 1: Kabeldragning
mycket kablar här. Ta ut dina bygelkablar och börja fästa!
Steg 2: Gör din lastcell användbar
För att använda lastcellen måste vi först fästa den på två tallrikar: en bottenplatta och en tallrik som vi kommer att väga maten på.
Skruvarna du behöver är ett par M4 -skruvar med matchande bultar och ett par M5 -skruvar med matchande bultar. Jag använde en liten borr för att göra hålen.
(bild:
Steg 3: Normaliserad databas
data från våra sensorer måste sparas i en databas. För att pythonfilerna ska ansluta till databasen: se nedan.
då behöver du också en konfigurationsfil:
[connector_python] user = * ditt användarnamn * host = 127.0.0.1 #if lokal port = 3306 lösenord = * ditt lösenord * databas = * yourdb * [application_config] driver = 'SQL Server'
Steg 4: Kodning av lastcellen
importera RPi. GPIO som GPIOimporttråd importtid från hx711 import HX711 från helpers.stepperFood import StepperFood från helpers. LCDWrite import LCDWrite från förråd. DataRepository import DataRepository
Efter att ha importerat alla våra bibliotek (observera att vi använder HX711 -biblioteket för att driva lastcellen) kan vi börja skriva vår faktiska kod
TARRA_CONSTANT = 80600
GRAM_CONSTANT = 101
För att ta reda på våra konstanter, sätt först TARRA_CONSTANT = 0 och GRAM_CONSTANT = 1.
Därefter måste vi ta reda på värdet vår lastcell läser när ingenting vägs. Det här värdet blir TARRA_CONSTANT.
När det gäller GRAM_CONSTANT, ta bara ett föremål du känner till vikten på (jag använde ett paket spagettis), väg det och dela upp avläsningen av lastcellen med objektets faktiska vikt. För mig var detta 101.
class 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
här initierar vi LoadCell -klassen och kartlägger stiften.
def run (själv):
försök: medan True: self.hx711.reset () # Innan vi börjar, återställ HX711 (inte obligatorisk) Measures_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 ("skulle behöva emitten") writeWeight = "weight:" + str (db_weight) msg = "PETFEED" LCDWrite.message () if int (db_weight [:-2]) <= 100: StepperFood.run () time.sleep (20) utom Undantag som e: print ("Fel med vägning" + str (e))
Steg 5: Kodning av vattensensorn
import timeimport threading from repositories. DataRepository import DataRepository from RPi import GPIOGPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) GPIO_Water = 18 GPIO.setup (GPIO_Water, GPIO. IN) class WaterSensor (threading. Thread): def _in 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 = "tillräckligt vatten" actionTime = data_water ["actionTime"] self.socket.emit ('data_water', {"id": historyId, "value": value, "Time": DataRepository.serializeDateTime (actionTime), "action": action}) time.sleep (5) utom Undantag som 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) if self.vorige_status == 1 och status == 1: print ('water aanwezig') sensorData = {"status": status, "action": "water aanwezig"} status = GPIO.input (GPIO_Water) if self.vorige_status == 1 och status == 0: print ('water weg') sensorData = {"status": status, "action": "water weg"} self.vorige_status = status status = GPIO.input (GPIO_Water) om self.vorige_status == 0 och status == 0: print ('startpositie') status = GPIO.input (GPIO_Water) sensorData = {"status": status, "action": "startpositie"} returnera sensorData
Steg 6: Kodning av närhetssensorn
import timeimport threading from repositories. DataRepository import DataRepository from RPi import GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) GPIO_Trig = 4 GPIO_Echo = 17 GPIO.setup (GPIO_Trig, GPIO. OUT) GPIO.setup (GPIO_cho. 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 ("Measured Distance = %.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 () utom Undantag som ex: print (ex) de f distans (själv): # ställ Trigger till HIGH GPIO.output (GPIO_Trig, True) # set Trigger efter 0.01ms till LOW time.sleep (0.00001) GPIO.output (GPIO_Trig, False) StartTime = time.time () StopTime = time.time () # spara StartTime medan GPIO.input (GPIO_Echo) == 0: StartTime = time.time () # spara ankomsttid medan GPIO.input (GPIO_Echo) == 1: StopTime = time.time () # tidsskillnad mellan start och ankomst TimeElapsed = StopTime - StartTime # multiplicera med ljudhastigheten (34300 cm / s) # och dividera med 2, eftersom det och bakdistansen = (TimeElapsed * 34300) / 2 retursträcka
Steg 7: Kodning av stegmotorerna
importera RPi. GPIO som GPIOimporttid importera trådning GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) control_pins = [12, 16, 20, 21] för pin i control_pins: GPIO.setup (pin, GPIO. OUT) GPIO.output (pin, 0) halfstep_seq =
Den här koden är återanvändbar för den andra stegmotorn, ställ bara in kontrollnålens nummer på deras repektiva stift och byt namn på klassen till StepperWater:
Steg 8: Kodning av LCD -skärmen
Mycket kod, men vi är nästan klara.
LCD -klassen ingår som filen LCD.py
från 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]) klass LCDWrite: def -meddelande (msg): try: print ("try") lcd.init_LCD () lcd.send_instruction (12) lcd.clear_display () lcd.write_message (msg, '1') utom: print ("fel LCDWrite")
Steg 9: Slutet
slutresultat: hur vi ritade det mot hur det slutade.
Rekommenderad:
No Pee Now, Pet Behavior Adjustment Device som stoppar katterna att kissa runt i ditt hem: 4 steg
No Pee Now, Pet Behavior Adjustment Device som stoppar katterna att kissa runt i ditt hem: Jag blev så störd av min kattunge att hon gillar att kissa på min säng, jag kollade allt hon behöver och jag tog henne också till veterinären. Efter att jag felsökte allt jag kan tänka mig och lyssna på läkarens ord inser jag att hon bara har ett dåligt beteende. Så th
Pet Food Dispenser: 3 steg
Pet Food Dispenser: Para los amantes de mascotas, este es un proyecto que les puede ser muy útil! En automatik som kan tillåtas att observera att det är möjligt att göra det, och att det är nödvändigt att skapa en bot.Un mecanismo sencillo que podrás armar desde tu
Tinyduino LoRa Based Pet Tracker: 7 steg
Tinyduino LoRa Based Pet Tracker: Vem vill inte ha husdjur ?? De furiga vännerna kan fylla dig med kärlek och lycka, men smärtan av att sakna dem är förödande. Vår familj hade en katt som heter Thor (bilden ovan) och han var en äventyrsälskande vandrare. Många gånger återvände han
Leo: Pet Cat: 7 steg (med bilder)
Leo: Pet Cat: Hej, Detta är mina första instruktioner. Den första versionen av " Sony Aibo Robot (1999) " lockade mig mot robotik vid fyra års ålder, sedan dess var det min dröm att göra en sällskapsrobot åt mig. Så jag kom på " Leo: the Pet Cat " w
SmartPET - Smart Pet Feeder: 7 steg (med bilder)
SmartPET - Smart Pet Feeder: Hej! Jag är Maxime Vermeeren, en 18 år gammal MCT-student (Multimedia och kommunikationsteknik) på Howest. Jag har valt att skapa en smart husdjursmatare som mitt projekt. Varför gjorde jag det här? Min katt har några viktproblem, så jag bestämde mig för att göra en maskin