İçindekiler:
- Gereçler
- Adım 1: Ekipmanı Seçme
- Adım 2: Sistemi Tasarlamak
- 3. Adım: Acil Durumların Ele Alınması
- Adım 4: Sistemi 7/24 Çalıştırmak
- Adım 5: Bulut İzleme
- 6. Adım: Çalışıyor
Video: Raspberry Pi & HC-SR04 Ultrasonik Sensör ve Cloud4RPi Tarafından Kontrol Edilen Akıllı Kahve Makinesi Pompası: 6 Adım
2024 Yazar: John Day | [email protected]. Son düzenleme: 2024-01-30 13:18
Teorik olarak, sabah fincanınız için kahve makinesine her gittiğinizde, su tankını doldurmanız için yalnızca yirmide bir şansınız vardır. Ancak pratikte, makine bir şekilde bu işi her zaman size yüklemenin bir yolunu buluyor gibi görünüyor. Kahveyi ne kadar çok isterseniz, o korkunç “su tankını doldurun” mesajını alma olasılığınız o kadar artar. Meslektaşlarım da bu konuda aynı şekilde düşünüyor. Biz inekler olarak buna son verecek teknolojiyi uygulamaya karar verdik.
Gereçler
Ekipmanlarımız
SAECO Aulika Focus kahve makinemiz var. Bu güne kadar, makinenin su deposunu standart 5 Galon (19L) su şişesinden doldurmak için bir el pompası kullandık.
Hedeflerimiz
- Bir röle aracılığıyla bir tür kontrolör veya mikrobilgisayar tarafından çalıştırılan bir elektrikli pompa kullanın.
- Kahve makinesinin haznesindeki su seviyesini ölçmenin bir yolunu bulun, böylece sistemimiz ne zaman yeniden dolduracağını bilsin.
- Sistemi, tercihen bir mobil cihazdan gerçek zamanlı olarak kontrol etmek için araçlara sahip olun.
- Sistemde bir şeyler ters giderse (Slack veya benzeri bir hizmet aracılığıyla) bildirim alın.
Adım 1: Ekipmanı Seçme
pompa
Hızlı bir web araması, seçtiğiniz su şişeniz için tasarlanmış birkaç elektrikli pompa modelini gösterecektir. Bu tür pompalar genellikle bir AÇMA/KAPAMA anahtarı ile kontrol edilir (örneğin, Sıcak Frost A12 veya SMixx ХL-D2). İşte projemiz için seçtiğimiz pompa.
Kontrol Cihazı
Birkaç cihaz denedik ancak aşağıdaki avantajlardan dolayı bir Raspberry Pi'ye karar verdik:
- Bir yakınlık sensörü bağlamamıza izin veren bir GPIO'ya sahiptir.
- Python'u destekler
Raspbian Buster Lite'ın yeni bir sürümünü ve Python 3'ü çalıştırmak için gereken her şeyi yükledik.
Pompayı Nasıl Açarız
Gücü kontrol etmek için alternatif akıma uygun orta güçte (12V/2A) katı hal rölesi seçtik. Röle pompayı prize bağlar ve Raspberry Pi'nin dijital pini tarafından kontrol edilir.
Su Seviyesini Nasıl Kontrol Ediyoruz?
Kahve makinesinin yapısını değiştirmemek bizim için önemliydi, bu yüzden su seviyesini ölçmek için HC-SR04 Ultrasonik yakınlık sensörünü kullanmaya karar verdik.
Sensörün emitörleri için iki delikli özel bir su deposu kapağını 3 boyutlu olarak yazdırdık. Sensör için kolayca bir GitHub kütüphanesi bulduk. Bu noktada tüm hazırlıklar tamamlandı.
Adım 2: Sistemi Tasarlamak
Sistemin Mantığı
Sistem, aşağıdaki basit mantık göz önünde bulundurularak tasarlanmıştır:
- Sistem, sensör ile su yüzeyi arasındaki mesafeyi sürekli olarak izler.
- Mesafedeki bir değişiklik bir eşik değerini aştığında, sistem durumuyla ilgili bilgileri buluta gönderir.
- Mesafe izin verilen maksimum değerin üzerine çıkarsa (depo boş), sistem pompayı çalıştırır ve mesafe izin verilen minimum değerden az olduğunda sistem onu kapatır.
- Sistemin durumu değiştiğinde (örneğin, pompa devreye girdiğinde) bulutu bilgilendirir.
Bir hata durumunda, Slack kanalına bir bildirim gönderilir.
Kahve makinesi boştayken, sistem dakikada bir teşhis verileriyle bulut hizmetine ping gönderir. Ek olarak, durumunu her 5 dakikada bir buluta gönderir.
Pompa aktif olduğunda, sistem verileri daha sık gönderir, ancak her yarım saniyede bir defadan fazla olmaz.
def send(bulut, değişkenler, dist, error_code=0, force=False): pump_on = is_pump_on() yüzde = calc_water_level_percent(dist) değişkenler['Mesafe']['değer'] = uzak değişkenler['Su Seviyesi'][' değer'] = yüzde değişkenler['PumpRelay']['değer'] = pump_on değişkenleri['Durum']['değer'] = calc_status(hata_kodu, yüzde, pump_on)
akım = zaman()
global last_sending_time eğer zorunluysa veya geçerliyse - last_sending_time > MIN_SEND_INTERVAL: okumalar = cloud.read_data() cloud.publish_data(okumalar) last_sending_time = geçerli
Pompa ile Çalışmak
Aşağıdaki sabitleri pompa çalışma mantığı için temel olarak tanımlarız.
# GPIO Pinleri (BCM)GPIO_PUMP = 4 GPIO_TRIGGER = 17 GPIO_ECHO = 27
# Pompa
START_PUMP = 1 STOP_PUMP = 0 PUMP_BOUNCE_TIME = 50 # milisaniye PUMP_STOP_TIMEOUT = 5 # saniye
ÖNEMLİ: Pin 4 kullanacaksanız, çakışmaları önlemek için 1-Wire raspi-config seçeneğini devre dışı bırakmayı unutmayın.
Programın başlangıcında, bir geri arama kaydederiz ve ilk durumu KAPALI olarak ayarlarız.
Pompayı değiştiren işlevin kodu:
def toggle_pump(değer): eğer pump_disabled ise: is_pump_on() ise geri dön != değer: log_debug("[x] %s" % (eğer başka bir değer 'DUR' ise 'BAŞLAT')) GPIO.setup(GPIO_PUMP, GPIO. OUT) GPIO.output(GPIO_PUMP, değer) # Dökümü Başlat/Durdur
Yukarıdaki başlatma kodunda tanımlandığı gibi röle AÇIK konuma geçtiğinde aşağıdaki geri arama çağrılır:
pump_on = Yanlış tanım pump_relay_handle(pin): global pump_on pump_on = GPIO.input(GPIO_PUMP) log_debug("Pompa rölesi %d olarak değiştirildi" % pump_on)
Geri çağırmada, pompanın mevcut durumunu bir değişkene kaydediyoruz. Uygulamanın ana döngüsünde, pompanın geçiş yaptığı anı aşağıda gösterildiği gibi algılayabiliyoruz:
def is_pump_on(): global pump_on dönüş pump_on
GPIO.event_detected ise(GPIO_PUMP):
is_pouring = is_pump_on() # … log_debug('[!] Pompa olayı algılandı: %s' % (eğer is_pouring 'Kapalı' ise 'Açık')) send(bulut, değişkenler, uzaklık, kuvvet=Doğru)
Mesafeyi Ölçme
Ultrasonik bir yakınlık sensörü kullanarak su yüzeyine olan mesafeyi ölçmek oldukça kolaydır. Depomuzda, bir sensörü test etmenize izin veren birkaç python betiği paylaştık.
Gerçek uygulamalarda, sensörün sıçrama etkisi ve su salınımları nedeniyle sensör okumaları dalgalanabilir. Bazı durumlarda, okumalar tamamen eksik olabilir. N adet son değeri toplayan, tepe noktaları atan ve kalan ölçümlerin ortalamasını hesaplayan bir BounceFilter sınıfı uyguladık. Ölçüm işlemi, aşağıdaki asenkron algoritma ile gerçekleştirilir.
# Son sensör ölçümlerini tutar = BounceFilter(size=6, discard_count=1)
read_complete = threading. Event()
def wait_for_distance():
read_complete.clear() thread = threading. Thread(target=read_mesafe) thread.start()
read_complete değilse.bekle(MAX_READING_TIMEOUT):
log_info('Okuma sensörü zaman aşımı') return None döndürme okumaları.avg()
def read_mesafe():
deneyin: değer = hcsr04.raw_distance(sample_size=5) yuvarlatılmış = değer ise değer başka hiçbir yuvarlak(değer, 1) reads.add(yuvarlak) istisna dışında err: log_error('Dahili hata: %s' % err) nihayet: read_complete.set()
Filtrenin tam uygulamasını kaynaklarda bulabilirsiniz.
3. Adım: Acil Durumların Ele Alınması
Sensör yandıysa, düştüyse veya yanlış bir alanı gösteriyorsa ne olur? Manuel işlem yapabilmemiz için bu tür vakaları bildirmenin bir yoluna ihtiyacımız vardı.
Sensör mesafe okumaları sağlayamazsa, sistem değişen durumu buluta gönderir ve ilgili bir bildirim oluşturur.
Mantık aşağıdaki kodla gösterilmiştir.
mesafe = wait_for_distance() # Mesafe Yok ise mevcut su derinliğini oku: log_error('Mesafe hatası!') notify_in_background(calc_alert(SENSOR_ERROR)) send(bulut, değişkenler, mesafe, error_code=SENSOR_ERROR, force=True)
Sensör yerindeyken korunması gereken operasyonel bir su seviyesi aralığına sahibiz. Mevcut su seviyesinin bu aralığa düşüp düşmediğini test ederiz:
# Sensörden su seviyesine olan mesafe# kahve makinesinin su haznesine göre MIN_DISTANCE = 2 # cm MAX_DISTANCE = 8 # cm
# Mesafe beklenen aralığın dışında: dökmeye başlamayın
eğer mesafe > MAX_DISTANCE * 2: log_error('Mesafe aralık dışı: %.2f' % mesafe) devam et
Bir hata oluştuğunda aktifse pompayı kapatırız.
if is_pump_on() ve prev_distance < STOP_PUMP_DISTANCE + DISTANCE_DELTA: log_error('[!] Pompanın acil durdurulması. Mesafe sensöründen sinyal yok')
toggle_pompa(STOP_PUMP)
Şişede su bittiğinde de davayı işliyoruz. Pompa çalıştığında su seviyesinin değişip değişmediğini kontrol ediyoruz. Bu durumda sistem 5 saniye bekler ve ardından pompanın kapanıp kapanmadığını kontrol eder. Değilse, sistem acil pompa kapatma işlemini gerçekleştirir ve bir hata bildirimi gönderir.
PUMP_STOP_TIMEOUT = 5 # secsemergency_stop_time = Yok
def set_emergency_stop_time(şimdi, is_pouring):
global acil_stop_time acil_stop_time = şimdi + PUMP_STOP_TIMEOUT eğer / dökülüyorsa, başka Yok
def check_water_source_empty(şimdi):
acil_durma_zamanı ve şimdi döndür > acil_durdurma_zamanı
# --------- Ana döngü -----------
if GPIO.event_detected(GPIO_PUMP): is_pouring = is_pump_on() set_emergency_stop_time(şimdi, is_pouring) # …
global pump_disabled
eğer check_water_source_empty(şimdi): log_error('[!] Pompanın acil durdurulması. / Su kaynağı boş') toggle_pump(STOP_PUMP) pump_disabled = True
Yukarıda, bir acil durdurma sırasında oluşturulan bir mesaj günlüğü örneği verilmiştir.
Adım 4: Sistemi 7/24 Çalıştırmak
Cihazdaki kodda hata ayıklanır ve sorunsuz çalışır. Bir hizmet olarak başlattık, bu nedenle Raspberry Pi yeniden başlatılırsa yeniden başlar. Kolaylık sağlamak için dağıtıma, hizmeti çalıştırmaya ve günlükleri görüntülemeye yardımcı olan bir Makefile oluşturduk.
. PHONY: kur çalıştır başlat durdur durum günlüğü konuşlandır MAIN_FILE:= coffee-pump/main.py SERVICE_INSTALL_SCRIPT:= service_install.sh SERVICE_NAME:= coffee-pump.service
Yüklemek:
chmod +x $(SERVICE_INSTALL_SCRIPT) sudo./$(SERVICE_INSTALL_SCRIPT) $(MAIN_FILE)
Çalıştırmak:
sudo python3 $(MAIN_FILE)
Başlat:
sudo systemctl $(SERVICE_NAME) başlat
durum:
sudo systemctl durumu $(SERVICE_NAME)
Dur:
sudo systemctl $(SERVICE_NAME) durdur
kayıt:
sudojournalctl -u kahve pompası -- bugünden beri
dağıtmak:
rsync -av kahve pompası sensör kurulumu Makefile *.sh pi@XX. XX. XXX. XXX:~/
Bu dosyayı ve gerekli tüm komut dosyalarını depomuzda bulabilirsiniz.
Adım 5: Bulut İzleme
Bir kontrol paneli uygulamak için Cloud4RPi kullandık. İlk olarak, sistemin temel parametrelerini belirtmek için widget'lar ekledik.
Bu arada, STATUS değişkeni için widget, değerine bağlı olarak farklı renk şemaları kullanabilir (yukarıdaki resme bakın).
Dinamik verileri görüntülemek için bir grafik widget'ı ekledik. Aşağıdaki resimde pompanın açılıp kapandığı anı ve ilgili su seviyelerini görebilirsiniz.
Daha uzun bir zaman aralığını analiz ederseniz, tepe noktaları görebilirsiniz - bu, pompanın çalıştığı zamandır.
Cloud4RPi ayrıca farklı yumuşatma seviyeleri ayarlamanıza da olanak tanır.
6. Adım: Çalışıyor
İşe yarıyor! Kontrol panelinin tamamı aşağıda gösterildiği gibi görünmektedir.
Şu anda otomatik pompamız birkaç haftadır çalışıyor ve tek yapmamız gereken su şişelerini değiştirmek. Projemizin tam kodu GitHub depomuzda mevcuttur.
Önerilen:
Süper Stok (Barkod Okuyucu Tarafından Kontrol Edilen Stok): 5 Adım
Superstock (Barkod Tarayıcı Tarafından Kontrol Edilen Stok): Bu kılavuzda Howest'te 1MCT için okul projem Superstock'un nasıl oluşturulacağını anlatacağım. Konsept, stokta bulunanların sayısını tutmak için bir web sitesi aracılığıyla erişebileceğiniz kullanıcı dostu bir veritabanı yapmaktır (benim durumumda benim için kıyafet
Kendin yap - Arduino Tarafından Kontrol Edilen RGB LED Gölgeler: 5 Adım (Resimli)
Kendin yap | Arduino Tarafından Kontrol Edilen RGB LED Gölgeler: Bugün size kendi RGB LED Gözlüklerinizi nasıl çok kolay ve ucuza yapabileceğinizi öğreteceğim. bu proje. Onlar bir PCB üreticisidir,
Uygulama Tarafından Kontrol Edilen NodeMCU ile Akıllı Pot Nasıl Yapılır: 8 Adım
NodeMCU Uygulama Tarafından Kontrol Edilen Akıllı Pot Nasıl Yapılır: Bu kılavuzda, bir ESP32 tarafından kontrol edilen bir Akıllı Pot ve akıllı telefon (iOS ve Android) için bir Uygulama oluşturacağız. Bağlantı ve Blynk Kitaplığı için NodeMCU (ESP32) kullanacağız. bulut IoT ve akıllı telefondaki Uygulama için.Son olarak biz
Arduino ve PC Tarafından Kontrol Edilen Robotik Kol: 10 Adım
Arduino ve PC Tarafından Kontrol Edilen Robotik Kol: Robotik kollar endüstride yaygın olarak kullanılmaktadır. İster montaj işlemleri için, ister kaynak için, hatta biri ISS'ye (Uluslararası Uzay İstasyonu) yerleştirmek için kullanılıyor olsun, insanlara işlerinde yardımcı oluyorlar veya tamamen insanın yerini alıyorlar. Yaptığım kol daha küçük
Raspberry Pi Tarafından Kontrol Edilen Solunum Işığı: 5 Adım
Ahududu Pi Tarafından Kontrol Edilen Solunum Işığı: "Nefes Egzersiz Işığı"; Burada anlatılan, nefes egzersizlerinizde size destek olabilecek ve sabit bir nefes ritmini korumanıza yardımcı olabilecek basit ve nispeten ucuz bir titreşimli ışıktır. Ayrıca örneğin kullanılabilir. yatıştırıcı bir n olarak