সুচিপত্র:

রাস্পবেরি পাই এবং HC-SR04 অতিস্বনক সেন্সর এবং ক্লাউড 4 আরপিআই দ্বারা নিয়ন্ত্রিত স্মার্ট কফি মেশিন পাম্প: 6 টি ধাপ
রাস্পবেরি পাই এবং HC-SR04 অতিস্বনক সেন্সর এবং ক্লাউড 4 আরপিআই দ্বারা নিয়ন্ত্রিত স্মার্ট কফি মেশিন পাম্প: 6 টি ধাপ

ভিডিও: রাস্পবেরি পাই এবং HC-SR04 অতিস্বনক সেন্সর এবং ক্লাউড 4 আরপিআই দ্বারা নিয়ন্ত্রিত স্মার্ট কফি মেশিন পাম্প: 6 টি ধাপ

ভিডিও: রাস্পবেরি পাই এবং HC-SR04 অতিস্বনক সেন্সর এবং ক্লাউড 4 আরপিআই দ্বারা নিয়ন্ত্রিত স্মার্ট কফি মেশিন পাম্প: 6 টি ধাপ
ভিডিও: Measuring distance using raspberry pi and ultrasonic sensor hc-sr04 2024, নভেম্বর
Anonim
রাস্পবেরি পাই এবং HC-SR04 অতিস্বনক সেন্সর এবং ক্লাউড 4 আরপিআই দ্বারা নিয়ন্ত্রিত স্মার্ট কফি মেশিন পাম্প
রাস্পবেরি পাই এবং HC-SR04 অতিস্বনক সেন্সর এবং ক্লাউড 4 আরপিআই দ্বারা নিয়ন্ত্রিত স্মার্ট কফি মেশিন পাম্প

তত্ত্বগতভাবে, প্রতিবার যখন আপনি আপনার সকালের কাপের জন্য কফি মেশিনে যান, তখন পানির ট্যাঙ্কটি পূরণ করার একটি মাত্র বিশ-বিশ সুযোগ রয়েছে। অনুশীলনে, যাইহোক, মনে হচ্ছে যে মেশিনটি একরকম আপনার কাছে এই কাজটি সর্বদা রাখার উপায় খুঁজে পায়। আপনি যত বেশি কফি চান, ততই আপনি ভয়ঙ্কর "পানির ট্যাঙ্ক পূরণ করুন" বার্তাটি পেতে পারেন। আমার সহকর্মীরাও একই বিষয়ে অনুভব করেন। আমরা নির্বোধ হওয়ায় আমরা এমন প্রযুক্তি বাস্তবায়নের সিদ্ধান্ত নিয়েছি যা এর অবসান ঘটাবে।

সরবরাহ

আমাদের যন্ত্রপাতি

আমাদের একটি SAECO Aulika ফোকাস কফি মেশিন আছে। আজ অবধি, আমরা একটি হ্যান্ড পাম্প ব্যবহার করে মেশিনের পানির ট্যাঙ্কটি একটি আদর্শ 5 গ্যালন (19L) জলের বোতল থেকে পূরণ করি।

আমাদের লক্ষ্য

  1. একটি রিলে মাধ্যমে কোন ধরনের নিয়ামক বা একটি মাইক্রো কম্পিউটার দ্বারা চালিত একটি বৈদ্যুতিক পাম্প ব্যবহার করুন।
  2. কফি মেশিনের ট্যাঙ্কে পানির স্তর পরিমাপ করার একটি উপায় আছে যাতে আমাদের সিস্টেম জানতে পারে কখন এটি পুনরায় পূরণ করতে হবে।
  3. একটি মোবাইল ডিভাইস থেকে রিয়েল-টাইমে সিস্টেমকে নিয়ন্ত্রণ করার উপায় আছে।
  4. সিস্টেমে কিছু ভুল হলে বিজ্ঞপ্তিগুলি (স্ল্যাক বা অনুরূপ পরিষেবার মাধ্যমে) পান।

ধাপ 1: সরঞ্জাম নির্বাচন

সরঞ্জাম নির্বাচন
সরঞ্জাম নির্বাচন
সরঞ্জাম নির্বাচন
সরঞ্জাম নির্বাচন
সরঞ্জাম নির্বাচন
সরঞ্জাম নির্বাচন
সরঞ্জাম নির্বাচন
সরঞ্জাম নির্বাচন

পাম্পটি

একটি দ্রুত ওয়েব অনুসন্ধান আপনার পছন্দের জলের বোতলের জন্য ডিজাইন করা বেশ কয়েকটি বৈদ্যুতিক পাম্প মডেল দেখাবে। এই জাতীয় পাম্পগুলি সাধারণত একটি অন/অফ সুইচ দ্বারা নিয়ন্ত্রিত হয় (উদাহরণস্বরূপ, হট ফ্রস্ট A12 বা SMixx ХL-D2)। আমাদের প্রকল্পের জন্য আমরা যে পাম্পটি বেছে নিয়েছি তা এখানে।

কন্ট্রোলার ডিভাইস

আমরা বেশ কয়েকটি ডিভাইস চেষ্টা করেছি কিন্তু নিম্নলিখিত সুবিধার কারণে রাস্পবেরি পাইতে বসতি স্থাপন করেছি:

  • এটিতে একটি জিপিআইও রয়েছে যা আমাদের একটি প্রক্সিমিটি সেন্সর সংযুক্ত করতে দেয়
  • এটি পাইথনকে সমর্থন করে

আমরা রাস্পবিয়ান বাস্টার লাইটের একটি নতুন সংস্করণ এবং পাইথন 3 চালানোর জন্য প্রয়োজনীয় সবকিছু ইনস্টল করেছি।

আমরা কিভাবে পাম্প টগল করি

বিদ্যুৎ নিয়ন্ত্রণের জন্য, আমরা একটি মাঝারি শক্তি (12V/2A) শক্ত অবস্থা রিলে বাছাই করেছি যা বৈদ্যুতিক স্রোতের জন্য উপযুক্ত। রিলে পাম্পটিকে আউটলেটের সাথে সংযুক্ত করে এবং রাস্পবেরি পাই এর ডিজিটাল পিন দ্বারা নিয়ন্ত্রিত হয়।

আমরা কীভাবে পানির স্তর পরীক্ষা করি

কফি মেশিনের নির্মাণকে পরিবর্তন না করা আমাদের জন্য গুরুত্বপূর্ণ ছিল, তাই আমরা জলের স্তর পরিমাপের জন্য HC-SR04 অতিস্বনক প্রক্সিমিটি সেন্সর ব্যবহার করার সিদ্ধান্ত নিয়েছি।

আমরা সেন্সরের নির্গমনকারীদের জন্য দুটি ছিদ্র সহ একটি কাস্টম ওয়াটার ট্যাঙ্ক কভার 3 ডি প্রিন্ট করেছি।

ধাপ 2: সিস্টেম ডিজাইন করা

সিস্টেম ডিজাইন করা
সিস্টেম ডিজাইন করা
সিস্টেম ডিজাইন করা
সিস্টেম ডিজাইন করা

সিস্টেমের যুক্তি

সিস্টেমটি নিম্নলিখিত সাধারণ যুক্তি মাথায় রেখে ডিজাইন করা হয়েছে:

  • সিস্টেমটি সেন্সর এবং জলের পৃষ্ঠের মধ্যে দূরত্ব পর্যবেক্ষণ করে।
  • যখনই দূরত্বের পরিবর্তন থ্রেশহোল্ড মানের উপর চলে যায়, সিস্টেমটি ক্লাউডে তার অবস্থা সম্পর্কে তথ্য পাঠায়।
  • যদি দূরত্বটি সর্বাধিক অনুমোদিত মানের (ট্যাঙ্কটি খালি) অতিক্রম করে, সিস্টেমটি পাম্পটি সক্রিয় করে এবং সর্বনিম্ন অনুমোদিত মানের চেয়ে দূরত্ব কম হলে এটি বন্ধ করে দেয়।
  • যখনই সিস্টেমের অবস্থা পরিবর্তন হয় (উদাহরণস্বরূপ, পাম্প সক্রিয় হয়), এটি ক্লাউডকে অবহিত করে।

ত্রুটির ক্ষেত্রে, একটি স্ল্যাক চ্যানেলে একটি বিজ্ঞপ্তি পাঠানো হয়।

যখন কফি মেশিনটি নিষ্ক্রিয় থাকে, সিস্টেমটি প্রতি মিনিটে একবার ডায়াগনস্টিক ডেটা সহ ক্লাউড পরিষেবাটি পিং করে। উপরন্তু, এটি প্রতি 5 মিনিটে মেঘের কাছে তার অবস্থা পাঠায়।

যখন পাম্প সক্রিয় থাকে, সিস্টেমটি ঘন ঘন তথ্য পাঠায় কিন্তু প্রতি অর্ধ সেকেন্ডে একবারের বেশি নয়।

def পাঠান (ক্লাউড, ভেরিয়েবল, ডিস্ট, error_code = 0, ফোর্স = মিথ্যা): pump_on = is_pump_on () শতাংশ = calc_water_level_percent (dist) ভেরিয়েবল ['দূরত্ব'] ['মান'] = dist ভেরিয়েবল ['ওয়াটার লেভেল'] [' মান '] = শতাংশ ভেরিয়েবল [' PumpRelay '] [' value '] = pump_on ভেরিয়েবল [' অবস্থা '] [' মান '] = calc_status (error_code, শতাংশ, pump_on)

বর্তমান = সময় ()

বৈশ্বিক last_sending_time যদি বল বা বর্তমান - শেষ_সেন্ডিং_টাইম> MIN_SEND_INTERVAL: রিডিং = cloud.read_data () cloud.publish_data (রিডিং) last_sending_time = current

পাম্পের সাথে কাজ করা

আমরা নিম্নলিখিত ধ্রুবকগুলিকে পাম্প অপারেশন লজিকের ভিত্তি হিসাবে সংজ্ঞায়িত করি।

# GPIO পিন (BCM) GPIO_PUMP = 4 GPIO_TRIGGER = 17 GPIO_ECHO = 27

# পাম্প

START_PUMP = 1 STOP_PUMP = 0 PUMP_BOUNCE_TIME = 50 # মিলিসেকেন্ড PUMP_STOP_TIMEOUT = 5 # সেকেন্ড

গুরুত্বপূর্ণ: আপনি যদি পিন 4 ব্যবহার করতে যাচ্ছেন, দ্বন্দ্ব এড়াতে 1-ওয়্যার রাস্পি-কনফিগ অপশনটি অক্ষম করতে ভুলবেন না।

প্রোগ্রামের প্রারম্ভে, আমরা একটি কলব্যাক নিবন্ধন করি এবং প্রারম্ভিক অবস্থাটি OFF এ সেট করি।

পাম্প টগল করে এমন ফাংশনের কোড এখানে দেওয়া হল:

def toggle_pump (value): if pump_disabled: return if is_pump_on ()! = value: log_debug ("[x] % s" % ('START' হলে অন্য মান 'STOP'))) GPIO.setup (GPIO_PUMP, GPIO. OUT) GPIO.output (GPIO_PUMP, মান) # Startালা শুরু/বন্ধ করুন

উপরের স্টার্টআপ কোডে সংজ্ঞায়িত হিসাবে, রিলে চালু হলে, নিম্নলিখিত কলব্যাক বলা হয়:

pump_on = মিথ্যা def pump_relay_handle (pin): global pump_on pump_on = GPIO.input (GPIO_PUMP) log_debug ("পাম্প রিলে % d তে পরিবর্তিত হয়েছে" % pump_on)

কলব্যাকে, আমরা পাম্পের বর্তমান অবস্থা একটি ভেরিয়েবলে সংরক্ষণ করি। অ্যাপ্লিকেশনটির মূল লুপে, আমরা সেই মুহূর্তটি সনাক্ত করতে পারি যখন পাম্পটি টগল করে নীচে দেখানো হয়েছে:

def is_pump_on (): global pump_on return pump_on

যদি GPIO.event_detected (GPIO_PUMP):

is_pouring = is_pump_on () #… log_debug ('[!] পাম্প ইভেন্ট শনাক্ত করা হয়েছে: % s' % ('on' যদি অন্য_ বন্ধ করা হয় 'বন্ধ)) পাঠান (ক্লাউড, ভেরিয়েবল, দূরত্ব, বল = সত্য)

দূরত্ব পরিমাপ

অতিস্বনক প্রক্সিমিটি সেন্সর ব্যবহার করে জলের পৃষ্ঠের দূরত্ব পরিমাপ করা বেশ সহজ। আমাদের সংগ্রহস্থলে, আমরা কয়েকটি পাইথন স্ক্রিপ্ট ভাগ করেছি যা আপনাকে একটি সেন্সর পরীক্ষা করার অনুমতি দেয়।

বাস্তব প্রয়োগে, সেন্সরের রিডিং ওঠানামা করতে পারে কারণ সেন্সরের বাউন্সিং এফেক্ট এবং পানির দোলনা। কিছু ক্ষেত্রে, রিডিং সম্পূর্ণ অনুপস্থিত হতে পারে। আমরা একটি BounceFilter ক্লাস বাস্তবায়ন করেছি যা N সাম্প্রতিক মানগুলি জমা করে, শিখরগুলি বাতিল করে এবং অবশিষ্ট পরিমাপের গড় গণনা করে। পরিমাপ প্রক্রিয়াটি নিম্নলিখিত অ্যাসিঙ্ক্রোনাস অ্যালগরিদম দ্বারা প্রয়োগ করা হয়।

# শেষ সেন্সর পরিমাপ রিডিং রাখে = BounceFilter (size = 6, discard_count = 1)

reading_complete = threading. Event ()

def wait_for_distance ():

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

না পড়লে_ সম্পূর্ণ।

log_info ('রিডিং সেন্সর টাইমআউট') রিটার্ন না রিটার্ন রিডিং। avg ()

def read_distance ():

চেষ্টা করুন: মান = hcsr04.raw_distance (sample_size = 5) বৃত্তাকার = মান যদি মান আর কোনটি বৃত্তাকার না হয় (মান, 1) রিডিংস যোগ করুন (গোলাকার) ব্যতিক্রম ব্যতীত: log_error ('অভ্যন্তরীণ ত্রুটি: % s' % ভুল) অবশেষে: reading_complete.set ()

আপনি উৎসে ফিল্টারের সম্পূর্ণ বাস্তবায়ন খুঁজে পেতে পারেন।

ধাপ 3: জরুরী পরিস্থিতি পরিচালনা করা

জরুরী পরিস্থিতি সামাল দেওয়া
জরুরী পরিস্থিতি সামাল দেওয়া
জরুরী পরিস্থিতি সামাল দেওয়া
জরুরী পরিস্থিতি সামাল দেওয়া
জরুরী পরিস্থিতি সামাল দেওয়া
জরুরী পরিস্থিতি সামাল দেওয়া

যদি সেন্সরটি পুড়ে যায়, বা পড়ে যায়, অথবা একটি ভুল এলাকায় নির্দেশ করে? আমরা এই ধরনের কেস রিপোর্ট করার একটি উপায় প্রয়োজন যাতে আমরা ম্যানুয়াল ব্যবস্থা নিতে পারি।

যদি সেন্সর দূরত্ব রিডিং প্রদান করতে ব্যর্থ হয়, সিস্টেমটি ক্লাউডে পরিবর্তিত অবস্থা পাঠায় এবং একটি সংশ্লিষ্ট বিজ্ঞপ্তি তৈরি করে।

নীচের কোড দ্বারা যুক্তিটি ব্যাখ্যা করা হয়েছে।

দূরত্ব = wait_for_distance () # দূরত্ব না থাকলে বর্তমান জলের গভীরতা পড়ুন: log_error ('দূরত্ব ত্রুটি!') notify_in_background (calc_alert (SENSOR_ERROR)) পাঠান (ক্লাউড, ভেরিয়েবল, দূরত্ব, error_code = SENSOR_ERROR, বল = সত্য)

আমাদের একটি অপারেশনাল ওয়াটার লেভেল রেঞ্জ রয়েছে যা সেন্সরটি তার জায়গায় থাকলে রক্ষণাবেক্ষণ করা উচিত। আমরা পরীক্ষা করি যে বর্তমান জলের স্তর এই পরিসরে পড়ে কিনা:

# সেন্সর থেকে পানির স্তরের দূরত্ব # কফি-মেশিনের পানির ট্যাঙ্কের উপর ভিত্তি করে MIN_DISTANCE = 2 # cm MAX_DISTANCE = 8 # cm

# দূরত্ব প্রত্যাশিত সীমার বাইরে: ingালা শুরু করবেন না

যদি দূরত্ব> MAX_DISTANCE * 2: log_error ('দূরত্ব সীমার বাইরে: %.2f' % দূরত্ব) চালিয়ে যান

আমরা পাম্পটি বন্ধ করি যদি এটি সক্রিয় থাকে যখন একটি ত্রুটি ঘটে।

যদি is_pump_on () এবং prev_distance <STOP_PUMP_DISTANCE + DISTANCE_DELTA: log_error ('[!] পাম্পের জরুরী স্টপ। দূরত্ব সেন্সর থেকে কোন সংকেত নেই')

টগল_পাম্প (STOP_PUMP)

বোতল থেকে পানি ফুরিয়ে গেলে আমরা কেসটি প্রক্রিয়া করি। পাম্প চালানোর সময় পানির স্তর পরিবর্তন হয় কিনা তা আমরা পরীক্ষা করি। যদি তাই হয়, সিস্টেমটি 5 সেকেন্ডের জন্য অপেক্ষা করে এবং তারপর পরীক্ষা করে যে পাম্পটি বন্ধ আছে কিনা। যদি এটি না থাকে, তাহলে সিস্টেমটি জরুরি পাম্প বন্ধ করে দেয় এবং একটি ত্রুটির বিজ্ঞপ্তি পাঠায়।

PUMP_STOP_TIMEOUT = 5 # secsemergency_stop_time = None

def set_emergency_stop_time (এখন, is_pouring):

বৈশ্বিক জরুরী_স্টপ_টাইম জরুরী_স্টপ_টাইম = এখন + PUMP_STOP_TIMEOUT যদি / অন্য_ ourেলে না হয়

def check_water_source_empty (এখন):

জরুরী_স্টপ_টাইম এবং এখন> জরুরী_স্টপ_টাইম ফিরান

# --------- প্রধান লুপ -----------

যদি GPIO.event_detected (GPIO_PUMP): is_pouring = is_pump_on () set_emergency_stop_time (now, is_pouring) #…

গ্লোবাল পাম্প_ অক্ষম

যদি check_water_source_empty (এখন): log_error ('[!] পাম্পের জরুরী স্টপ। / পানির উৎস খালি') toggle_pump (STOP_PUMP) pump_disabled = true

জরুরী স্টপের সময় উপরে তৈরি একটি বার্তা লগের একটি উদাহরণ উপরে।

ধাপ 4: 24/7 সিস্টেম চালানো

24/7 সিস্টেম চালানো
24/7 সিস্টেম চালানো

ডিভাইসের কোডটি ডিবাগ করা হয়েছে এবং সমস্যা ছাড়াই চলে। আমরা এটি একটি পরিষেবা হিসাবে চালু করেছি, তাই রাস্পবেরি পাই পুনরায় চালু হলে এটি পুনরায় চালু হয়। সুবিধার জন্য, আমরা একটি মেকফিল তৈরি করেছি যা স্থাপনা, পরিষেবা চালানো এবং লগগুলি দেখতে সাহায্য করে।

. PHONY: রান স্টার্ট স্টপ স্ট্যাটাস লগ স্থাপন করুন MAIN_FILE: = coffee-pump/main.py SERVICE_INSTALL_SCRIPT: = service_install.sh SERVICE_NAME: = coffee-pump.service

ইনস্টল করুন:

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

চালান:

সুডো পাইথন 3 $ (MAIN_FILE)

শুরু:

sudo systemctl শুরু $ (SERVICE_NAME)

অবস্থা:

sudo systemctl স্ট্যাটাস $ (SERVICE_NAME)

থামান:

sudo systemctl stop $ (SERVICE_NAME)

লগ:

sudo journalctl -u coffee -pump -আজ থেকে

স্থাপন করা:

rsync -av কফি-পাম্প সেন্সর-সেটআপ Makefile *.sh pi@XX. XX. XXX. XXX: ~/

আপনি এই ফাইল এবং সমস্ত প্রয়োজনীয় স্ক্রিপ্ট আমাদের সংগ্রহস্থলে খুঁজে পেতে পারেন।

ধাপ 5: ক্লাউড মনিটরিং

ক্লাউড মনিটরিং
ক্লাউড মনিটরিং
ক্লাউড মনিটরিং
ক্লাউড মনিটরিং
ক্লাউড মনিটরিং
ক্লাউড মনিটরিং
ক্লাউড মনিটরিং
ক্লাউড মনিটরিং

আমরা একটি নিয়ন্ত্রণ প্যানেল বাস্তবায়নের জন্য Cloud4RPi ব্যবহার করেছি। সিস্টেমের প্রয়োজনীয় পরামিতিগুলি নির্দেশ করার জন্য আমরা প্রথমে উইজেট যুক্ত করেছি।

যাইহোক, STATUS ভেরিয়েবলের উইজেট তার মানের উপর ভিত্তি করে বিভিন্ন রঙের স্কিম ব্যবহার করতে পারে (উপরের ছবিটি দেখুন)।

আমরা গতিশীল ডেটা প্রদর্শনের জন্য একটি চার্ট উইজেট যোগ করেছি। নীচের ছবিতে আপনি পাম্প চালু এবং বন্ধ এবং সংশ্লিষ্ট পানির স্তরটি দেখতে পাচ্ছেন।

আপনি যদি আরও দীর্ঘ সময় বিশ্লেষণ করেন, আপনি শিখর দেখতে পাবেন - ঠিক তখনই পাম্পটি চলছিল।

ক্লাউড 4 আরপিআই আপনাকে বিভিন্ন স্মুথিং লেভেল সেট করতে দেয়।

ধাপ 6: এটি কাজ করে

Image
Image

এটা কাজ করে! সম্পূর্ণরূপে কন্ট্রোল প্যানেলটি নীচে দেখানো হয়েছে।

বর্তমানে, আমাদের স্বয়ংক্রিয় পাম্পটি কয়েক সপ্তাহ ধরে চলছে এবং আমাদের যা করতে হবে তা হ'ল জলের বোতলগুলি প্রতিস্থাপন করা। আমাদের প্রকল্পের সম্পূর্ণ কোডটি আমাদের গিটহাব সংগ্রহস্থলে পাওয়া যায়।

প্রস্তাবিত: