ዝርዝር ሁኔታ:

አውቶማቲክ የቤት እንስሳት ምግብ አከፋፋይ: 9 ደረጃዎች
አውቶማቲክ የቤት እንስሳት ምግብ አከፋፋይ: 9 ደረጃዎች

ቪዲዮ: አውቶማቲክ የቤት እንስሳት ምግብ አከፋፋይ: 9 ደረጃዎች

ቪዲዮ: አውቶማቲክ የቤት እንስሳት ምግብ አከፋፋይ: 9 ደረጃዎች
ቪዲዮ: ከወሲብ በፊት ይህን ከጠጣህ አለቀላት ! | ማለቂያ ለሌለው የወሲብ ብቃት | 2024, ሰኔ
Anonim
አውቶማቲክ የቤት እንስሳት ምግብ አቅራቢ
አውቶማቲክ የቤት እንስሳት ምግብ አቅራቢ

የቤት እንስሳዎን ለመመገብ በጣም ብዙ ጊዜ እንዳጠፋ ተሰምቶዎት ያውቃል? በበዓል ላይ ሳሉ የቤት እንስሳትዎን እንዲመግብ አንድ ሰው መደወል ነበረበት? አሁን ባለው የትምህርት ቤት ፕሮጀክት ሁለቱንም ጉዳዮች ለማስተካከል ሞክሬያለሁ - ፔትፌድ!

አቅርቦቶች

Raspberry Pi 3b

የባር ጫን ህዋስ (10 ኪ.

HX711 የጭነት ሕዋስ ማጉያ

የ Waterlevel ዳሳሽ (https://www.dfrobot.com/product-1493.html)

ለአልትራሳውንድ ቅርበት ዳሳሽ

ኤልሲዲ 16-ፒኖች

2x stepper ሞተር 28byj-48

2x stepper ሞተር ሾፌር ULN2003

ደረጃ 1 - ሽቦ

ሽቦ
ሽቦ
ሽቦ
ሽቦ

ብዙ ኬብሎች እዚህ። የጃምፐር ገመዶችዎን ያውጡ እና መሰካት ይጀምሩ!

ደረጃ 2 የጭነት ህዋስዎን እንዲጠቀሙበት ያድርጉ

ጭነትዎ ህዋስ እንዲጠቀም ያድርጉ
ጭነትዎ ህዋስ እንዲጠቀም ያድርጉ

የጭነት ማስቀመጫውን ለመጠቀም በመጀመሪያ ከሁለት ሳህኖች ጋር ማያያዝ አለብን -የታችኛው ሳህን እና ምግባችንን የምንመዝንበት ሳህን።

የሚፈልጓቸው ብሎኖች የሚጣጣሙ ብሎኖች ያሉት የ M4 ጥንድ ጥንድ እና ከተገጣጠሙ ብሎኖች ጋር የ M5 ጥንድ ጥንድ ናቸው። ቀዳዳዎቹን ለመሥራት ትንሽ ቁፋሮ እጠቀም ነበር።

(ፎቶ

ደረጃ 3 - መደበኛ የውሂብ ጎታ

መደበኛ የውሂብ ጎታ
መደበኛ የውሂብ ጎታ

የእኛ ዳሳሾች መረጃ በውሂብ ጎታ ውስጥ መቀመጥ አለበት። የፓይዘን ፋይሎች ከመረጃ ቋቱ ጋር እንዲገናኙ ከዚህ በታች ይመልከቱ።

ከዚያ የውቅረት ፋይል ያስፈልግዎታል

[connector_python] ተጠቃሚ = * የተጠቃሚ ስምዎ * አስተናጋጅ = 127.0.0.1 #if local port = 3306 password = * yourpassword * database = * yourdb * [application_config] driver = 'SQL Server'

ደረጃ 4 የጭነት ህዋስ ኮድ መስጠት

RPi.

ሁሉንም ቤተመፃህፍቶቻችንን ካስመጣን በኋላ (ማስታወሻ ፣ የጭነት ሴሉን ለማሽከርከር የ HX711 ቤተ -መጽሐፍትን እየተጠቀምን ነው) የእኛን ትክክለኛ ኮድ መጻፍ መጀመር እንችላለን።

TARRA_CONSTANT = 80600

GRAM_CONSTANT = 101

የእኛን ቋሚዎች ለማወቅ በመጀመሪያ TARRA_CONSTANT = 0 እና GRAM_CONSTANT = 1 ን ያዘጋጁ።

ቀጥሎ ምንም የሚዛን ነገር በማይኖርበት ጊዜ የእኛ የጭነት ሴል የሚያነብበትን ዋጋ ማወቅ አለብን። ይህ እሴት TARRA_CONSTANT ይሆናል።

ስለ GRAM_CONSTANT ፣ ክብደቱን የሚያውቁትን ነገር በቀላሉ ይውሰዱ (እኔ የስፓጌቲ ጥቅል ተጠቅሜያለሁ) ፣ ክብደቱን እና የጭነቱን ሕዋስ ንባቡን ከእቃው ትክክለኛ ክብደት ጋር ይከፋፍሉ። ለእኔ ይህ 101 ነበር።

ክፍል LoadCell (threading. Thread):

def _init _ (ራስን ፣ ሶኬት ፣ ኤልሲዲ) - ክር መዘርጋት።. = lcd

እዚህ የ LoadCell ክፍልን እናስጀምራለን እና ፒኖቹን እናሳያለን።

def run (ራስን):

ሞክር: ሳለ እውነት ነው። 0) ህትመት ("ክብደት ፦ {0}" ["actionTime"] self.socket.emit ('data_weight', {"id": historyId, "Weight": db_weight, "Time": DataRepository.serializeDateTime (actionTime)}) print ("zou moeten emitten") writeWeight = "ክብደት:" + str (db_weight) msg = "PETFEED" LCDWrite.message () int (db_weight [:-2]) <= 100: StepperFood.run () time.sleep (20) Exception as e: print ("በመመዘን ላይ ስህተት" + str (ሠ))

ደረጃ 5 የውሃ ዳሳሹን ኮድ መስጠት

ከውጪ ማከማቻዎች የጊዜ ማስመጣት ክር። የውሂብ ማከማቻ የውሂብ ማከማቻ ከ RPi ማስመጣት GPIOGPIO.setmode (GPIO. BCM) GPIO.setwarnings (ሐሰት) GPIO_Water = 18 GPIO.setup (GPIO_Water ፣ GPIO. IN) ክፍል WaterSensor (threading. ራስን ፣ ሶኬት) ፦ ክር ።. ሁኔታ "] እርምጃ = ውሃ [" እርምጃ "] DataRepository.insert_water (str (status) ፣ action) data_water = DataRepository.get_data_sensor (2) historyId = data_water [" SensorsHistory "] value = data_water [" value "] value == "0": እሴት = "te weinig water" ሌላ: እሴት = "genoeg water" actionTime = data_water ["actionTime"] self.socket.emit ('data_water', {"id": historyId, "value": value, "ጊዜ" ፦ DataRepository.serializeDateTime (actionTime) ፣ "action": action}) time.sleep (5) Exception from ex በስተቀር: print (ex) print ('error bij watersensor') def is_water (self): status = GPIO. ግቤት (GPIO_Wate r) self.vorige_status == 0 እና ሁኔታ == 1: ህትመት ('የውሃ ጌዴቴክትደር') sensorData = {"status": status, "action": "water gedetecteerd"} self.vorige_status = status status = GPIO.input (GPIO_Water) ከሆነ ራስን self. self.vorige_status == 0 እና ሁኔታ == 0: ማተም ('startpositie') status = GPIO.input (GPIO_Water) sensorData = {"status": status, "action": "startpositie"} return sensorData

ደረጃ 6: የአቅራቢያ ዳሳሽ ኮድ መስጠት

ከውጪ ማከማቻዎች የጊዜ ማስመጣት ክር። የውሂብ ማከማቻ የውሂብ ማከማቻ ከ RPi ማስመጣት GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (ሐሰት) GPIO_Trig = 4 GPIO_Echo = 17 GPIO.setup (GPIO_Trig ፣ GPIO. OUT). IN) def current_milli_time (): int 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: 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 ["እሴት"] actionTime = data_prox ["actionTime"] self.socket.emit ('data_proximity', {"id", {"id"): historyId ፣ “ቅርበት”: ፕሮክስ ፣ “ጊዜ”: DataRepository.serializeDateTime (actionTime)}) last_reading = current_milli_time () Exception from ex: print (ex) de f ርቀት (ራስ): # አዘጋጅ ቀስቅሴ ወደ ከፍተኛ GPIO.output (GPIO_Trig ፣ True) # ከ 0.01ms በኋላ ወደ ዝቅተኛ ጊዜ እንቅልፍ (0.00001) GPIO.output (GPIO_Trig ፣ ሐሰት) StartTime = time.time () StopTime = ጊዜ። በመነሻ እና በመድረሻ መካከል ያለው የጊዜ ልዩነት TimeElapsed = StopTime - StartTime # በ sonic ፍጥነት (34300 ሴ.ሜ / ሰ) # በማባዛት በ 2 ይካፈሉ ፣ ምክንያቱም እዚያ እና የኋላ ርቀት = (TimeElapsed * 34300) / 2 የመመለሻ ርቀት

ደረጃ 7 Stepper Motors ን ኮድ ማድረግ

RPi. GPIO ን እንደ GPIO ያስመጡ የጊዜ ማስመጣት ክር GPIO.setmode (GPIO. BCM) GPIO.setwarnings (ሐሰት) control_pins = [12, 16, 20, 21] ለፒን በቁጥጥር_ፒን ውስጥ: GPIO.setup (pin, GPIO. OUT) GPIO.ውጤት (ፒን ፣ 0) halfstep_seq =

ይህ ኮድ ለሌላኛው የእንፋሎት ሞተር እንደገና ጥቅም ላይ ሊውል ይችላል ፣ የቁጥጥር ፒን ቁጥሮችን ወደሚመለከታቸው ፒኖቻቸው ያዘጋጁ እና ክፍሉን ወደ StepperWater እንደገና ይሰይሙ-

ደረጃ 8: ኤልሲዲውን ኮድ ማድረግ

ብዙ ኮድ ፣ ግን ጨርሰናል ማለት ይቻላል።

የ LCD ክፍል እንደ ፋይል LCD.py ተካትቷል

ከረዳቶች. 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]) ክፍል ኤልሲዲ ይፃፉ: def መልእክት (msg): ይሞክሩ: ማተም ("ሞክር") lcd.init_LCD () lcd.send_instruction (12) lcd.clear_display () lcd.write_message (msg, '1') በስተቀር: ማተም ("ስህተት LCDWrite")

ደረጃ 9: መጨረሻው

መጨረሻ
መጨረሻ
መጨረሻ
መጨረሻ

የመጨረሻ ውጤት እኛ እንዴት እንደሳበነው እና እንዴት እንደ ተጠናቀቀ።

የሚመከር: