Daftar Isi:
- Perlengkapan
- Langkah 1: Pengkabelan
- Langkah 2: Jadikan Load Cell Anda Dapat Digunakan
- Langkah 3: Basis Data yang Dinormalisasi
- Langkah 4: Mengkodekan Load Cell
- Langkah 5: Mengkodekan Sensor Air
- Langkah 6: Mengkodekan Sensor Kedekatan
- Langkah 7: Mengkode Motor Stepper
- Langkah 8: Mengkode LCD
- Langkah 9: Akhir
Video: DISPENSER MAKANAN PET OTOMATIS: 9 Langkah
2024 Pengarang: John Day | [email protected]. Terakhir diubah: 2024-01-30 09:54
Pernah merasa ingin membuang waktu terlalu banyak untuk memberi makan hewan peliharaan Anda? Pernah harus menelepon seseorang untuk memberi makan hewan peliharaan Anda saat Anda sedang berlibur? Saya telah mencoba memperbaiki kedua masalah ini dengan proyek sekolah saya saat ini: Petfeed!
Perlengkapan
Raspberry Pi 3b
Sel Beban Batang (10kg)
Penguat Sel Beban HX711
Sensor Ketinggian Air (https://www.dfrobot.com/product-1493.html)
Sensor Kedekatan Ultrasonik
LCD 16-pin
2x motor stepper 28byj-48
2x driver motor stepper ULN2003
Langkah 1: Pengkabelan
banyak kabel di sini. Keluarkan kabel jumper Anda dan mulailah menyematkan!
Langkah 2: Jadikan Load Cell Anda Dapat Digunakan
untuk menggunakan sel beban, pertama-tama kita harus menempelkannya ke dua piring: piring bawah, dan piring tempat kita akan menimbang makanan kita.
Sekrup yang Anda butuhkan adalah sepasang sekrup M4 dengan baut yang cocok dan sepasang sekrup M5 dengan baut yang cocok. Saya menggunakan bor kecil untuk membuat lubang.
(foto:
Langkah 3: Basis Data yang Dinormalisasi
data dari sensor kami harus disimpan dalam database. Agar file python terhubung ke database: lihat di bawah.
maka Anda juga memerlukan file konfigurasi:
[connector_python]user = *yourusername* host = 127.0.0.1 #if local port = 3306 password = *yourpassword* database = *yourdb* [application_config] driver = 'SQL Server'
Langkah 4: Mengkodekan Load Cell
impor RPi. GPIO sebagai GPIOimport threading waktu impor dari hx711 impor HX711 dari helpers.stepperFood impor StepperFood dari helpers. LCDWrite impor LCDWrite dari repositories. DataRepository impor DataRepository
Setelah mengimpor semua perpustakaan kami (perhatikan, kami menggunakan Perpustakaan HX711 untuk menggerakkan sel beban) kami dapat mulai menulis kode kami yang sebenarnya
TARRA_CONSTANT = 80600
GRAM_CONSTANT = 101
Untuk mengetahui konstanta kita, pertama atur TARRA_CONSTANT = 0 dan GRAM_CONSTANT = 1.
Selanjutnya kita perlu mencari tahu nilai yang dibaca sel beban kita ketika tidak ada yang ditimbang. Nilai ini akan menjadi TARRA_CONSTANT.
Adapun GRAM_CONSTANT, cukup ambil objek yang Anda tahu beratnya (saya menggunakan sebungkus spageti), timbang dan bagi pembacaan sel beban dengan berat objek yang sebenarnya. 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 = socket self.lcd = lcd
di sini kita menginisialisasi kelas LoadCell dan memetakan pin.
def run (sendiri):
try: while True: self.hx711.reset() # Sebelum kita mulai, reset HX711 (tidak wajib) 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("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 dengan penimbangan" + str(e))
Langkah 5: Mengkodekan Sensor Air
import timeimport threading dari repositories. DataRepository import DataRepository dari RPi import GPIOGPIO.setmode(GPIO. BCM) GPIO.setwarnings(False) GPIO_Water = 18 GPIO.setup(GPIO_Water, GPIO. IN) class WaterSensor(threading. Thread): def_(_init_ 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 = air["action"] DataRepository.insert_water(str(status), action) data_water = DataRepository.get_data_sensor(2) historyId = data_water["SensorsHistory"] value = data_water["value"] jika nilai == "0": value = "te weinig water" else: value = "genoeg water" actionTime = data_water["actionTime"] self.socket.emit('data_water', { "id": historyId, "value": value, "Waktu": DataRepository.serializeDateTime(actionTime), "action": action}) time.sleep(5) kecuali Pengecualian sebagai contoh: 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) if self.vorige_status == 1 dan status == 1: print('water aanwezig') sensorData = {"status": status, "action": "water aanwezig"} status = GPIO.input(GPIO_Water) if 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) jika self.vorige_status == 0 dan status == 0: print('startpositie') status = GPIO.input(GPIO_Water) sensorData = {"status": status, "action": "startpositie"} mengembalikan sensorData
Langkah 6: Mengkodekan Sensor Kedekatan
impor waktuimport thread dari repositori. DataRepository impor DataRepository dari RPi impor GPIO GPIO.setmode(GPIO. BCM) GPIO.setwarnings(False) GPIO_Trig = 4 GPIO_Echo = 17 GPIO.setup(GPIO_Trig, GPIO. OUT) GPIO_Echo, GPIO_Echo. 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() kecuali Pengecualian sebagai ex: print(ex) de f distance(self): # set Trigger ke HIGH GPIO.output(GPIO_Trig, True) # set Trigger setelah 0,01ms ke LOW time.sleep(0,00001) GPIO.output(GPIO_Trig, False) StartTime = time.time() StopTime = time.time() # simpan StartTime saat GPIO.input(GPIO_Echo) == 0: StartTime = time.time() # simpan waktu kedatangan saat GPIO.input(GPIO_Echo) == 1: StopTime = time.time() # perbedaan waktu antara mulai dan tiba TimeElapsed = StopTime - StartTime # kalikan dengan kecepatan sonik (34300 cm/s) # dan bagi dengan 2, karena jarak sana dan kembali = (TimeElapsed * 34300) / 2 jarak kembali
Langkah 7: Mengkode Motor Stepper
import RPi. GPIO sebagai GPIOimport time import threading GPIO.setmode(GPIO. BCM) GPIO.setwarnings(False) control_pins = [12, 16, 20, 21] untuk pin di control_pins: GPIO.setup(pin, GPIO. OUT) GPIO.output(pin, 0) halfstep_seq =
Kode ini dapat digunakan kembali untuk motor stepper lainnya, cukup atur nomor pin kontrol ke pin masing-masing dan ganti nama kelas menjadi StepperWater:
Langkah 8: Mengkode LCD
Banyak kode, tapi kita hampir selesai.
Kelas LCD disertakan sebagai file LCD.py
dari helpers. LCD impor 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 LCDTulis: def pesan(msg): coba: print("coba") lcd.init_LCD() lcd.send_instruction(12) lcd.clear_display() lcd.write_message(msg, '1') kecuali: print("LCDWrite salah")
Langkah 9: Akhir
hasil akhir: bagaimana kami menggambarnya vs. bagaimana akhirnya.
Direkomendasikan:
Proyek Mangkuk Makanan Hewan Peliharaan Otomatis: 13 Langkah
Proyek Mangkuk Makanan Hewan Peliharaan Otomatis: Instruksi ini akan menggambarkan dan menjelaskan cara membuat pengumpan hewan peliharaan otomatis yang dapat diprogram dengan mangkuk makanan yang terpasang. Saya telah melampirkan video di sini yang menggambarkan bagaimana fungsi produk dan seperti apa tampilannya
Dispenser Makanan Hewan Peliharaan: 3 Langkah
Dispenser Makanan Hewan: Para los amantes de mascotas, este es un proyecto que les puede ser muy til! Un alimentador automático que te permite observar cual es el pesaje de la comida, y solo es necesario que oprimas un botón.Un mecanismo sencillo que podrás armar desde tu
Proyek Arduino: Dispenser Makanan Kucing: 6 Langkah
Proyek Arduino: Dispenser Makanan Kucing: Instruksi ini dibuat untuk memenuhi persyaratan proyek Makecourse di University of South Florida (www.makecourse.com)
Ketapel Otomatis untuk Melempar Makanan Hewan (Anjing, Kucing, Ayam, Dll), Melempar Bola dan Lainnya!: 4 Langkah (dengan Gambar)
Ketapel Otomatis untuk Melempar Makanan Hewan Peliharaan (Anjing, Kucing, Ayam, Dll), Melempar Bola, dan Lainnya!: Halo dan selamat datang di Instructable pertama saya! Anjing kami MENCINTAI makanannya, dia akan benar-benar memakan semuanya dalam hitungan detik. Saya telah menemukan cara untuk memperlambat ini, dari bola dengan makanan di dalamnya hingga melemparkannya ke seluruh halaman belakang. Hebatnya, dia
Dispenser Makanan Anjing Bertenaga Arduino: 10 Langkah (dengan Gambar)
Dispenser Makanan Anjing Bertenaga Arduino: Jika rumah Anda seperti rumah saya, beberapa tugas mungkin terlupakan saat terburu-buru. Jangan biarkan hewan peliharaan Anda yang terlupakan! Dispenser makanan anjing otomatis ini menggunakan Arduino untuk mengirimkan jumlah kibble yang tepat pada waktu yang tepat. Semua pa