ساخت یک مولتی متر دیجیتال با آردوینو

فهرست مطالب

مقدمه

یکی از مهم ترین وسیله های مورد نیاز برای انجام پروژه های الکترونیکی مولتی متر می باشد. اهمیت این وسیله به قدری بالاست که می توان گفت بدون آن انجام بسیاری از پروژه های الکترونیکی بسیار دشوار می شود. در این آموزش قصد داریم با استفاده از بورد آردوینو و نمایشگر OLED یک مولتی متر دیجیتال کم هزینه که قابلیت اندازه گیری ولتاژ، جریان، مقاومت و ظرفیت خازن را دارد، بسازیم. بعد از انجام این پروژه به راحتی می توانید با کمترین هزینه صاحب یک مولتی متر شوید.

آنچه در این آموزش یاد می گیرید

مولتی متر چیست؟

به زبان ساده، مولتی متر ابزاریست که کمیت های الکتریکی، نظیر ولتاژ، جریان و … را به زبان قابل فهم ما تبدیل می کند. وقتی در سال 1820 نمونه های اولیه این وسیله پرکاربرد که فقط قابلیت اندازه گیری جریان را داشتند (بنام گالوانومتر) ساخته شد، به جزء جدانشدنی پروژه های الکترونیکی تبدیل شد.
مولتی متر ها به طور کلی به دو دسته اصلی آنالوگ و دیجیتال تقسیم می شوند. مولتی متر های آنالوگ برای نمایش کمیت های الکتریکی از عقربه استفاده می کنند و امروزه کاربردشان بسیار کاهش پیدا کرده است، اما مولتی مترهای دیجیتال برای نمایش کمیت ها از صفحه نمایشگر استفاده می کنند که به همین دلیل بسیار رایج تر می باشند.

نمونه ای از یک مولتی متر آنالوگ

نمونه ای از یک مولتی متر دیجیتال

مولتی متر چه کمیت های را اندازه گیری می کند؟

مولتی متر ها کمیت های مختلفی را اندازه گیری می کنند، اما مهم ترین کمیت هایی که یک مولتی متر باید اندازه گیری کند، مقدار ولتاژ، مقدار جریان و مقدار مقاومت الکتریکی است. از جمله کمیت های دیگری که مولتی مترها اندازه گیری می کنند می توان به ظرفیت خازن، اندوکتانس سلف، فرکانس، تست دیود، تست اتصال، شدت روشنایی، تست ترانزیستور و … اشاره کرد. ما در این پروژه قصد داریم مولتی متری بسازیم که ولتاژ، جریان، مقاومت و ظرفیت خازنی را اندازه گیری کند.

اندازه گیری ولتاژ الکتریکی

روش های مختلفی برای اندازه گیری ولتاژ از جمله استفاده از اثر هال وجود دارد، اما ساده ترین روش برای اندازه گیری ولتاژ استفاده از تکنیک تقسیم مقاوتی است. مدار تقسیم مقاومتی یک مدار الکتریکی است که کسری از ولتاژ ورودی را بین دو مقاومت قرار می دهد.
حال اگر مقدار مقاومت R1 و R2 معلوم باشد و مقدار Vout را بدانیم می توانیم به راحتی با استفاده از رابطه بالا مقدار ولتاژ ورودی را اندازه گیری کنیم.

اندازه گیری جریان الکتریکی

برای اندازه گیری جریان ساده ترین کار استفاده از قانون اهم می باشد. این قانون بیان می دارد که جریان الکتریکی یک مسیر با نسبت ولتاژ به مقاومت آن مسیر رابطه دارد.

یکی دیگر از روش های اندازه گیری جریان استفاده از قانون اثر هال می باشد، عبور جریان الکتریکی باعث ایجاد میدان مغناطیسی و در نتیجه ایجاد ولتاژ هال می شود، با اندازه گیری ولتاژ هال می توان شدت میدان و درنتیجه میزان جریان عبوری را اندازه گیری کرد.

اندازه گیری مقاومت الکتریکی

برای اندازه گیری مقاومت می توان از همان تکنیک تقسیم مقاومتی استفاده کرد. با این تفاوت که در اینجا ولتاژ ورودی، مقاومت R1 و ولتاژ خروجی معلوم است و مقاومت R2 مجهول می باشد.

اندازه گیری ظرفیت خازن

یکی از موثر ترین روش ها برای اندازه گیری ظرفیت خازن استفاده از قانون شارژ و دشارژ خازن است.

زمان شارژ شدن خازن با نمودار زیر تطابق دارد.

وقتی خازن به میزان 63.2% شارژ شود یک ثابت زمانی طی شده است، ثابت زمانی به صورت رابطه زیر بیان می شود:
τ^((second))=R×C
پس با دانستن مقدار مقاومت و اندازه گیری زمان شارژ خازن به میزان 63.2% می توانیم مقدار خازن را اندازه گیری کنیم.

لوازمی که به آن احتیاج دارید

قطعات مورد نیاز

آردوینو UNO R3 × 1
ماژول نمایشگر 0.96 اینچ OLED با ارتباط IIC × 1
سنسور جریان ACS712 × 1
مقاومت 1k × 1
مقاومت 10k × 2
مقاومت 100k × 1
مقاومت 4.7k × 1
مقاومت 220 اهم × 1
سیم جامپر نری به مادگی × 1
تک سوئیچ (میکرو سوئیچ) 6x6x5 - بسته 20 تایی × 1

نرم افزارهای مورد نیاز

Arduino IDE

ساخت یک مولتی متر دیجیتال با آردوینو

ساخت این مولتی متر شامل 5 مرحله می باشد:

مرحله اول) ساخت ولت متر

برای ساخت ولت متر از تکنیک تقسیم مقاومتی استفاده می کنیم. برای خواندن ولتاژ به واحد ADC آردوینو احتیاج داریم.

سیم بندی

برای اندازه گیری ولتاژ در اینجا از تقسیم مقاومتی 10 و 4.7 کیلو استفاده شده است.

مدار زیر را ببندید:

هشدار
دقت داشته باشید از آنجایی که ولتاژ ورودی واحد ADC آردوینو حداکثر 5 ولت می باشد، با انتخاب این مقاومت ها حداکثر ولتاژ قابل اندازه گیری حدود 15 ولت می باشد. اعمال ولتاژ بیشتر ممکن است به بورد آردوینو شما آسیب برساند.

با تغییر مقدار مقاومت ها می توانید رنج ولتاژ ورودی را تغییر دهید، هر چه رنج ولتاژ ورودی بیشتر باشد دقت اندازه گیری افت پیدا می کند.

نکته
برای اندازه گیری ولتاژ باید ولت متر بصورت موازی با نقطه مورد نظر برای اندازه گیری ولتاژ قرار گیرد.

کد

کد زیر را روی آردوینوی خود آپلود کنید و نتیجه را در پنجره سریال مشاهده کنید.
/* 
  Voltmeter with Arduino 
   modified on 21 Jul 2019 
  by Saeed Hosseini @ Electropeak 
  https://electropeak.com/learn 
*/ 
const int VoltMeter = 2; 
float V = 0.00; 
void calculate_voltage() { 
  float R1 = 10000.00; 
  float R2 = 4700.00; 
  float v_ref = 5.00; 
  float resistor_ratio = 0.00;
  float adc_value = 0.00; 
  float voltage = 0.00; 
  resistor_ratio = (R2 / (R1 + R2)); 
  for (int i = 0; i < 20 ; i++) 
  { 
    adc_value = adc_value + analogRead(VoltMeter);
    delay(3); 
  } 
  adc_value = adc_value / 20; 
  voltage = ((adc_value * v_ref) / 1024); 
  V = voltage / resistor_ratio; 
} 
void setup() { 
  Serial.begin(9600); 
} 
void loop() { 
  calculate_voltage(); 
  Serial.print(V); 
  Serial.println(" v"); 
  delay(2000); 
} 
در اینجا با اعمال رابطه ریاضی تقسیم مقاومتی در کد و خواندن ولتاژ از طریق واحد ADC مقدار ولتاژ ورودی را برحسب ولت اندازه گیری می کنیم.
برای پیدا کردن ولتاژ از طریق واحد ADC از نسبت تناسب زیر استفاده می کنیم:

مرحله دوم) ساخت آمپر متر

برای ساخت آمپر متر از سنسور AC712 استفاده می کنیم، این سنسور به صورت ماژول در رنج های مختلف موجود است.  در اینجا از رنج 5 آمپر این سنسور استفاده شده است.

این سنسور با استفاده از قانون اثر هال جریان را اندازه گیری می کند و بعنوان خروجی یک ولتاژ متناسب با جریان بر می گرداند، به این صورت که به ازای هر آمپر جریان، مقدار 185 میلی ولت ولتاژ در خروجی آن قرار می گیرد.

سیم بندی

مدار زیر را ببندید.
نکته
برای اندازه گیری جریان، آمپرمتر باید بصورت سری با نقطه مورد نظر برای اندازه گیری جریان، قرار گیرد.

کد

کد زیر را روی آردوینوی خود آپلود کنید و نتیجه را در پنجره سریال مشاهده کنید.
/* 
  Ammeter with Arduino 
  modified on 21 Jul 2019 
  by Saeed Hosseini @ Electropeak 
  https://electropeak.com/learn 
*/ 
const int Ammeter = A2; 
float I = 0.00; 
void calculate_current() { 
  int sensitivity = 185; 
  int adc_value = 0; 
  float v_ref = 4.94; 
  float voltage = 0.00; 
  float pure_voltage = 0.00; 
  float offset_voltage = 2.47; 
  for (int i = 0; i < 40 ; i++) 
  { 
    adc_value = adc_value + analogRead(Ammeter); 
    delay(2); 
  } 
  adc_value = adc_value / 40; 
  voltage = ((adc_value * v_ref) / 1024); 
  pure_voltage = voltage - offset_voltage; 
 // if(pure_voltage > 0.001) pure_voltage = 0.00; 
  pure_voltage = pure_voltage * 1000; 
  I = pure_voltage / sensitivity; 
  Serial.println(String("ADC = ") + adc_value ); 
  Serial.println(String("V = ") + voltage + "v"); 
  Serial.println(String("Pure = ") + pure_voltage + "mv"); 
  Serial.println(String("I = ") + I + "A"); 
} 
void setup() { 

  Serial.begin(9600); 
} 
void loop() { 
  calculate_current(); 
  //Serial.println(String("I = ") + I + " mA");
  delay(2000); 
} 
در اینجا نیز ولتاژ خروجی سنسور توسط واحد ADC قرائت شده و با توجه به نسبت هر آمپر معادل 185 میلی ولت جریان محاسبه می شود.
نکته
برای اولین راه اندازی سنسور ابتدا سنسور را بدون هیچ باری راه اندازی کنید، ولتاژ خروجی سنسور در این حالت چیزی حدود 2.5 ولت خواهد بود، مقدار دقیق این ولتاژ را خوانده و با متغیر offset_voltage جایگزین کنید.

مرحله سوم) ساخت اهم متر

برای ساخت اهم متر نیز از همان تکنیک تقسیم مقاومتی استفاده شده است. مساله مهم در ساخت اهم متر رنج اندازه گیری مقاومت هاست، هرچه مقدار مقاومت مجهول از مقاومت معلوم دورتر باشد دقت مقدار اندازه گیری شده افت می کند، برای حل این مشکل باید از چند مقاومت برای افزایش رنج استفاده کرد، می توان بین این مقاومت ها با سوئیچ جا به جا شد یعنی رنج مقاومت را بصورت دستی تغییر داد و یا اینکه این کار را بصورت خودکار انجام داد. برای خودکار کردن تنظیم رنج مقاومت، مقاومت مجهول را به صورت تک به تک با مقاومت های معلوم اندازه گیری می کنیم و در نهایت با توجه به مقدار مقاومت های معلوم و مقدار های اندازه گیری شده، مقدار دقیق تر مقاومت مجهول را بدست می آوریم. در اینجا از سه رنج 1، 10 و 100 کیلو استفاده شده است، که می توانید رنج ها را کمتر یا بیشتر کنید.

سیم بندی

برای تعیین رنج از مقاومت های 1، 10 و 100 کیلویی استفاده شده است.
مدار زیر را ببندید.

کد

کد زیر را روی آردوینوی خود آپلود کنید و نتیجه را در پنجره سریال مشاهده کنید.
/*
  Ohmmeter with Arduino - Automatic range 
  modified on 21 Jul 2019 
  by Saeed Hosseini @ Electropeak 
  https://electropeak.com/learn 
*/ 
const int OhmMeter = 0; 
const int R3 = 6; 
const int R2 = 5; 
const int R1 = 4; 
float R = 0.00; 
void calculate_resistor() { 
  float v_ref = 4.94; 
  float r1 = 0.00; 
  float r_ref1 = 1000.00; 
  float adc_value1 = 0.00;
  float voltage1 = 0.00; 
  float r2 = 0.00; 
  float r_ref2 = 10000.00;
  float adc_value2 = 0.00;
  float voltage2 = 0.00; 
  float r3 = 0.00; 
  float r_ref3 = 100000.00; 
  float adc_value3 = 0.00;
  float voltage3 = 0.00; 
  pinMode(R1, OUTPUT); 
  pinMode(R2, INPUT); 
  pinMode(R3, INPUT); 
  digitalWrite(R1, HIGH); 
  for (int i = 0; i < 20 ; i++) 
  { 
    adc_value1 = adc_value1 + analogRead(OhmMeter); 
    delay(3); 
  } 

  adc_value1 = adc_value1 / 20; 

  if (adc_value1 < 1022.90) 
  { 
    voltage1 = ((adc_value1 * v_ref) / 1024); 
    r1 = (voltage1 * r_ref1) / (v_ref - voltage1); 
  } 
  pinMode(R1, INPUT); 
  pinMode(R2, OUTPUT); 
  pinMode(R3, INPUT); 
  digitalWrite(R2, HIGH); 
  for (int i = 0; i < 20 ; i++) 
  { 
    adc_value2 = adc_value2 + analogRead(OhmMeter); 
    delay(3); 
  } 
  adc_value2 = adc_value2 / 20; 
  if (adc_value2 < 1022.90) 
  { 
    voltage2 = ((adc_value2 * v_ref) / 1024); 

    r2 = (voltage2 * r_ref2) / (v_ref - voltage2); 
  } 
  pinMode(R1, INPUT); 
  pinMode(R2, INPUT); 
  pinMode(R3, OUTPUT); 
  digitalWrite(R3, HIGH); 
  for (int i = 0; i < 20 ; i++) 
  { 
    adc_value3 = adc_value3 + analogRead(OhmMeter); 
    delay(3); 
  } 
  adc_value3 = adc_value3 / 20; 
  if (adc_value3 < 1022.90) 
  { 
    voltage3 = ((adc_value3 * v_ref) / 1024); 
    r3 = (voltage3 * r_ref3) / (v_ref - voltage2); 
  } 
  r1 = r1 / 1000; 

  r2 = r2 / 1000; 

  r3 = r3 / 1000; 
  if (r1 < 2 && r2 < 101 && r3 < 1001) R = r1*1000; 
  else if (r1 > 2 && r2 < 101 && r3 < 1001) R = r2; 
  else if (r1 > 2 && r2 > 101 && r3 < 2000) R = r3; 
  else R = 0.00; 
  Serial.print("R = "); 

  Serial.println(R, 2); 
} 
void setup() { 

  Serial.begin(9600); 
} 
void loop() { 
  calculate_resistor(); 
  Serial.println("_________________________________________"); 

  delay(2500); 
} 
در این کد مقاومت مجهول تک به تک با مقاومت های معلوم اندازه گیری می شود و سپس با استفاده از شرط ها مقاومت اصلی استخراج می شود.
نکته
برای اندازه گیری دقیق مقاومت و روشن و خاموش کردن پایه های دیجیتال آردوینو، نمی توان صرفا به low کردن آنها بسنده کرد، برای خاموش کردن کامل پایه ها باید آنها بصورت ورودی تعریف شوند.

مرحله چهارم) ساخت ظرفیت سنج خازن

برای اندازه گیری ظرفیت خازن از همان الگوریتم زمان شارژخازن استفاده شده است. فقط لازم به تذکر است که بعد از اندازه گیری خازن باید آن را دشارژ کنیم تا برای اندازه گیری بعدی آماده شود.

سیم بندی

اینجا برای شارژ خازن از مقاومت 10 کیلویی و برای دشارژ آن از مقاومت 220 اهمی استفاده شده است.

مدار زیر را ببندید.

کد

کد زیر را روی آردوینوی خود آپلود کنید و نتیجه را در پنجره سریال مشاهده کنید.

/*
  Capacitance meter with Arduino 
  modified on 21 Jul 2019 
  by Saeed Hosseini @ Electropeak 
  base on: https://www.arduino.cc/en/Tutorial/CapacitanceMeter 
  https://electropeak.com/learn 
*/ 
const int CapacitancMeter = 1; 
const int ChargePin = 13; 
const int DischargePin = 11; 
float C = 0.00; 
void calculate_capacitance() { 
  unsigned long start_time;
  unsigned long elapsed_time; 
  float microFarads; 
  float nanoFarads; 
  float r_ref = 10000.00; 
  digitalWrite(ChargePin, HIGH); 
  start_time = millis(); 
  while (analogRead(CapacitancMeter) < 648) {} 
  elapsed_time = millis() - start_time; 
  microFarads = ((float)elapsed_time / r_ref) * 1000; 
  if (microFarads > 1)  
  { 
    C = microFarads; 
  } 

  else 
  { 
    nanoFarads = microFarads * 1000.0; 
    C = nanoFarads; 
  } 
  digitalWrite(ChargePin, LOW);              
  pinMode(DischargePin, OUTPUT);             
  digitalWrite(DischargePin, LOW);          
  while (analogRead(CapacitancMeter) > 0) {} 
  pinMode(DischargePin, INPUT);             
} 

void setup() { 
  Serial.begin(9600); 
  pinMode(ChargePin, OUTPUT); 

  digitalWrite(ChargePin, LOW); 
} 
void loop() { 
  calculate_capacitance(); 
  Serial.println(C); 

  delay(2000); 
} 

الگوریتم اندازه گیری به این صورت است:

  • شروع شارژ خازن و ثبت زمان شروع با دستور millis().
  • ادامه شارژ تا رسیدن به 63.2% ظرفیت خازن (این مقدار معادل 648 در ADC است)
  • ثبت زمان سپری شده برای 63.2% شارژ شدن خازن
  • پیدا کردن خازن از طریق رابطه ثابت زمانی با معلوم بودن مقاومت و زمان.
  • دشارژ کردن کامل خازن.
نکته
اگر مقدار مقاومت معلوم را بیشتر کنید زمان شارژ شدن بیشتر می شود که باعث بهبود دقت اندازه گیری می شود ولی طولانی تر شدن زمان شارژ باعث کاهش رنج ظرفیت های اندازه گیری شده می شود، اگر مقاومت را کمتر کنید زمان شارژ کوتاه تر می شود که باعث افزایش رنج ظرفیت های اندازه گیری شده می شود ولی دقت را کاهش می دهد.

مرحله پنجم) ترکیب کردن چهار مرحله قبل و اضافه کردن نمایشگر

حال که تمام کمیت های مدنظر را اندازه گیری کردید، با اضافه کردن نمایشگر OLED و دو کلید برای جا به جایی بین منو ها مولتی متر خود را تکمیل کنید.

سیم بندی

مدار زیر را ببندید.

کد

کد زیر را روی آردوینو خود آپلود کنید.
/*
  Digital Multimeter with Arduino and OLED 
  modified on 21 Jul 2019 
  by Saeed Hosseini @ Electropeak 
  https://electropeak.com/learn 
*/ 
#include <Wire.h> 
#include <Adafruit_GFX.h> 
#include <Adafruit_SSD1306.h> 
#include "logo.h" 
#define SCREEN_WIDTH 128 
#define SCREEN_HEIGHT 32 
#define OLED_RESET -1 
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); 
const int select_button = 2; 
const int right_button = 3; 
const int OhmMeter = A0; 
const int CapacitancMeter = A1; 
const int VoltMeter = A2; 
const int Ammeter = A3; 
const int R3 = 6; 
const int R2 = 5; 
const int R1 = 4; 
const int ChargePin = 13; 
const int DischargePin = 11; 
boolean is_select = false;
int navigator = 0; 
int flag = 0; 
float R = 0.00; 
float V = 0.00; 
float I = 0.00; 
float C = 0.00; 
boolean nano = false; 
boolean kilo = false; 
boolean mili = false; 
void OLED_init() { 
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) 
  { 
    Serial.println(F("SSD1306 allocation failed")); 
    for (;;); 
  } 
  display.clearDisplay(); 
  diplay_logo(15, 3, Electropeak, F_LOGO_WIDTH, F_LOGO_HEIGHT); 
  display.display(); 
  delay(2000); 
  display_clear(); 
} 
void display_clear() { 
  display.clearDisplay(); 
  display.display(); 
} 
void diplay_logo(int x, int y, const uint8_t *bitmap, int w, int h) { 
  display.drawBitmap(x, y, bitmap, w, h, WHITE); 
} 
void display_text(int sz, int x, int y, String str) { 
  display.setTextSize(sz);
  display.setTextColor(WHITE); 
  display.setCursor(x, y);
  display.println(str); 
} 
void display_number(int sz, int x, int y, double num) { 
  display.setTextSize(sz);
  display.setTextColor(WHITE); 
  display.setCursor(x, y);
  display.println(num); 
} 
void calculate_resistor() { 
  float v_ref = 4.94; 
  float r1 = 0.00; 
  float r_ref1 = 1000.00; 
  float adc_value1 = 0.00;
  float voltage1 = 0.00; 
  float r2 = 0.00; 
  float r_ref2 = 10000.00;
  float adc_value2 = 0.00;
  float voltage2 = 0.00; 
  float r3 = 0.00; 
  float r_ref3 = 100000.00; 
  float adc_value3 = 0.00;
  float voltage3 = 0.00; 
  pinMode(R1, OUTPUT); 
  pinMode(R2, INPUT); 
  pinMode(R3, INPUT); 
  digitalWrite(R1, HIGH); 
  for (int i = 0; i < 20 ; i++) 
  { 

    adc_value1 = adc_value1 + analogRead(OhmMeter); 
    delay(3); 
  } 
  adc_value1 = adc_value1 / 20; 

  if (adc_value1 < 1022.90) 

  { 

    voltage1 = ((adc_value1 * v_ref) / 1024); 

    r1 = (voltage1 * r_ref1) / (v_ref - voltage1); 

  } 

 

  pinMode(R1, INPUT); 

  pinMode(R2, OUTPUT); 

  pinMode(R3, INPUT); 

  digitalWrite(R2, HIGH); 

  for (int i = 0; i < 20 ; i++) 

  { 

    adc_value2 = adc_value2 + analogRead(OhmMeter); 

    delay(3); 

  } 

  adc_value2 = adc_value2 / 20; 

  if (adc_value2 < 1022.90) 

  { 

    voltage2 = ((adc_value2 * v_ref) / 1024); 

    r2 = (voltage2 * r_ref2) / (v_ref - voltage2); 

  } 

 

  pinMode(R1, INPUT); 

  pinMode(R2, INPUT); 

  pinMode(R3, OUTPUT); 

  digitalWrite(R3, HIGH); 

  for (int i = 0; i < 20 ; i++) 

  { 

    adc_value3 = adc_value3 + analogRead(OhmMeter); 

    delay(3); 

  } 

  adc_value3 = adc_value3 / 20; 

  if (adc_value3 < 1022.90) 

  { 

    voltage3 = ((adc_value3 * v_ref) / 1024); 

    r3 = (voltage3 * r_ref3) / (v_ref - voltage2); 

  } 

 

  r1 = r1 / 1000; 

  r2 = r2 / 1000; 

  r3 = r3 / 1000; 

 

  if (r1 < 2 && r2 < 101 && r3 < 1001) R = r1 * 1000; 

  else if (r1 > 2 && r2 < 101 && r3 < 1001) R = r2; 

  else if (r1 > 2 && r2 > 101 && r3 < 2000) R = r3; 

  else R = 0.00; 

 

  if (R < 1) 

  { 

    R = R * 1000; 

    kilo = false; 

  } 

  else 

  { 

    kilo = true; 

  } 

 

} 

 

void calculate_capacitance() { 

  unsigned long start_time; 

  unsigned long elapsed_time; 

  float microFarads; 

  float nanoFarads; 

  float r_ref = 10000.00; 

 

  digitalWrite(ChargePin, HIGH); 

  start_time = millis(); 

 

  while (analogRead(CapacitancMeter) < 648) {} 

 

  elapsed_time = millis() - start_time; 

 

  microFarads = ((float)elapsed_time / r_ref) * 1000; 

  if (microFarads > 1) 

  { 

    C = microFarads; 

    nano = false; 

  } 

  else 

  { 

    nanoFarads = microFarads * 1000.0; 

    C = nanoFarads; 

    nano = true; 

  } 

 

 

  digitalWrite(ChargePin, LOW); 

  pinMode(DischargePin, OUTPUT); 

  digitalWrite(DischargePin, LOW); 

  while (analogRead(CapacitancMeter) > 0) {} 

  pinMode(DischargePin, INPUT); 

 

} 

 

void calculate_voltage() { 

  float R1 = 10000.00; 

  float R2 = 4700.00; 

  float v_ref = 5.00; 

  float resistor_ratio = 0.00; 

  float adc_value = 0.00; 

  float voltage = 0.00; 

 

  resistor_ratio = (R2 / (R1 + R2)); 

  for (int i = 0; i < 20 ; i++) 

  { 

    adc_value = adc_value + analogRead(VoltMeter); 

    delay(3); 

  } 

  adc_value = adc_value / 20; 

  voltage = ((adc_value * v_ref) / 1024); 

 

  V = voltage / resistor_ratio; 

} 

 

void calculate_current() { 

  int sensitivity = 185; 

  int adc_value = 0; 

  float v_ref = 4.94; 

  float voltage = 0.00; 

  float pure_voltage = 0.00; 

  float offset_voltage = 2.47; 

 

  for (int i = 0; i < 40 ; i++) 

  { 

    adc_value = adc_value + analogRead(Ammeter); 

    delay(2); 

  } 

  adc_value = adc_value / 40; 

  voltage = ((adc_value * v_ref) / 1024); 

  pure_voltage = voltage - offset_voltage; 

  pure_voltage = pure_voltage * 1000; 

  I = pure_voltage / sensitivity; 

 

  if (I < 1) 

  { 

    I = I * 1000; 

    mili = true; 

  } 

  else 

  { 

    mili = false; 

  } 

} 
void setup() { 

  Serial.begin(9600); 

  OLED_init(); 

  pinMode(right_button, INPUT_PULLUP); 

  pinMode(select_button, INPUT_PULLUP); 

  pinMode(ChargePin, OUTPUT); 

  digitalWrite(ChargePin, LOW); 
} 

void loop() { 

  if (digitalRead(right_button) == 0) 
  { 

    navigator++; 

    while (digitalRead(right_button) == 0); 

    delay(5); 

    if (navigator > 3) navigator = 0; 

    Serial.println(navigator); 

  } 

  if ( digitalRead(select_button) == 0) 

  { 

    is_select = true; 

    while ( digitalRead(select_button) == 0); 

  } 

  if (navigator == 0) 

  { 

    display.clearDisplay(); 

    diplay_logo(0, 0, RightArrow, F_LOGO_WIDTH, F_LOGO_HEIGHT); 

    display_text(2, 17, 8, "Resistor"); 

    display.display(); 

    while (is_select) 

    { 

      display.clearDisplay(); 

      display_text(1, 0, 0, "Resistor"); 

      display_text(2, 12, 8, "R="); 

      display_number(2, 42, 8, R); 

      if (kilo) display_text(1, 115, 15, "k"); 

      display.display(); 

      calculate_resistor(); 

      if ( digitalRead(select_button) == 0) 

      { 

        is_select = false; 

        while ( digitalRead(select_button) == 0); 

      } 

    } 

 

  } 

  if (navigator == 1) 

  { 

    display.clearDisplay(); 

    diplay_logo(0, 0, BothArrow, F_LOGO_WIDTH, F_LOGO_HEIGHT); 

    display_text(2, 17, 8, "Voltage"); 

    display.display(); 

    while (is_select) 

    { 

      display.clearDisplay(); 

      display_text(1, 0, 0, "Voltage"); 

      display_text(2, 12, 8, "V="); 

      display_number(2, 42, 8, V); 

      display_text(1, 115, 15, "v"); 

      display.display(); 

      calculate_voltage(); 

      if ( digitalRead(select_button) == 0) 

      { 

        is_select = false; 

        while ( digitalRead(select_button) == 0); 

      } 

    } 

  } 

  if (navigator == 2) 

  { 

    display.clearDisplay(); 

    diplay_logo(0, 0, BothArrow, F_LOGO_WIDTH, F_LOGO_HEIGHT); 

    display_text(2, 17, 8, "Current"); 

    display.display(); 

    while (is_select) 

    { 

      display.clearDisplay(); 

      display_text(1, 0, 0, "Current"); 

      display_text(2, 12, 8, "I="); 

      display_number(2, 42, 8, I); 

      if (mili) display_text(1, 115, 15, "mA"); 

      if (!mili) display_text(1, 115, 15, "A"); 

      display.display(); 

      calculate_current(); 

      if ( digitalRead(select_button) == 0) 

      { 

        is_select = false; 

        while ( digitalRead(select_button) == 0); 

      } 

    } 

  } 

  if (navigator == 3) 

  { 

    display.clearDisplay(); 

    diplay_logo(0, 0, LeftArrow, F_LOGO_WIDTH, F_LOGO_HEIGHT); 

    display_text(2, 12, 8, "Capacitor"); 

    display.display(); 

    while (is_select) 

    { 

      display.clearDisplay(); 

      display_text(1, 0, 0, "Capacitor"); 

      display_text(2, 12, 8, "C="); 

      display_number(2, 42, 8, C); 

      if (nano) display_text(1, 115, 22, "nF"); 

      if (!nano) display_text(1, 115, 22, "uF"); 

      display.display(); 

      calculate_capacitance(); 

      if ( digitalRead(select_button) == 0) 

      { 

        is_select = false; 

        while ( digitalRead(select_button) == 0); 

      } 

    } 

  } 

} 

فایل logo.h را در فولدر کد خود قرار دهید.

با فشردن کلید متصل به پایه شماره 3 بین منوها جا به جا می شوید و با فشردن کلید متصل به پایه شماره 2 وارد یک کمیت خواهید شد که با فراخوانی تابع اندازه گیری آن کمیت مقدار آن نمایش داده می شود، مجددا با فشردن  همین کلید به منوهای اصلی بر می گردید.

موفق شدید
تبریک می گویم! شما اکنون یک مولتی متر دیجیتال حرفه ای ساختید.

یک گام جلوتر

• سعی کنید برای ظرفیت سنج خازن نیر رنج خودکار بسازید.
• سعی کنید به مولتی متر خود قابلیت تست اتصال اضافه کنید.

آموزش های مشابه

Comments (10)

  • محمد Reply

    سلام
    نهایت ولتاژ ک اردینو میتونه تحمل کنه چقدره ؟!
    سنسور جریان 30 آمپر میتونه تحمل کنه
    ولی آی سی نهایش نیم آمپر

    احتمال سوختن آردینو به وجود نمیاد

    فوریه 11, 2021 at 3:21 ب.ظ
    • مهران ملکی Reply

      سلام.
      آردوینو تا حدود 5 – 5.5 ولت رو میتونه تحمل کنه.
      قسمتی از سنسور جریان که به آردوینو متصل میشه ولتاژ خروجیشه و جریانی که از سنسور جریان رد میشه آسیبی به آردوینو نمیزنه. تو توضیحات بخش ساخت آمپرسنج هم ذکر شده که به ازای هر آمپر جریان، ولتاژ خروجی سنسور 185میلی آمپر تغییر میکنه. که تو 30 آمپر حدود 5.5ولت میشه.

      فوریه 14, 2021 at 6:06 ب.ظ
  • محمد Reply

    سلام
    لطفا اسم پایه های ال سی دی رو بگید ممنون میشم
    و اینکه توی ولت سنج ورودی ولتاز مشخصه پایه منفی رو باید به کجا اتصال بدیم؟
    به gnd?

    سپتامبر 10, 2021 at 6:31 ب.ظ
    • مهران ملکی Reply

      سلام.
      نمایشگر استفاده شده در این آموزش یک نمایشگر OLED با ارتباط I2C هست و پایه‌های اون SDA ،VCC ،GND و SCL هستن. آموزش مخصوص این نمایشگر هم نوشته شده و میتونید از اون هم استفاده کنید: “https://thecaferobot.com/learn/interfacing-0-96-inch-ssd1306-oled-i2c-display-with-arduino/”
      در رابطه با ولت سنج هم، بله. پایه منفی ولتاژ ورودی رو باید به GND متصل کنید.

      سپتامبر 11, 2021 at 9:50 ق.ظ
  • مجید Reply

    سلام
    من کد رو وارد میکنم خطای logo.h میده چیکارش کنم ؟

    دسامبر 25, 2021 at 3:43 ب.ظ
    • مهران ملکی Reply

      سلام.
      باید فایل logo.h در انتهای آموزش رو دانلود کنید و اون رو داخل فولدری که کد آردوینوتون (ino.) قرار داره، قرار بدید. با این کار مشکلتون حل میشه.

      دسامبر 26, 2021 at 9:21 ق.ظ
  • داود یاری Reply

    سلام، مهندس من واسه برقکاری ساختمان یه مولتیمتر نیاز دارم، شما میتونید همین مولتیمتر که آموزششو گذاشتین واسه ساخت خودتون واسه من بسازیدش؟ چون من خودم کارم الکترونیک نیستش.

    دسامبر 29, 2021 at 12:10 ق.ظ
    • مهران ملکی Reply

      سلام.
      مقالات گذاشته شده در سایت جنبه آموزشی دارن و ساخت یه مولتیمتر با آردوینو بسیار گرونتر از یه مولتیمتر آماده ممکنه هزینه داشته باشه. در ضمن به اندازه یه مولتیمتر آماده قابل اتکا نیست. در نتیجه در عمل اصلا به صرفه نیست که برای کارهای عملی اقدام به ساخت یک مولتیمتر کرد.

      دسامبر 29, 2021 at 9:20 ق.ظ
  • Hasan Reply

    سلام
    ممنون میشم توضیح بدی فایل logo.h رو باید چیکار کنیم چون کد خطا logo.h
    میده
    میخواهم با برنامه ArduinoDroid پروگرام کنمش

    آگوست 31, 2023 at 2:17 ب.ظ
    • محمد دمیرچی Reply

      با سلام
      در انتهای کد توجه کنید فایل logo.h قرار داده شده است و اعلام شده است که فایل را در پوشه پروژه کپی کنید
      در سایر نرم افزار های IDE نیز باید همین کار را بکنید (بنده از نرم افزار ArduinoDroid استفاده نکرده ام)

      سپتامبر 2, 2023 at 9:07 ق.ظ

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.