Isi kandungan:

PENGEDAR MAKANAN PET AUTOMATIK: 9 Langkah
PENGEDAR MAKANAN PET AUTOMATIK: 9 Langkah

Video: PENGEDAR MAKANAN PET AUTOMATIK: 9 Langkah

Video: PENGEDAR MAKANAN PET AUTOMATIK: 9 Langkah
Video: Apakah Takaran Makan Kucing Kamu Udah Sesuai? #shorts 2024, November
Anonim
PENGEDAR MAKANAN PET AUTOMATIK
PENGEDAR MAKANAN PET AUTOMATIK

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

Pendawaian
Pendawaian
Pendawaian
Pendawaian

banyak kabel di sini. Keluarkan kabel pelompat anda dan mula memasang!

Langkah 2: Jadikan Sel Beban Anda Boleh Digunakan

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

Pangkalan Data Dinormalisasi
Pangkalan Data Dinormalisasi

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

Tamat
Tamat
Tamat
Tamat

hasil akhir: bagaimana kita membuatnya berbanding bagaimana akhirnya.

Disyorkan: