İçindekiler:

OTOMATİK PET GIDA DAĞITICI: 9 Adım
OTOMATİK PET GIDA DAĞITICI: 9 Adım

Video: OTOMATİK PET GIDA DAĞITICI: 9 Adım

Video: OTOMATİK PET GIDA DAĞITICI: 9 Adım
Video: #ortaklik 360 derece donen 6 li bakliyat organizeri 2024, Kasım
Anonim
OTOMATİK PET GIDA DAĞITICI
OTOMATİK PET GIDA DAĞITICI

Hiç evcil hayvanınızı beslemek için çok fazla zaman harcamak gibi hissettiniz mi? Tatildeyken evcil hayvanlarınızı beslemek için birini aramak zorunda kaldınız mı? Şu anki okul projemle bu iki sorunu da düzeltmeye çalıştım: Petfeed!

Gereçler

Ahududu Pi 3b

Çubuk Yük Hücresi (10kg)

HX711 Yük Hücresi Amplifikatörü

Su Seviyesi Sensörü (https://www.dfrobot.com/product-1493.html)

Ultrasonik Yakınlık Sensörü

LCD 16 pimli

2x step motor 28byj-48

2x step motor sürücüsü ULN2003

Adım 1: Kablolama

kablolama
kablolama
kablolama
kablolama

Burada bir sürü kablolama var. Jumper kablolarınızı çıkarın ve sabitlemeye başlayın!

Adım 2: Yük Hücrenizi Kullanılabilir Hale Getirin

Yük Hücrenizi Kullanılabilir Hale Getirin
Yük Hücrenizi Kullanılabilir Hale Getirin

yük hücresini kullanabilmek için önce onu iki tabağa bağlamamız gerekiyor: bir alt tabla ve üzerine yiyeceğimizi tartacağımız bir tabağa.

İhtiyacınız olan vidalar, eşleşen cıvatalara sahip bir çift M4 vida ve eşleşen cıvatalara sahip bir çift M5 vidadır. Delikleri yapmak için küçük bir matkap kullandım.

(resim:

Adım 3: Normalleştirilmiş Veritabanı

Normalleştirilmiş Veritabanı
Normalleştirilmiş Veritabanı

sensörlerimizden gelen veriler bir veritabanına kaydedilmelidir. Python dosyalarının veritabanına bağlanması için: aşağıya bakın.

o zaman bir yapılandırma dosyasına da ihtiyacınız var:

[connector_python]user = *kullanıcıadınız* ana bilgisayar = 127.0.0.1 #if yerel bağlantı noktası = 3306 parola = *parolanız* veritabanı = *yourdb* [application_config] sürücü = 'SQL Sunucusu'

Adım 4: Yük Hücresinin Kodlanması

RPi. GPIO'yu GPIO olarak içe aktar İş parçacığı oluşturmayı hx711'den içe aktar

Tüm kitaplıklarımızı içe aktardıktan sonra (not, yük hücresini sürmek için HX711 Kitaplığını kullanıyoruz) gerçek kodumuzu yazmaya başlayabiliriz.

TARRA_CONSTANT = 80600

GRAM_SABİT = 101

Sabitlerimizi bulmak için önce TARRA_CONSTANT = 0 ve GRAM_CONSTANT = 1 olarak ayarlayın.

Ardından, tartılan hiçbir şey olmadığında yük hücremizin okuduğu değeri bulmamız gerekiyor. Bu değer TARRA_CONSTANT olacaktır.

GRAM_CONSTANT'a gelince, ağırlığını bildiğiniz bir nesneyi alın (bir paket spagetti kullandım), tartın ve yük hücresi okumasını nesnenin gerçek ağırlığına bölün. Benim için bu 101'di.

class LoadCell(threading. Thread):

def _init_(self, socket, lcd): threading. Thread._init_(self) self.hx711 = HX711(dout_pin=5, pd_sck_pin=6, channel='A', kazanç=64) self.socket = soket self.lcd = lcd

burada LoadCell sınıfını başlatıyoruz ve pinleri eşleştiriyoruz.

def run(self):

deneyin: while True: self.hx711.reset() # Başlamadan önce, HX711'i sıfırlayın (zorunlu değil) Measure_avg = sum(self.hx711.get_raw_data()) / 5 ağırlık = 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) e: print olarak İstisna hariç ("Tartıma hatası" + str(e))

Adım 5: Su Sensörünün Kodlanması

depolardan timeimport iş parçacığını içe aktar. DataRepository, RPi'den DataRepository'yi içe aktar GPIOGPIO.setmode(GPIO. BCM) GPIO.setwarnings(False) GPIO_Water = 18 GPIO.setup(GPIO_Water, GPIO. IN) class WaterSensor(threading._Thread):_ self, socket): threading. Thread._init_(self) self.socket = socket self.vorige_status = 0 def run(self): try: while True: su = self.is_water() print(water) status = water[" durum"] eylem = su["eylem"] DataRepository.insert_water(str(durum), eylem) data_water = DataRepository.get_data_sensor(2) historyId = data_water["SensorsHistory"] değer = data_water["değer"] if değer == "0": value = "te weinig water" else: value = "genoeg su" actionTime = data_water["actionTime"] self.socket.emit('data_water', { "id": historyId, "value": value, "Time": DataRepository.serializeDateTime(actionTime), "action": action}) time.sleep(5) İstisna dışında örn: print(ex) print('error bij watersensor') def is_water(self): status = GPIO.input(GPIO_Wate r) if self.vorige_status == 0 ve 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 ve durum == 1: print('water aanwezig') sensorData = {"status": status, "action": "water aanwezig"} status = GPIO.input(GPIO_Water) ise self.vorige_status == 1 ve durum == 0: print('water weg') sensorData = {"status": status, "action": "water weg"} self.vorige_status = status status = GPIO.input(GPIO_Water) if self.vorige_status == 0 ve durum == 0: print('startpositie') status = GPIO.input(GPIO_Water) sensorData = {"status": status, "action": "startpositie"} return sensorData

Adım 6: Yakınlık Sensörünün Kodlanması

depolardan timeimport iş parçacığını içe aktar. DataRepository, RPi'den DataRepository'yi içe aktar GPIO GPIO.setmode(GPIO. BCM) GPIO.setwarnings(False) GPIO_Trig = 4 GPIO_Echo = 17 GPIO.setup(GPIO_Trig, GPIO. OUT) GPIO_GPIO_GPIO.. 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("Ölçülen Mesafe = %.1f cm" % dist) DataRepository. insert_proximity(dist) data_prox = DataRepository.get_data_sensor(1) historyId = data_prox["SensorsHistory"] prox = data_prox["değer"] actionTime = data_prox["actionTime"] self.socket.emit('data_proximity', { "id": historyId, "Proximity": prox, "Time": DataRepository.serializeDateTime(actionTime)}) last_reading = current_milli_time() örn. İstisna hariç: print(ex) de f mesafe(kendi): # Tetikleyiciyi HIGH GPIO.output(GPIO_Trig, True) olarak ayarlayın # 0.01ms sonra Tetikleyiciyi LOW time.sleep(0.00001) olarak ayarlayın GPIO.output(GPIO_Trig, False) StartTime = time.time() StopTime = time.time() # StartTime while GPIO.input(GPIO_Echo) == 0: StartTime = time.time() # varış zamanını kaydet while GPIO.input(GPIO_Echo) == 1: StopTime = time.time() # başlangıç ve varış arasındaki zaman farkı TimeElapsed = StopTime - StartTime # sonik hız (34300 cm/s) # ile çarpın ve 2'ye bölün, çünkü orada ve geri mesafe = (TimeElapsed * 34300) / 2 dönüş mesafesi

Adım 7: Step Motorların Kodlanması

RPi. GPIO'yu GPIO olarak içe aktar zaman iş parçacığını içe aktar GPIO.setmode(GPIO. BCM) GPIO.setwarnings(False) control_pins = [12, 16, 20, 21] pin in control_pins: GPIO.setup(pin, GPIO. OUT) GPIO.output(pin, 0) halfstep_seq =

Bu kod diğer step motor için tekrar kullanılabilir, sadece kontrol pin numaralarını ilgili pinlerine ayarlayın ve sınıfı StepperWater olarak yeniden adlandırın:

Adım 8: LCD'yi Kodlama

Bir sürü kod, ama neredeyse bitirdik.

LCD sınıfı, LCD.py dosyası olarak dahil edilmiştir

helpers. LCD'den içe aktarma 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]) class LCDWrite: def mesaj(msg): deneyin: yazdır("deneyin") lcd.init_LCD() lcd.send_instruction(12) lcd.clear_display() lcd.write_message(msg, '1') hariç: print("LCDWrite hatası")

9. Adım: Son

Son
Son
Son
Son

nihai sonuç: nasıl çizdiğimiz vs. nasıl sonuçlandı.

Önerilen: