
Innehållsförteckning:
2025 Författare: John Day | [email protected]. Senast ändrad: 2025-01-23 15:10

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:
Automatisk handdesinfektion: 8 steg

Automatisk handdesinfektion: COVID-19-pandemin har blivit något som allmänheten har hört mycket ofta under 2020. Varje medborgare som hör ordet "COVID-19" kommer omedelbart att tänka på ordet "Farligt", "Dödligt", "Håll rent”Och andra ord. Denna COVID-19 har också
DIY automatisk handdesinfektionsdispenser: 6 steg

DIY automatisk handdesinfektionsdispenser: I detta projekt kommer vi att bygga en automatisk handdesinfektionsdispenser. Detta projekt kommer att använda Arduino, ultraljudssensor, vattenpump och handsprit. En ultraljudssensor används för att kontrollera närvaron av händer under utloppet på desinfektionsmaskinen.
Automatisk gelalkoholautomat med Esp32: 9 steg

Automatisk gelalkoholautomat med Esp32: I handledning kommer vi att se hur man gör en komplett prototyp, att montera en automatisk gelalkoeldispenser med esp32, den kommer att inkludera steg-för-steg-montering, elektronisk krets och även källkoden förklarad steg för steg steg
Automatisk hundmatare !!: 4 steg

Automatisk hundmatare !!: Lätt, hjälpsam och hälsosam
Automatisk medicindispenser: 5 steg

Automatisk medicindispenser: Detta projekt är avsett för användning inom det medicinska området, där äldre patienter måste ha ett pålitligt sätt att få medicinering portionerad och utdelad. Med denna enhet kan medicinering delas upp upp till 9 dagar i förväg och automatiskt doseras i önskad