विषयसूची:

स्वचालित पालतू भोजन डिस्पेंसर: 9 कदम
स्वचालित पालतू भोजन डिस्पेंसर: 9 कदम

वीडियो: स्वचालित पालतू भोजन डिस्पेंसर: 9 कदम

वीडियो: स्वचालित पालतू भोजन डिस्पेंसर: 9 कदम
वीडियो: खाने का बिल ना भरने का मुक़ाबला, कौन जीतेगा ? दिनेश हिंगू, अशोक सराफ, असरानी की लोटपोट धमाल कॉमेडी 2024, जून
Anonim
स्वचालित पालतू भोजन डिस्पेंसर
स्वचालित पालतू भोजन डिस्पेंसर

क्या आपने कभी अपने पालतू जानवरों को खिलाने में बहुत अधिक समय बर्बाद करने का मन किया है? जब आप छुट्टी पर थे तो कभी किसी को अपने पालतू जानवरों को खिलाने के लिए फोन करना पड़ा? मैंने अपने वर्तमान स्कूल प्रोजेक्ट के साथ इन दोनों मुद्दों को ठीक करने का प्रयास किया है: पेटफीड!

आपूर्ति

रास्पबेरी पाई 3बी

बार लोड सेल (10 किग्रा)

HX711 लोड सेल एम्पलीफायर

जल स्तर सेंसर (https://www.dfrobot.com/product-1493.html)

अल्ट्रासोनिक निकटता सेंसर

एलसीडी 16-पिन

2x स्टेपर मोटर 28byj-48

2x स्टेपर मोटर चालक ULN2003

चरण 1: वायरिंग

तारों
तारों
तारों
तारों

यहां बहुत सारी केबलिंग है। अपने जम्पर केबल्स को बाहर निकालें और पिन करना शुरू करें!

चरण 2: अपने लोड सेल को प्रयोग करने योग्य बनाएं

अपने लोड सेल को प्रयोग करने योग्य बनाएं
अपने लोड सेल को प्रयोग करने योग्य बनाएं

लोड सेल का उपयोग करने के लिए, हमें पहले इसे दो प्लेटों से जोड़ना होगा: एक निचली प्लेट, और एक प्लेट जिस पर हम अपना भोजन तौलेंगे।

आपको जो स्क्रू चाहिए वह मैचिंग बोल्ट के साथ M4 स्क्रू की एक जोड़ी और मैचिंग बोल्ट के साथ M5 स्क्रू की एक जोड़ी है। मैंने छेद बनाने के लिए एक छोटी सी ड्रिल का इस्तेमाल किया।

(तस्वीर:

चरण 3: सामान्यीकृत डेटाबेस

सामान्यीकृत डेटाबेस
सामान्यीकृत डेटाबेस

हमारे सेंसर के डेटा को डेटाबेस में सहेजना होता है। डेटाबेस से कनेक्ट करने के लिए अजगर फ़ाइलों के लिए: नीचे देखें।

तो आपको एक कॉन्फ़िगरेशन फ़ाइल की भी आवश्यकता है:

[connector_python] उपयोगकर्ता = *आपका उपयोगकर्ता नाम* होस्ट = १२७.०.०.१ #if स्थानीय पोर्ट = ३३०६ पासवर्ड = *आपका पासवर्ड* डेटाबेस = *yourdb* [application_config] ड्राइवर = 'एसक्यूएल सर्वर'

चरण 4: लोड सेल को कोड करना

RPI. GPIO को GPIO के रूप में आयात करें। थ्रेडिंग आयात करें hx711 से आयात समय हेल्पर्स से HX711 आयात करें। हेल्पर्स से स्टेपरफूड आयात स्टेपरफूड। LCDWrite रिपॉजिटरी से LCDWrite आयात करें। डेटा रिपोजिटरी आयात डेटा रिपोजिटरी

हमारे सभी पुस्तकालयों को आयात करने के बाद (ध्यान दें, हम लोड सेल को चलाने के लिए HX711 लाइब्रेरी का उपयोग कर रहे हैं) हम अपना वास्तविक कोड लिखना शुरू कर सकते हैं

TARRA_CONSTANT = 80600

GRAM_CONSTANT = 101

हमारे स्थिरांक ज्ञात करने के लिए, पहले TARRA_CONSTANT = 0 और GRAM_CONSTANT = 1 सेट करें।

आगे हमें यह पता लगाने की जरूरत है कि हमारा लोड सेल क्या पढ़ता है जब कुछ भी तौला नहीं जा रहा है। यह मान TARRA_CONSTANT होगा।

GRAM_CONSTANT के लिए, बस एक ऐसी वस्तु लें जिसका आप वजन जानते हैं (मैंने स्पेगेटी के एक पैकेट का उपयोग किया है), इसे तौलें और लोड सेल रीडआउट को वस्तु के वास्तविक वजन से विभाजित करें। मेरे लिए यह 101 था।

क्लास लोडसेल (थ्रेडिंग। थ्रेड):

डीईएफ़ _init_(सेल्फ, सॉकेट, एलसीडी): थ्रेडिंग। थ्रेड। = एलसीडी

यहां हम लोडसेल क्लास को इनिशियलाइज़ करते हैं और पिन को मैप करते हैं।

डीईएफ़ रन (स्वयं):

कोशिश करें: जबकि सच: self.hx711.reset() # शुरू करने से पहले, HX711 (बाध्य नहीं) उपायों को रीसेट करें। 0) प्रिंट ("वजन: {0}"। प्रारूप (वजन)) DataRepository.insert_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 = "वजन:" + str(db_weight) msg = "PETFED" LCDWrite.message() यदि int(db_weight[:-2]) <= 100: StepperFood.run() time.sleep(20) अपवाद को छोड़कर e: प्रिंट ("तोलने में त्रुटि" + str(e))

चरण 5: जल संवेदक को कोड करना

रिपॉजिटरी से आयात समय आयात थ्रेडिंग। डेटा रिपोजिटरी आरपीआई से डेटा रिपोजिटरी आयात GPIOGPIO.setmode (GPIO. BCM) GPIO.setwarnings(गलत) GPIO_Water = 18 GPIO.setup(GPIO_Water, GPIO. IN) वर्ग वाटरसेंसर (थ्रेडिंग। थ्रेड) सेल्फ, सॉकेट): थ्रेडिंग.थ्रेड._इनिट_(सेल्फ) सेल्फ.सॉकेट = सॉकेट सेल्फ.वोरिज_स्टैटस = 0 डीईएफ़ रन (सेल्फ): कोशिश करें: जबकि ट्रू: वॉटर = सेल्फ.इस_वॉटर () प्रिंट (वाटर) स्टेटस = वॉटर [" स्थिति"] क्रिया = जल ["क्रिया"] DataRepository.insert_water (str (स्थिति), क्रिया) data_water = DataRepository.get_data_sensor(2) historyId = data_water["SensorsHistory"] value = data_water["value"] यदि मान == "0": मान = "ते वेनिग वॉटर" अन्य: मान = "जीनोएग वॉटर" एक्शनटाइम = डेटा_वाटर ["एक्शनटाइम"] self.socket.emit ('data_water', { "id": historyId, "value": value, "समय": DataRepository.serializeDateTime(actionTime), "action": action}) time.sleep(5) अपवाद को छोड़कर उदा: प्रिंट (पूर्व) प्रिंट ('त्रुटि बिज वॉटरसेंसर') def is_water (स्व): स्थिति = GPIO इनपुट (GPIO_Wate.) r) यदि self.vorige_status == 0 और स्थिति == 1: प्रिंट ('वाटर gedetecteerd') sensorData = {"status": status, "action": "water gedetecteerd"} self.vorige_status = status status = GPIO.input (GPIO_Water) अगर self.vorige_status == 1 और स्थिति == 1: प्रिंट ('वाटर anwezig') sensorData = {"status": status, "action": "water aanwezig"} status = GPIO.input(GPIO_Water) अगर self.vorige_status == 1 और स्थिति == 0: प्रिंट ('वाटर वेग') सेंसरडेटा = {"स्थिति": स्थिति, "क्रिया": "वाटर वेग"} self.vorige_status = स्थिति स्थिति = GPIO.input(GPIO_Water) अगर self.vorige_status == 0 और स्थिति == 0: प्रिंट ('startpositie') स्थिति = GPIO.input (GPIO_Water) sensorData = {"स्थिति": स्थिति, "कार्रवाई": "startpositie"} वापस sensorData

चरण 6: निकटता सेंसर को कोड करना

रिपॉजिटरी से आयात समय आयात थ्रेडिंग। डेटा रिपोजिटरी आरपीआई से डेटा रिपोजिटरी आयात GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (गलत) GPIO_Trig = 4 GPIO_Echo = 17 GPIO।. IN) def current_milli_time (): रिटर्न इंट (राउंड (टाइम.टाइम () * 1000)) क्लास अल्ट्रासोनिक सेंसर (थ्रेडिंग। थ्रेड): डीईएफ़ _init_ (सेल्फ, सॉकेट): थ्रेडिंग। थ्रेड._init_ (सेल्फ) सेल्फ सॉकेट = सॉकेट डीईएफ़ रन (स्व): कोशिश करें: last_reading = 0 अंतराल = 5000 जबकि सही: यदि current_milli_time ()> last_reading + अंतराल: dist = self.distance () प्रिंट ("मापा दूरी =%। 1f सेमी"% जिला) 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, "निकटता": प्रॉक्सी, "समय": DataRepository.serializeDateTime(actionTime)}) last_reading = current_milli_time () अपवाद को छोड़कर पूर्व: प्रिंट (पूर्व) डी f दूरी (स्वयं): # ट्रिगर को उच्च GPIO.output (GPIO_Trig, True) पर सेट करें # 0.01ms के बाद कम समय के लिए ट्रिगर सेट करें। नींद (0.00001) GPIO.output (GPIO_Trig, False) StartTime = time.time () स्टॉपटाइम = time.time() # GPIO.input(GPIO_Echo) == 0: StartTime = time.time() # सेव करें जबकि GPIO.input(GPIO_Echo) == 1: स्टॉपटाइम = time.time() # आगमन का समय बचाएं। प्रारंभ और आगमन के बीच समय का अंतर समय बीत गया = स्टॉपटाइम - स्टार्टटाइम # ध्वनि गति (34300 सेमी/सेकेंड) से गुणा करें # और 2 से विभाजित करें, क्योंकि वहां और पीछे की दूरी = (समय समाप्त * 34300) / 2 वापसी दूरी

चरण 7: स्टेपर मोटर्स की कोडिंग

RPI. GPIO को GPIO के रूप में आयात करेंआयात समय आयात थ्रेडिंग GPIO.setmode(GPIO. BCM) GPIO.setwarnings(False) control_pins = [12, 16, 20, 21] पिन के लिए control_pins: GPIO.setup(pin, GPIO. OUT) GPIO.आउटपुट (पिन, 0) हाफस्टेप_सेक =

यह कोड अन्य स्टेपर मोटर के लिए पुन: प्रयोज्य है, बस कंट्रोल पिन नंबर को उनके संबंधित पिन पर सेट करें और क्लास का नाम बदलकर स्टेपरवाटर करें:

चरण 8: एलसीडी को कोड करना

बहुत सारे कोड, लेकिन हम लगभग पूरा कर चुके हैं।

LCD.py फ़ाइल के रूप में LCD वर्ग शामिल है

हेल्पर्स से।एलसीडी आयात एलसीडी

E = 26 RS = 25 D0 = 19 D1 = 13 D2 = 24 D3 = 22 D4 = 23 D5 = 8 D6 = 7 D7 = 10 LCD (E, RS, [D0, D1, D2, D3, D4, D5, D6, D7]) वर्ग LCDWrite: def संदेश (msg): कोशिश करें: Print("try") LCD.init_LCD() LCD.send_instruction(12) LCD.clear_display() LCD.write_message(msg, '1') को छोड़कर: प्रिंट ("त्रुटि LCDWrite")

चरण 9: अंत

समाप्त
समाप्त
समाप्त
समाप्त

अंतिम परिणाम: हमने इसे कैसे बनाया बनाम यह कैसे समाप्त हुआ।

सिफारिश की: