İçindekiler:

Raspberry Pi & HC-SR04 Ultrasonik Sensör ve Cloud4RPi Tarafından Kontrol Edilen Akıllı Kahve Makinesi Pompası: 6 Adım
Raspberry Pi & HC-SR04 Ultrasonik Sensör ve Cloud4RPi Tarafından Kontrol Edilen Akıllı Kahve Makinesi Pompası: 6 Adım

Video: Raspberry Pi & HC-SR04 Ultrasonik Sensör ve Cloud4RPi Tarafından Kontrol Edilen Akıllı Kahve Makinesi Pompası: 6 Adım

Video: Raspberry Pi & HC-SR04 Ultrasonik Sensör ve Cloud4RPi Tarafından Kontrol Edilen Akıllı Kahve Makinesi Pompası: 6 Adım
Video: Arduino Dersleri #23 Ultrasonik Sensör (HC SR04) ile Mesafe Ölçümü (Araç Park Sensörü Mantığı) 2024, Temmuz
Anonim
Raspberry Pi & HC-SR04 Ultrasonik Sensör ve Cloud4RPi Tarafından Kontrol Edilen Akıllı Kahve Makinesi Pompası
Raspberry Pi & HC-SR04 Ultrasonik Sensör ve Cloud4RPi Tarafından Kontrol Edilen Akıllı Kahve Makinesi Pompası

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

  1. Bir röle aracılığıyla bir tür kontrolör veya mikrobilgisayar tarafından çalıştırılan bir elektrikli pompa kullanın.
  2. Kahve makinesinin haznesindeki su seviyesini ölçmenin bir yolunu bulun, böylece sistemimiz ne zaman yeniden dolduracağını bilsin.
  3. Sistemi, tercihen bir mobil cihazdan gerçek zamanlı olarak kontrol etmek için araçlara sahip olun.
  4. Sistemde bir şeyler ters giderse (Slack veya benzeri bir hizmet aracılığıyla) bildirim alın.

Adım 1: Ekipmanı Seçme

Ekipman Seçimi
Ekipman Seçimi
Ekipman Seçimi
Ekipman Seçimi
Ekipman Seçimi
Ekipman Seçimi
Ekipman Seçimi
Ekipman Seçimi

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

Sistemi Tasarlamak
Sistemi Tasarlamak
Sistemi Tasarlamak
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ı

Acil Durumların Ele Alınması
Acil Durumların Ele Alınması
Acil Durumların Ele Alınması
Acil Durumların Ele Alınması
Acil Durumların Ele Alınması
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

Sistemi 7/24 Çalıştırmak
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

Bulut İzleme
Bulut İzleme
Bulut İzleme
Bulut İzleme
Bulut İzleme
Bulut İzleme
Bulut İzleme
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

Image
Image

İş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: