Isi kandungan:
- Bekalan
- Langkah 1: Pendawaian
- Langkah 2: Jadikan Sel Beban Anda Boleh Digunakan
- Langkah 3: Pangkalan Data Normalisasi
- Langkah 4: Pengekodan Cell Load
- Langkah 5: Mengekodkan Sensor Air
- Langkah 6: Pengekodan Proximity Sensor
- Langkah 7: Pengekodan Motor Stepper
- Langkah 8: Mengekod LCD
- Langkah 9: Akhir
Video: PENGEDAR MAKANAN PET AUTOMATIK: 9 Langkah
2024 Pengarang: John Day | [email protected]. Diubah suai terakhir: 2024-01-30 11:07
Pernah merasa membuang masa untuk memberi makan haiwan kesayangan anda? Pernah memanggil seseorang untuk memberi makan haiwan kesayangan anda semasa anda bercuti? Saya telah berusaha menyelesaikan kedua-dua masalah ini dengan projek sekolah saya sekarang: Petfeed!
Bekalan
Raspberry Pi 3b
Sel Beban Bar (10kg)
Penguat Sel Beban HX711
Sensor Waterlevel (https://www.dfrobot.com/product-1493.html)
Sensor Kedekatan Ultrasonik
LCD 16-pin
Motor stepper 2x 28byj-48
Pemacu motor stepper 2x ULN2003
Langkah 1: Pendawaian
banyak kabel di sini. Keluarkan kabel pelompat anda dan mula memasang!
Langkah 2: Jadikan Sel Beban Anda Boleh Digunakan
untuk menggunakan sel beban, pertama kita perlu memasangkannya ke dua pinggan: piring bawah, dan piring di mana kita akan menimbang makanan kita.
Skru yang anda perlukan adalah sepasang skru M4 dengan bolt yang sepadan dan sepasang skru M5 dengan bolt yang sepadan. Saya menggunakan gerudi kecil untuk membuat lubang.
(gambar:
Langkah 3: Pangkalan Data Normalisasi
data dari sensor kami mesti disimpan dalam pangkalan data. Agar fail python tersambung ke pangkalan data: lihat di bawah.
maka anda juga memerlukan fail konfigurasi:
[connect_python] user = * yourusername * host = 127.0.0.1 #if port tempatan = 3306 password = * yourpassword * database = * yourdb * [application_config] driver = 'SQL Server'
Langkah 4: Pengekodan Cell Load
import RPi. GPIO sebagai GPIO import import threading dari hx711 import HX711 dari helpers.stepperFood import StepperFood dari pembantu. LCDWrite import LCDWrite dari repositori. DataRepository import DataRepository
Setelah mengimport semua perpustakaan kami (perhatikan, kami menggunakan Perpustakaan HX711 untuk mendorong sel memuat) kita boleh mula menulis kod sebenar kita
TARRA_CONSTANT = 80600
GRAM_CONSTANT = 101
Untuk mengetahui pemalar kami, tetapkan dahulu TARRA_CONSTANT = 0 dan GRAM_CONSTANT = 1.
Seterusnya kita perlu mengetahui nilai sel beban kita ketika tidak ada penimbangan. Nilai ini akan menjadi TARRA_CONSTANT.
Bagi GRAM_CONSTANT, ambil objek yang anda tahu beratnya (saya menggunakan sebungkus spageti), timbang dan bahagikan bacaan sel beban dengan berat sebenar objek. Bagi saya ini adalah 101.
kelas 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 = soket self.lcd = lcd
di sini kita memulakan kelas LoadCell dan memetakan pin.
def run (diri):
cubalah: while True: self.hx711.reset () # Sebelum kita mulakan, tetapkan semula HX711 (tidak wajib) mengukur_avg = jumlah (self.hx711.get_raw_data ()) / 5 weight = bulat ((Measures_avg - TARRA_CONSTANT) / GRAM_CONSTANT, 0) cetak ("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)}) cetak ("zou moeten emitten") writeWeight = "weight:" + str (db_weight) msg = "PETFEED" LCDWrite.message () if int (db_weight [: - 2]) <= 100: StepperFood.run () time.sleep (20) kecuali Pengecualian sebagai e: print ("Kesalahan penimbangan" + str (e))
Langkah 5: Mengekodkan Sensor Air
import timeimport threading dari repositori. DataRepository import DataRepository dari RPi import GPIOGPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) GPIO_Water = 18 GPIO.setup (GPIO_Water, GPIO. IN) kelas WaterSensor (threading. Thread): def _init self, socket): threading. Tread._ init _ (self) self.socket = socket self.vorige_status = 0 def run (self): cuba: sementara Benar: air = self.is_water () cetakan (air) status = air [" status "] action = water [" action "] DataRepository.insert_water (str (status), action) data_water = DataRepository.get_data_sensor (2) historyId = data_water [" SensorsHistory "] value = data_water [" nilai "] jika nilai == "0": value = "te weinig water" else: value = "genoeg water" actionTime = data_water ["actionTime"] self.socket.emit ('data_water', {"id": historyId, "value": nilai, "Time": DataRepository.serializeDateTime (actionTime), "action": action}) time.sleep (5) kecuali Exception as ex: print (ex) print ('error bij watersensor') def is_water (self): status = GPIO.input (GPIO_Wate r) jika self.vorige_status == 0 dan status == 1: print ('water gedetecteerd') sensorData = {"status": status, "action": "water gedetecteerd"} self.vorige_status = status status = GPIO.input (GPIO_Water) jika self.vorige_status == 1 dan status == 1: print ('water aanwezig') sensorData = {"status": status, "action": "water aanwezig"} status = GPIO.input (GPIO_Water) jika self.vorige_status == 1 dan status == 0: print ('water weg') sensorData = {"status": status, "action": "water weg"} self.vorige_status = status status = GPIO.input (GPIO_Water) if self.vorige_status == 0 dan status == 0: print ('startpositie') status = GPIO.input (GPIO_Water) sensorData = {"status": status, "action": "startpositie"} sensor kembaliData
Langkah 6: Pengekodan Proximity Sensor
import timeimport threading dari repositori. DataRepository import DataRepository dari 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_Echo, GPIO_Echo. IN) def current_milli_time (): return int (round (time.time () * 1000)) kelas UltrasonicSensor (threading. Thread): def _init _ (self, socket): threading. Tread._ init _ (diri) self.socket = socket def run (self): try: last_reading = 0 interval = 5000 while True: if current_milli_time ()> last_reading + interval: dist = self.distance () cetak ("Jarak Terukur =%.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 () kecuali Pengecualian sebagai ex: print (ex) de f jarak (diri): # set Trigger to HIGH GPIO.output (GPIO_Trig, True) # set Trigger selepas 0.01ms ke LOW time.sleep (0.00001) GPIO.output (GPIO_Trig, False) StartTime = time.time () StopTime = time.time () # save StartTime while GPIO.input (GPIO_Echo) == 0: StartTime = time.time () # jimat masa ketibaan sementara GPIO.input (GPIO_Echo) == 1: StopTime = time.time () # perbezaan masa antara permulaan dan ketibaan TimeElapsed = StopTime - StartTime # darab dengan kelajuan sonik (34300 cm / s) # dan bahagikan dengan 2, kerana jarak di sana dan belakang = (TimeElapsed * 34300) / 2 jarak kembali
Langkah 7: Pengekodan Motor Stepper
import RPi. GPIO sebagai GPIO import import threading GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) control_pins = [12, 16, 20, 21] untuk pin in control_pins: GPIO.setup (pin, GPIO. OUT) GPIO.output (pin, 0) halfstep_seq =
Kod ini boleh digunakan semula untuk motor stepper yang lain, cukup tetapkan nombor pin kawalan ke pin repective mereka dan ubah nama kelas menjadi StepperWater:
Langkah 8: Mengekod LCD
Banyak kod, tetapi kami hampir selesai.
Kelas LCD disertakan sebagai fail LCD.py
dari pembantu. 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]) kelas LCDWrite: def message (msg): try: print ("try") lcd.init_LCD () lcd.send_instruction (12) lcd.clear_display () lcd.write_message (msg, '1') kecuali: cetak ("ralat LCDWrite")
Langkah 9: Akhir
hasil akhir: bagaimana kita membuatnya berbanding bagaimana akhirnya.
Disyorkan:
Projek Mangkuk Makanan Makanan Automatik: 13 Langkah
Projek Pet-Makanan Mangkuk Automatik: Instruksional ini akan menggambarkan dan menerangkan bagaimana membina makanan haiwan peliharaan yang boleh diprogramkan secara automatik dengan mangkuk makanan yang dilampirkan. Saya telah melampirkan video di sini yang menggambarkan bagaimana fungsi produk dan bagaimana rupanya
Pengedar Kad Automatik: 7 Langkah
Pengedar Kad Automatik: Saya telah memilih pengedar kad pintar sebagai projek pertama saya kerana saya suka bermain kad permainan. Perkara yang paling saya tidak gemari adalah kad berniaga. Anda harus ingat untuk setiap permainan berapa banyak kad yang diperoleh setiap orang. Itu membingungkan apabila anda tahu
Dispenser Makanan Kucing Automatik: 7 Langkah (dengan Gambar)
Dispenser Makanan Kucing Automatik: Sekiranya anda tidak mengawal jumlah makanan yang dimakan kucing anda ini boleh menyebabkan masalah makan berlebihan dan berat badan berlebihan. Perkara ini berlaku terutamanya jika anda jauh dari rumah dan meninggalkan makanan tambahan untuk dimakan oleh kucing mengikut jadualnya sendiri. Pada masa lain anda mungkin
PENGEDAR Pil AUTOMATIK: 14 Langkah (dengan Gambar)
AUTOMATIC PILL DISPENSER: Ini adalah robot dispenser pil yang dapat memberi pesakit jumlah dan jenis pil ubat yang betul. Dosis pil dilakukan secara automatik pada waktu yang tepat sepanjang hari, didahului dengan penggera. Apabila kosong, mesin dengan mudah diisi semula
Catapult Automatik untuk Melemparkan Makanan Haiwan Peliharaan (anjing, Kucing, Ayam, dll), Baling Baling dan Banyak Lagi !: 4 Langkah (dengan Gambar)
Catapult Automatik untuk Melemparkan Makanan Haiwan Peliharaan (anjing, Kucing, Ayam, dll), Bola Baling dan Banyak Lagi!: Halo dan selamat datang di Instructable pertama saya! Anjing kami MENYUKAI makanannya, dia akan memakan semuanya dalam beberapa saat. Saya telah merancang cara untuk melambatkannya, dari bola dengan makanan di dalam hingga membuangnya ke halaman belakang. Hebatnya, dia