Mundarija:

Raspberry Pi & HC-SR04 ultratovush sensori va Cloud4RPi tomonidan boshqariladigan aqlli qahva mashinasi nasosi: 6 qadam
Raspberry Pi & HC-SR04 ultratovush sensori va Cloud4RPi tomonidan boshqariladigan aqlli qahva mashinasi nasosi: 6 qadam

Video: Raspberry Pi & HC-SR04 ultratovush sensori va Cloud4RPi tomonidan boshqariladigan aqlli qahva mashinasi nasosi: 6 qadam

Video: Raspberry Pi & HC-SR04 ultratovush sensori va Cloud4RPi tomonidan boshqariladigan aqlli qahva mashinasi nasosi: 6 qadam
Video: DIY Radar With Ultrasonic Sensor And Chat-GPT Generated Arduino Code | Coders Cafe 2024, Noyabr
Anonim
Raspberry Pi & HC-SR04 ultratovush sensori va Cloud4RPi tomonidan boshqariladigan aqlli qahva mashinasi nasosi
Raspberry Pi & HC-SR04 ultratovush sensori va Cloud4RPi tomonidan boshqariladigan aqlli qahva mashinasi nasosi

Nazariy jihatdan, har safar ertalabki chashka uchun qahva mashinasiga borganingizda, suv idishini to'ldirish uchun faqat yigirma bir imkoniyat bor. Biroq, amalda, mashina qandaydir yo'l bilan sizga har doim bu ishni bajarishga yordam beradiganga o'xshaydi. Qahvani qanchalik ko'p xohlasangiz, "suv idishini to'ldiring" degan qo'rqinchli xabarni olish ehtimoli ko'proq. Hamkasblarim ham xuddi shunday fikrda. Biz aql bovar qilmaydigan odamlar bo'lib, biz bunga chek qo'yadigan texnologiyani joriy etishga qaror qildik.

Ta'minotlar

Bizning uskunalar

Bizda SAECO Aulika Focus qahva mashinasi bor. Shu kungacha biz mashinaning suv idishini standart 5 Gallon (19L) suv idishidan to'ldirish uchun qo'l nasosidan foydalanganmiz.

Bizning maqsadlarimiz

  1. O'rnimizni orqali qandaydir boshqaruvchi yoki mikrokompyuter boshqaradigan elektr nasosdan foydalaning.
  2. Qahva mashinasining idishidagi suv sathini o'lchash usulini qo'llang, shunda bizning tizimimiz uni qachon to'ldirishni biladi.
  3. Tizimni boshqarish vositalariga ega, tercihen real vaqtda mobil qurilmadan.
  4. Agar tizimda biror narsa noto'g'ri bo'lsa, bildirishnomalarni oling (Slack yoki shunga o'xshash xizmat orqali).

1 -qadam: uskunani tanlash

Uskunani tanlash
Uskunani tanlash
Uskunani tanlash
Uskunani tanlash
Uskunani tanlash
Uskunani tanlash
Uskunani tanlash
Uskunani tanlash

Nasos

Tez veb -qidiruv siz tanlagan suv idishi uchun mo'ljallangan bir nechta elektr nasos modellarini ko'rsatadi. Bunday nasoslar odatda ON/OFF tugmasi bilan boshqariladi (masalan, Hot Frost A12 yoki SMixx XL-D2). Mana, biz loyihamiz uchun tanlagan nasos.

Tekshirish moslamasi

Biz bir nechta qurilmalarni sinab ko'rdik, lekin quyidagi afzalliklari tufayli Raspberry Pi -ga joylashdik:

  • U GPIO -ga ega, bu bizga yaqinlik sensorini ulash imkonini beradi
  • Python -ni qo'llab -quvvatlaydi

Biz Raspbian Buster Lite -ning yangi versiyasini va Python 3 -ni ishlatish uchun kerak bo'lgan hamma narsani o'rnatdik.

Nasosni qanday almashtiramiz

Quvvatni nazorat qilish uchun biz o'zgaruvchan tok uchun mos keladigan o'rta quvvatli (12V/2A) qattiq holatli o'rni tanladik, o'rni nasosni rozetkaga ulaydi va Raspberry Pi -ning raqamli pimi bilan boshqariladi.

Suv darajasini qanday tekshiramiz

Biz uchun qahva mashinasining tuzilishini o'zgartirmaslik muhim edi, shuning uchun biz suv sathini o'lchash uchun HC-SR04 ultrasonik yaqinlik sensori ishlatishga qaror qildik.

Biz datchiklar uchun ikkita teshikli maxsus suv idishi qopqog'ini 3d bosib chiqarganmiz, biz sensorlar uchun GitHub kutubxonasini osongina topdik, shu vaqtda barcha tayyorgarlik ishlari yakunlandi.

2 -qadam: tizimni loyihalash

Tizimni loyihalash
Tizimni loyihalash
Tizimni loyihalash
Tizimni loyihalash

Tizim mantig'i

Tizim quyidagi oddiy mantiqni hisobga olgan holda ishlab chiqilgan:

  • Tizim sensor va suv yuzasi orasidagi masofani doimiy ravishda kuzatib boradi.
  • Qachonki masofa o'zgarishi chegaraviy qiymatdan oshsa, tizim o'z holati haqidagi ma'lumotlarni bulutga yuboradi.
  • Agar masofa ruxsat etilgan maksimal qiymatdan oshib ketsa (tank bo'sh), tizim nasosni ishga tushiradi va masofa ruxsat etilgan minimal qiymatdan kichik bo'lgandan keyin uni o'chiradi.
  • Har safar tizimning holati o'zgarganda (masalan, nasos ishga tushganda) bulut haqida xabar beradi.

Agar xato bo'lsa, Slack kanaliga xabar yuboriladi.

Qahva mashinasi ishlamay qolganda, tizim har daqiqada bir marta diagnostika ma'lumotlari bilan bulut xizmatini o'chiradi. Bundan tashqari, u har 5 daqiqada o'z holatini bulutga yuboradi.

Nasos faol bo'lganda, tizim ma'lumotlarni tez -tez yuboradi, lekin har yarim soniyada bir martadan ko'p emas.

def send (bulut, o'zgaruvchilar, dist, error_code = 0, kuch = Noto'g'ri): pump_on = is_pump_on () foiz = calc_water_level_percent (dist) o'zgaruvchilar ['Distance'] ['value'] = dist o'zgaruvchilari ['WaterLevel'] [' qiymat '] = foiz o'zgaruvchilar [' PumpRelay '] [' qiymat '] = pompa_on o'zgaruvchilar [' Status '] [' qiymat '] = calc_status (xato_kod, foiz, nasos_on)

joriy = vaqt ()

global last_sending_time kuch yoki joriy bo'lsa - last_sending_time> MIN_SEND_INTERVAL: o'qishlar = cloud.read_data () cloud.publish_data (o'qishlar) last_sending_time = joriy

Nasos bilan ishlash

Biz nasosning ishlash mantig'ining asosi sifatida quyidagi konstantalarni aniqlaymiz.

# GPIO pinlari (BCM) GPIO_PUMP = 4 GPIO_TRIGGER = 17 GPIO_ECHO = 27

# Nasos

START_PUMP = 1 STOP_PUMP = 0 PUMP_BOUNCE_TIME = 50 # millisekund PUMP_STOP_TIMEOUT = 5 # soniya

MUHIM: Agar siz 4-pindan foydalanmoqchi bo'lsangiz, nizolarni oldini olish uchun 1-simli raspi-config parametrini o'chirishni unutmang.

Dastur ishga tushganda, biz qayta qo'ng'iroqni ro'yxatdan o'tkazamiz va boshlang'ich holatini OFF holatiga qo'yamiz.

Bu erda nasosni almashtiradigan funktsiya kodi:

def toggle_pump (qiymat): agar pump_disabled bo'lsa: return is_pump_on ()! = qiymat: log_debug ("[x] % s" % ("START" bo'lsa, boshqa qiymat "STOP")) GPIO.setup (GPIO_PUMP, GPIO. OUT) GPIO.output (GPIO_PUMP, qiymat) # To'kishni boshlash/to'xtatish

Yuqoridagi ishga tushirish kodida ta'riflanganidek, o'rni yoqilganda, quyidagi qayta qo'ng'iroq chaqiriladi:

pump_on = noto'g'ri noto'g'ri pump_relay_handle (pin): global pump_on pump_on = GPIO.input (GPIO_PUMP) log_debug ("Nasos o'rni % d" % nasos_oniga o'zgartirildi)

Qayta qo'ng'iroq paytida biz nasosning hozirgi holatini o'zgaruvchiga saqlaymiz, dasturning asosiy tsiklida biz quyida ko'rsatilganidek, nasosning o'tish vaqtini aniqlay olamiz:

def is_pump_on (): global pump_on return pump_on

agar GPIO.event_detected (GPIO_PUMP):

is_pouring = is_pump_on () #… log_debug ('[!] Nasos hodisasi aniqlandi: % s' % ("Yoqilgan" bo'lsa, boshqa "O'chirilgan" bo'lsa)) yuborish (bulut, o'zgaruvchilar, masofa, kuch = To'g'ri)

Masofani o'lchash

Ultrasonik yaqinlik sensori yordamida suv yuzasiga masofani o'lchash juda oson. Bizning omborimizda biz sensorni sinab ko'rishga imkon beradigan bir nechta python skriptlarini baham ko'rdik.

Haqiqiy ilovalarda, sensorning qaytish effekti va suv tebranishi tufayli sensor o'qishlari o'zgarishi mumkin. Ba'zi hollarda o'qishlar to'liq yo'qolishi mumkin. Biz BounceFilter sinfini joriy qildik, u N oxirgi qiymatlarini to'playdi, cho'qqilarni tashlaydi va qolgan o'lchovlarning o'rtacha qiymatini hisoblab chiqadi. O'lchov jarayoni quyidagi asenkron algoritm bilan amalga oshiriladi.

# Sensorning oxirgi o'lchovlarini saqlaydi = BounceFilter (hajmi = 6, discard_count = 1)

read_complete = threading. Event ()

def wait_for_distance ():

read_complete.clear () thread = threading. Thread (target = read_distance) thread.start ()

agar o'qilmasa_komplet. kuting (MAX_READING_TIMEOUT):

log_info ("O'qish sensori tanaffusi") qaytarilmaydi Readings.avg () qaytmaydi

def read_distance ():

harakat qilib ko'ring: qiymat = hcsr04.raw_distance (sample_size = 5) yaxlitlangan = agar qiymat boshqa bo'lmasa, hech kim yumaloq emas (qiymat, 1) readings.add (yaxlitlangan) istisnolardan tashqari xato: log_error ("Ichki xato: % s ' % xato"): read_complete.set ()

Filtrning to'liq bajarilishini manbalarda topishingiz mumkin.

3 -qadam: Favqulodda vaziyatlarni bartaraf etish

Favqulodda vaziyatlarni hal qilish
Favqulodda vaziyatlarni hal qilish
Favqulodda vaziyatlarni hal qilish
Favqulodda vaziyatlarni hal qilish
Favqulodda vaziyatlarni hal qilish
Favqulodda vaziyatlarni hal qilish

Agar sensor yonib ketsa yoki yiqilsa yoki noto'g'ri joyni ko'rsatsa nima bo'ladi? Bizga qo'lda chora ko'rish uchun bunday holatlar haqida xabar berish usuli kerak edi.

Agar sensor masofadan o'qishni ta'minlay olmasa, tizim o'zgartirilgan holatni bulutga yuboradi va tegishli bildirishnoma chiqaradi.

Mantiq quyidagi kod bilan tasvirlangan.

masofa = wait_for_distance () # Joriy suv chuqurligini o'qing, agar masofa Yo'q bo'lsa: log_error ('Masofa xatosi!') notify_in_background (calc_alert (SENSOR_ERROR)) yuborish (bulut, o'zgaruvchilar, masofa, error_code = SENSOR_ERROR, force = True)

Bizda suv sathining operatsion diapazoni mavjud, uni sensor o'z joyida ushlab turishi kerak. Biz hozirgi suv sathi shu diapazonga tushishini tekshiramiz:

# Sensordan suv sathigacha bo'lgan masofa # qahva mashinasining suv idishiga asoslangan MIN_DISTANCE = 2 # sm MAX_DISTANCE = 8 # sm

# Masofa kutilgan diapazondan tashqarida: quyishni boshlamang

agar masofa> MAX_DISTANCE * 2: log_error ('Masofa diapazondan tashqarida: %.2f' % masofa) davom etsa

Xatolik yuz berganda, u faol bo'lsa, biz nasosni o'chirib qo'yamiz.

agar is_pump_on () va oldingi masofa <STOP_PUMP_DISTANCE + DISTANCE_DELTA: log_error ('[!] Nasosning favqulodda to'xtashi. Masofadagi sensordan signal yo'q')

toggle_pump (STOP_PUMP)

Shishadagi suv tugagach, biz ham ishni ko'rib chiqamiz. Nasos ishlayotganda suv sathi o'zgarmasligini tekshiramiz. Agar shunday bo'lsa, tizim 5 soniya kutadi va keyin nasos o'chirilganligini tekshiradi. Agar bunday bo'lmasa, tizim nasosni favqulodda o'chirishni amalga oshiradi va xato xabari yuboradi.

PUMP_STOP_TIMEOUT = 5 # seksemergency_stop_time = Yo'q

def set_emergency_stop_time (hozir, quyiladi):

global Emergency_stop_time Emergency_stop_time = hozir + PUMP_STOP_TIMEOUT, agar boshqa quyilmasa

def check_water_source_empty (hozir):

Emergency_stop_time va hozir> Emergency_stop_time ga qaytish

# --------- asosiy halqa -----------

agar GPIO.event_detected (GPIO_PUMP): is_pouring = is_pump_on () set_emergency_stop_time (hozir, to'kilmoqda) # …

global pump_disabled

if check_water_source_empty (hozir): log_error ('[!] Nasosning favqulodda to'xtashi. / Suv manbai bo'sh') toggle_pump (STOP_PUMP) pump_disabled = To'g'ri

Yuqorida favqulodda to'xtash vaqtida hosil qilingan xabarlar jurnalining misoli keltirilgan.

4 -qadam: 7/24 tizimni ishga tushirish

7/24 tizimni ishga tushirish
7/24 tizimni ishga tushirish

Qurilmadagi kod tuzatilgan va muammosiz ishlaydi. Biz uni xizmat sifatida ishga tushirdik, shuning uchun Raspberry Pi qayta yuklansa, u qayta boshlanadi. Qulaylik uchun biz Makefile -ni yaratdik, u tarqatishga, xizmatni ishga tushirishga va jurnallarni ko'rishga yordam beradi.

. PHONY: ishga tushirish boshlanishini to'xtatish holati jurnalini o'rnatish MAIN_FILE: = kofe-nasosi/main.py SERVICE_INSTALL_SCRIPT: = service_install.sh SERVICE_NAME: = qahva-nasosi.xizmat

o'rnatish:

chmod +x $ (SERVICE_INSTALL_SCRIPT) sudo./$(SERVICE_INSTALL_SCRIPT) $ (MAIN_FILE)

yugurish:

sudo python3 $ (MAIN_FILE)

boshlash:

sudo systemctl start $ (SERVICE_NAME)

holat:

sudo systemctl status $ (SERVICE_NAME)

STOP:

sudo systemctl stop $ (SERVICE_NAME)

jurnal:

sudo journalctl -u qahva nasosi -bugundan boshlab

tarqatish:

rsync -av qahva nasos sensori-sozlash Makefile *.sh pi@XX. XX. XXX. XXX: ~/

Siz bu faylni va barcha kerakli skriptlarni bizning omborimizda topishingiz mumkin.

5 -qadam: Bulutli monitoring

Bulutli monitoring
Bulutli monitoring
Bulutli monitoring
Bulutli monitoring
Bulutli monitoring
Bulutli monitoring
Bulutli monitoring
Bulutli monitoring

Biz boshqaruv panelini ishga tushirish uchun Cloud4RPi -dan foydalandik. Biz avval tizimning asosiy parametrlarini ko'rsatish uchun vidjetlarni qo'shdik.

Aytgancha, STATUS o'zgaruvchisining vidjeti uning qiymatiga qarab turli xil rang sxemalarini ishlatishi mumkin (yuqoridagi rasmga qarang).

Biz dinamik ma'lumotlarni ko'rsatish uchun jadval vidjetini qo'shdik. Quyidagi rasmda siz nasosni yoqish va o'chirish vaqtini va tegishli suv sathini ko'rishingiz mumkin.

Agar siz uzoqroq vaqtni tahlil qilsangiz, cho'qqilarni ko'rishingiz mumkin - o'sha paytda nasos ishlayotgandi.

Cloud4RPi shuningdek, turli xil tekislash darajasini o'rnatish imkonini beradi.

6 -qadam: Bu ishlaydi

Image
Image

Ishlamoqda! Boshqaruv paneli butunlay quyida ko'rsatilganidek ko'rinadi.

Hozirgi vaqtda bizning avtomatik nasosimiz bir necha haftadan beri ishlamoqda va biz faqat suv idishlarini almashtirishimiz kerak. Loyihamizning to'liq kodi GitHub omborimizda mavjud.

Tavsiya: