Innehållsförteckning:

AUTOMATISK PET -MATDISPENSER: 9 steg
AUTOMATISK PET -MATDISPENSER: 9 steg

Video: AUTOMATISK PET -MATDISPENSER: 9 steg

Video: AUTOMATISK PET -MATDISPENSER: 9 steg
Video: Как проверить генератор. За 3 минуты, БЕЗ ПРИБОРОВ и умений. 2024, December
Anonim
AUTOMATISK PET -MATDISPENSER
AUTOMATISK PET -MATDISPENSER

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

Kabeldragning
Kabeldragning
Kabeldragning
Kabeldragning

mycket kablar här. Ta ut dina bygelkablar och börja fästa!

Steg 2: Gör din lastcell användbar

Gör din lastcell användbar
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

Normaliserad databas
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

Slutet
Slutet
Slutet
Slutet

slutresultat: hur vi ritade det mot hur det slutade.

Rekommenderad: