تصميم ميزان باستخدام الاردوينو


مقدمة

سنقوم في هذه التجربة بتصميم ميزان رقمي باستخدام الاردوينو وحساس الوزن. ويمكن لهذا المشروع أن يقيس حتى وزن 40 كيلو جرام، ويمكن زيادة إمكانيات هذا الميزان ليقيس أوزان أكبر من 40 كيلو جرام عن طريق استخدام وحدة تحميل (Load Cell) ذات إمكانيات أكبر.

الأدوات المستخدمة

unnamed file

الأداة العدد ملاحظات
اردوينو اونو ١
حساس الوزن HX711 ١
وحدة تحميل (Load Cell) ١ 40 كيلو جرام
لوحة توصيل ١
زر ضغط ١
شاشة 16×2 LCD ١
مقاومة متغيرة 10Kᘯ ١
إطار وقاعدة ومسامير حسب الحاجة الصور في الأسفل توضح تركيب الأجزاء
أسلاك توصيل (ذكر-أنثى) حسب الحاجة

الجزء النظري

وحدة التحميل (Load Cell)

Load cell 40kg

تتكون الوحدة من أربع حساسات ضغط (Strain Gauges) تتصل ببعضها على شكل قنطرة ونستون (Winston Bridge) وتقوم بقياس الضغط المؤثر عليها عن طريق تحويله إلى جهد كهربائي. يتناسب مقدار الجهد طرديًا مع القوة المؤثرة عليه نظرًا لأن الضغط على الوحدة يقوم بتقليل المقاومة داخلها وبذلك يزيد مرور التيار. لكل وحدة تحميل قيمة قصوى للوزن لا تستطيع تجاوزها، ويمكن أن تجد وحدات تحمل تقيس الأوزان إلى 5 كجم، 10 كجم، 40 كجم، 100 كجم وغيرها.

نستخدم في هذا المشروع وحدة تحميل تستطيع قياس الوزن إلى 40 كجم.

تقدر قيمة الجهد الكهربائي الناتج عن وحدة التحميل بالملي فولت، ثم تنتقل الإشارات الكهربائية إلى حساس الوزن.

حساس الوزن HX711

HX711 weight sensor module

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

خطوات التوصيل

اتبع الصورة التالية لتتمكن من توصيل الدائرة

load sensor bb

منافذ Load Cell Amplifier HX711 منافذ Load Cell
E+ الأحمر
E- الأبيض
A- الأسود
A+ الأخضر

طريقة تركيب أجزاء الميزان

Load cell with frame and base 2

Load cell with frame and base 1

load cell and HX711 weight sensor

الكود البرمجي

نحتاج إلى تحميل المكتبة (LiquidCrystal.h) ليعمل الكود بدون أخطاء

قم بنسخ الكود ولصقه في برنامج الاردوينو وشاهد إنجازك !

الكود البرمجي

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 10, 11, 12, 13);

#define DT A0
#define SCK A1
#define sw 2

long sample=0;
float val=0;
long count=0;

unsigned long readCount(void)
{
  unsigned long Count;
  unsigned char i;
  pinMode(DT, OUTPUT);
  digitalWrite(DT,HIGH);
  digitalWrite(SCK,LOW);
  Count=0;
  pinMode(DT, INPUT);
  while(digitalRead(DT));
  for (i=0;i<24;i++)
  {
    digitalWrite(SCK,HIGH);
    Count=Count<<1;
    digitalWrite(SCK,LOW);
    if(digitalRead(DT)) 
    Count++;
  }
  digitalWrite(SCK,HIGH);
  Count=Count^0x800000;
  digitalWrite(SCK,LOW);
  return(Count);
}

void setup()
{
  Serial.begin(9600);
  pinMode(SCK, OUTPUT);
  pinMode(sw, INPUT_PULLUP);
  lcd.begin(16, 2);
  lcd.print("    Weight ");
  lcd.setCursor(0,1);
  lcd.print(" Measurement ");
  delay(1000);
  lcd.clear();
  calibrate();
}

void loop()
{
  count= readCount();
  int w=(((count-sample)/val)-2*((count-sample)/val));
  Serial.print("weight:");
  Serial.print((int)w);
  Serial.println("g");
  lcd.setCursor(0,0);
  lcd.print("Weight            ");
  lcd.setCursor(0,1);
  lcd.print(w);
  lcd.print("g             ");

  if(digitalRead(sw)==0)
  {
    val=0;
    sample=0;
    w=0;
    count=0;
    calibrate();
  }
}

void calibrate()
{
    lcd.clear();
  lcd.print("Calibrating...");
  lcd.setCursor(0,1);
  lcd.print("Please Wait...");
  for(int i=0;i<100;i++)
  {
    count=readCount();
    sample+=count;
    Serial.println(count);
  }
  sample/=100;
  Serial.print("Avg:");
  Serial.println(sample);
  lcd.clear();
  lcd.print("Put 100g & wait");
  count=0;
  while(count<1000)
  {
    count=readCount();
    count=sample-count;
    Serial.println(count);
  }
  lcd.clear();
  lcd.print("Please Wait....");
  delay(2000);
  for(int i=0;i<100;i++)
  {
    count=readCount();
    val+=sample-count;
    Serial.println(sample-count);
  }
  val=val/100.0;
  val=val/100.0;        // put here your calibrating weight
  lcd.clear();
}

فيديو للتجربة

المصدر

مصدر التجربة

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *