Mundarija:
- Ta'minotlar
- 1 -qadam: uskunani tanlash
- 2 -qadam: tizimni loyihalash
- 3 -qadam: Favqulodda vaziyatlarni bartaraf etish
- 4 -qadam: 7/24 tizimni ishga tushirish
- 5 -qadam: Bulutli monitoring
- 6 -qadam: Bu ishlaydi
Video: Raspberry Pi & HC-SR04 ultratovush sensori va Cloud4RPi tomonidan boshqariladigan aqlli qahva mashinasi nasosi: 6 qadam
2024 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2024-01-30 13:25
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
- O'rnimizni orqali qandaydir boshqaruvchi yoki mikrokompyuter boshqaradigan elektr nasosdan foydalaning.
- Qahva mashinasining idishidagi suv sathini o'lchash usulini qo'llang, shunda bizning tizimimiz uni qachon to'ldirishni biladi.
- Tizimni boshqarish vositalariga ega, tercihen real vaqtda mobil qurilmadan.
- Agar tizimda biror narsa noto'g'ri bo'lsa, bildirishnomalarni oling (Slack yoki shunga o'xshash xizmat orqali).
1 -qadam: 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
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
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
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
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
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:
Arduino, ultratovush sensori va servo dvigatel yordamida aqlli axlat qutisi: 3 qadam
Arduino, Ultrasonik sensorlar va servo dvigatel yordamida aqlli axlat qutisi: Ushbu loyihada men sizga Arduino yordamida axlat qutisini qanday yasashni ko'rsataman, u erda axlat qutisiga yaqinlashganda axlat qutisi qopqog'i avtomatik ravishda ochiladi. Bu Smart axlat qutisini yasash uchun ishlatiladigan boshqa muhim komponentlar HC-04 Ultrasonik Sen
Aqlli qahva mashinasi - SmartHome ekotizimining bir qismi: 4 qadam
Aqlli qahva mashinasi - SmartHome ekotizimining bir qismi: buzilgan qahva mashinasi uni SmartHome ekotizimining bir qismiga aylantirdi, menda eski Delonghi qahva mashinasi (DCM) bor (bu reklama emas va "aqlli" bo'lishini xohlayman. Shunday qilib, men uni ESP8266 ni o'rnatib buzib tashladim). uning miyasiga/mikrokontrolleriga interfeysli modul
Ilova tomonidan boshqariladigan NodeMCU yordamida aqlli qozonni qanday yasash mumkin: 8 qadam
NodeMCU yordamida boshqariladigan aqlli qozonni qanday qilish kerak: Ushbu qo'llanmada biz ESP32 va Smartfonlar uchun ilovalar (iOS va Android) tomonidan boshqariladigan Smart Pot quramiz. Biz ulanish va Blynk kutubxonasi uchun NodeMCU (ESP32) dan foydalanamiz. bulutli IoT va smartfonlardagi ilova uchun. Oxirida biz
Arduino tomonidan boshqariladigan DIY qahva qovurish mashinasi: 13 qadam (rasmlar bilan)
Arduino tomonidan boshqariladigan DIY qahva qovurish mashinasi: Ushbu yo'riqnomada biz issiq havodagi popkorn mashinasini to'liq avtomatik va harorat boshqariladigan uy qahvaxonasiga aylantirish uchun o'zgartirishni ko'rib chiqamiz. Uyda qahva qovurish hayratlanarli darajada sodda va hatto qovurish kabi oddiy narsa
ARDUINO YUN tomonidan boshqariladigan ROOMBA STEFANO DALL'OLIO tomonidan Wifi ilovasi orqali: 4 qadam (rasmlar bilan)
AROMINO YUN tomonidan boshqariladigan ROOMBA Wifi ilovasi orqali STEFANO DALL'OLIO: Ushbu qo'llanmada men ARDUINO YUN -ni Roomba -ga Wi -Fi orqali ulash uchun kodni ulashaman. Kod va ilovani to'liq Stefano Dall yaratgan va ishlab chiqqan. Olio.Mening Roomba - bu Roomba 620, lekin siz xuddi shu kodni boshqa Roomb uchun ishlatishingiz mumkin