Daftar Isi:

DISPENSER MAKANAN PET OTOMATIS: 9 Langkah
DISPENSER MAKANAN PET OTOMATIS: 9 Langkah

Video: DISPENSER MAKANAN PET OTOMATIS: 9 Langkah

Video: DISPENSER MAKANAN PET OTOMATIS: 9 Langkah
Video: Ekstro Smart Pet Feeder - Wifi Dispenser Makan Otomatis Anjing Kucing 2024, Juni
Anonim
DISPENSER MAKANAN PET OTOMATIS
DISPENSER MAKANAN PET OTOMATIS

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

Pengkabelan
Pengkabelan
Pengkabelan
Pengkabelan

banyak kabel di sini. Keluarkan kabel jumper Anda dan mulailah menyematkan!

Langkah 2: Jadikan Load Cell Anda Dapat Digunakan

Jadikan Sel Beban Anda Dapat Digunakan
Jadikan Sel Beban 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

Basis Data yang Dinormalisasi
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

Tamat
Tamat
Tamat
Tamat

hasil akhir: bagaimana kami menggambarnya vs. bagaimana akhirnya.

Direkomendasikan: