الثلاثاء، 3 مارس 2020

How to Use Arduino + VL53L0X to Build a Liquid Level Sensing Device- كيفية بناء جهاز استشعار مستوى السائل بأستخدام اردوينو

في هذه المقالة ، تعلم بناء مستشعر قادر على اكتشاف مستوى السائل في أي وعاء يحتويه
سوف تتعلم كيفية إنشاء جهاز استشعار مستوى السائل  بدون تلامس باستخدام Arduino وشاشة I2C OLED ووحدة استشعار VL53L0X.

طرق مختلفة لقياس مستوى السائل
في معظم الأوقات ، تستخدم الصناعات طريقة مجس غمر لقياس مستوى السائل. طريقة الغرق في المسبار هي قياس الأسلوب الذي يوضع فيه السائل في السائل لقياس الموصلية. يتم إجراء هذا القياس بشكل أساسي عن طريق قياس تغيير المقاومة الناجم عن التغير في مستوى الماء. الصورة أدناه توضح هذا النوع من الطريقة.



تتضمن الطريقة الأخرى المستخدمة في أنظمة مستوى السائل اكتشاف الحالة الكاملة للسائل فقط. على سبيل المثال ، المضخات الآلية التي تتوقف عن العمل تلقائيًا عندما تكتشف أن خزان المياه ممتلئ. في هذا النظام ، سيكون هناك مستشعر ذو قاعدة عائمة يقوم بإيقاف التدفق ميكانيكياً ، وعادة ما تكون هذه الأنظمة مدمجة وعاطلة عن الأعطال الميكانيكية.

في هذا المشروع ، سوف نستخدم طريقة ثالثة: وحدة استشعار تعتمد على الليزر بدون تلامس تستخدم شريحة استشعار VL53L0X.

ما هو VL53L0X؟
تستخدم وحدة استشعار VL53L0X تقنية تحديد المسافة من وقت الطيران (ToF). إنها ترتد أشعة الليزر IR غير المرئية من أي سطح وتقيس الوقت الذي يستغرقه الضوء للوصول إلى الكاشف.

Liquid_Level_Arduino_VL53L0Xim_RW_MP_image9.jpg

و VL53L0X

يأتي الطراز VL53L0X في لوحة جانبية صغيرة مع منظم مدمج وجهاز قادر على I2C.

تشمل المواصفات الأخرى:
الوزن: 0.5 غرام
العمل الجهد: بين 2.6 V إلى 5.5 V
الاستهلاك الحالي: 10 مللي أمبير ، يمكن أن تصل إلى ذروة الحالية 40 مللي أمبير.
أبعاد الحجم والعرض: 0.5 ″ × 0.7 ″ × 0.085 ″ (13 ملم × 18 ملم × 2 ملم)
التواصل مع ميكروكنترولر (I²C): قراءة مسافة 16 بت (بالمليمترات)
نطاق هذا المستشعر: يصل إلى 2 متر (6.6 قدم)

اردوينو اسكتشات
نحن نستخدم رسومات اردوينو. لدينا أول رسم اردوينو هو رسم المعايرة. سنقوم هنا بقياس مسافة الحاوية السائلة الفارغة من الأعلى إلى الأسفل بالملليمتر. بعد ذلك ، سنقوم بمعايرة مخطط اردوينو الثاني بناءً على بيانات الرسم الأول.

الأجهزة المطلوبة
اردوينو UNO
شاشة OLED i2c
لوح الربط
أسلاك العبور
وحدة استشعار VL53L0X

Liquid_Level_Arduino_VL53L0Xim_RW_MP_image3.jpg

البرامج المطلوبة
اردوينو بيئة تطوير متكاملة
مكتبة VL53L0X.
SSD1306
الأسلاك الأجهزة
قم بتوصيل الجهاز كما هو موضح أدناه في المخطط 

Liquid_Level_Arduino_VL53L0Xim_RW_MP_image7.png

معايرة الحاوية السائلة
من أجل معايرة الحاوية السائلة ، قم ببساطة بتعيين وحدة استشعار VL53L0X في أعلى الحاوية ولاحظ القيمة من وحدة شاشة OLED. في حالتي ، أنا أستخدم زجاجة مشروب غازي قديم وقبعة. لقد صنعت ثقبًا على غطاء هذه الزجاجة الفارغة وأضع المستشعر عليها كما هو موضح أدناه في الصورة.
Liquid_Level_Arduino_VL53L0Xim_RW_MP_image5.jpg

انسخ المخطط الأول الموجود في نهاية هذه المقالة. بعد تحميل الكود ، ضع المستشعر في أعلى الزجاجة ولاحظ المسافة بالمليمترات على شاشة OLED. استخدم هذه القيمة داخل المخطط الثاني (أيضًا في نهاية هذه المقالة).

Liquid_Level_Arduino_VL53L0Xim_RW_MP_image2.jpg

بعد تغيير القيمة أعلاه في رسم Arduino الثاني ، قم بتحميل الكود. الآن سوف تبدأ اردوينو عرض مستوى السائل كنسبة مئوية. على سبيل المثال ، إذا كانت حاوية الزجاجة / السائل فارغة تمامًا ، فسوف تعرض 100٪ فارغة على شاشة OLED. إذا كان نصف ممتلئ ، فسيتم عرض 50٪ فارغة وهكذا.

إذا تجاوزت القيمة 100٪ ، فقم بمعايرة الإنشاء مرة أخرى للحصول على نتيجة دقيقة.

كود البرمجة

        Calibration Sketch
#include <Wire.h>
#include <VL53L0X.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <MedianFilter.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

VL53L0X sensor;

MedianFilter test(10, 0);

void setup()
{
  Serial.begin(9600);
  Wire.begin();

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

  sensor.init();
  sensor.setTimeout(500);

#if defined LONG_RANGE
  // lower the return signal rate limit (default is 0.25 MCPS)
  sensor.setSignalRateLimit(0.1);
  // increase laser pulse periods (defaults are 14 and 10 PCLKs)
  sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
  sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
#endif

#if defined HIGH_SPEED
  sensor.setMeasurementTimingBudget(20000);
#elif defined HIGH_ACCURACY
  // increase timing budget to 200 ms
  sensor.setMeasurementTimingBudget(200000);
#endif

  // Clear the buffer.
  display.clearDisplay();
  display.setRotation(2);
  display.display();

  
  display.setTextColor(WHITE);
  
  
}
void displayDistance( int val){
  display.clearDisplay();
  display.setTextSize(4);
  display.setCursor(0,0);
  display.print(val);

  display.setTextSize(2);
  display.setCursor(0,30);
  display.print("mm");
  display.display();
  delay(100);
}
void loop()
{
  int o,r = sensor.readRangeSingleMillimeters();
  test.in( r );
  o = test.out();
  Serial.print(o);
  if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }

  Serial.println();

  displayDistance( o );
  
}


Project Sketch 
#include <Wire.h>
#include <VL53L0X.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <MedianFilter.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
int total=245; //Enter your Empty bottle value in Milimeter over here 
float per;
VL53L0X sensor;

MedianFilter test(10, 0);

#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
*/
void setup()
{
  Serial.begin(9600);
  Wire.begin();

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

  sensor.init();
  sensor.setTimeout(500);

#if defined LONG_RANGE
  // lower the return signal rate limit (default is 0.25 MCPS)
  sensor.setSignalRateLimit(0.1);
  // increase laser pulse periods (defaults are 14 and 10 PCLKs)
  sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
  sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
#endif

#if defined HIGH_SPEED
  // reduce timing budget to 20 ms (default is about 33 ms)
  sensor.setMeasurementTimingBudget(20000);
#elif defined HIGH_ACCURACY
  // increase timing budget to 200 ms
  sensor.setMeasurementTimingBudget(200000);
#endif

  // Clear the buffer.
  display.clearDisplay();
  display.setRotation(2);
  display.display();
  display.setTextColor(WHITE);
  
}
void displayDistance( float val){
  display.clearDisplay();
  display.setTextSize(2);
  display.setCursor(0,0);
  display.print(val);

  display.setTextSize(2);
  display.setCursor(38,17);
  display.print("% Empty");
  display.display();
  delay(100);
}
void loop()
{
  float o,r = sensor.readRangeSingleMillimeters();
  test.in( r );
  o = test.out();

  if(o<50)
  {
  display.clearDisplay();
  display.setTextSize(1);
  display.setCursor(0,0);
  display.print("Full");
   display.display();
  Serial.println("Full");
  delay(100);
    
    }
   int t= total;
   
   per=(o/t)*100;

  displayDistance( per );

  if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
  Serial.print("value of : sensor");
  Serial.println(o);
  Serial.println();
  Serial.print(per);
  Serial.println("%");  
   
   return;
  
}




ليست هناك تعليقات:

إرسال تعليق