İçindekiler:
- Gereçler
- Adım 1: Kablolama
- Adım 2: Yük Hücrenizi Kullanılabilir Hale Getirin
- Adım 3: Normalleştirilmiş Veritabanı
- Adım 4: Yük Hücresinin Kodlanması
- Adım 5: Su Sensörünün Kodlanması
- Adım 6: Yakınlık Sensörünün Kodlanması
- Adım 7: Step Motorların Kodlanması
- Adım 8: LCD'yi Kodlama
- 9. Adım: Son
Video: OTOMATİK PET GIDA DAĞITICI: 9 Adım
2024 Yazar: John Day | [email protected]. Son düzenleme: 2024-01-30 13:17
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
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ü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ı
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
nihai sonuç: nasıl çizdiğimiz vs. nasıl sonuçlandı.
Önerilen:
Otomatik El Dezenfektanı: 8 Adım
Otomatik El Dezenfektanı: COVID-19 pandemisi, 2020 yılında halkın çok sık duyduğu bir şey haline geldi. “COVID-19” kelimesini duyan her vatandaşın aklına hemen “Tehlikeli”, “Ölümcül”, “Temiz Tut” kelimeleri gelecektir.” ve diğer kelimeler. Bu COVID-19 aynı zamanda
Otomatik Pet-Mama Kasesi Projesi: 13 Adım
Otomatik Evcil Hayvan Mama Kasesi Projesi: Bu talimat, ekli yemek kaseleri ile otomatik, programlanabilir bir evcil hayvan besleyicinin nasıl oluşturulacağını tasvir edecek ve açıklayacaktır. Ürünlerin nasıl çalıştığını ve neye benzediğini gösteren videoyu buraya ekledim
WiFi Otomatik Rezervuarlı Bitki Besleyici - İç/Dış Yetiştirme Kurulumu - Uzaktan İzleme ile Otomatik Su Tesisleri: 21 Adım
Rezervuarlı WiFi Otomatik Bitki Besleyici - İç/Dış Mekan Yetiştirme Kurulumu - Uzaktan İzleme ile Otomatik Su Tesisleri: Bu eğitimde, bitkileri otomatik olarak sulayan ve Adosia platformu kullanılarak uzaktan izlenebilen özel bir iç/dış bitki besleme sisteminin nasıl kurulacağını göstereceğiz
OTOMATİK HAP DAĞITICI: 14 Adım (Resimli)
OTOMATİK HAP DAĞITICI: Bu, hastaya doğru miktarda ve türde ilaç hapı verebilen bir hap dağıtma robotudur. Hapın dozajı, bir alarmdan önce günün doğru saatinde otomatik olarak gerçekleştirilir. Boş olduğunda, makine kolayca yeniden doldurulur
Usb Füze Fırlatıcınızı "Otomatik Hedefleyen Otomatik Taret!" Olarak Hackleyin: 6 Adım
Usb Füze Fırlatıcınızı "Otomatik Hedefleyen Otomatik Taret!" Olarak Hackleyin: Usb füze fırlatıcınızın kendi kendine nişan almasını nasıl sağlarsınız. Bu talimat, size usb füze fırlatıcınızı IR hedeflerini bulup nişan alacak bir otomatik taret içinde çevirmeyi öğretecektir. (üzgünüm sadece IR hedefleri)