مقدمه
آنچه در این آموزش یاد می گیرید
- آشنایی با مولتی متر
- الگوریتم اندازه گیری ولتاژ
- الگوریتم اندازه گیری جریان
- الگوریتم اندازه گیری مقاومت
- الگوریتم اندازه گیری ظرفیت خازن
- پیاده سازی ولت متر، آمپرمتر، اهم متر و ظرفیت سنج خازن با آردوینو
مولتی متر چیست؟
به زبان ساده، مولتی متر ابزاریست که کمیت های الکتریکی، نظیر ولتاژ، جریان و … را به زبان قابل فهم ما تبدیل می کند. وقتی در سال 1820 نمونه های اولیه این وسیله پرکاربرد که فقط قابلیت اندازه گیری جریان را داشتند (بنام گالوانومتر) ساخته شد، به جزء جدانشدنی پروژه های الکترونیکی تبدیل شد.
مولتی متر ها به طور کلی به دو دسته اصلی آنالوگ و دیجیتال تقسیم می شوند. مولتی متر های آنالوگ برای نمایش کمیت های الکتریکی از عقربه استفاده می کنند و امروزه کاربردشان بسیار کاهش پیدا کرده است، اما مولتی مترهای دیجیتال برای نمایش کمیت ها از صفحه نمایشگر استفاده می کنند که به همین دلیل بسیار رایج تر می باشند.
نمونه ای از یک مولتی متر آنالوگ
نمونه ای از یک مولتی متر دیجیتال
مولتی متر چه کمیت های را اندازه گیری می کند؟
اندازه گیری ولتاژ الکتریکی
اندازه گیری جریان الکتریکی
برای اندازه گیری جریان ساده ترین کار استفاده از قانون اهم می باشد. این قانون بیان می دارد که جریان الکتریکی یک مسیر با نسبت ولتاژ به مقاومت آن مسیر رابطه دارد.
اندازه گیری مقاومت الکتریکی
اندازه گیری ظرفیت خازن
یکی از موثر ترین روش ها برای اندازه گیری ظرفیت خازن استفاده از قانون شارژ و دشارژ خازن است.
زمان شارژ شدن خازن با نمودار زیر تطابق دارد.
وقتی خازن به میزان 63.2% شارژ شود یک ثابت زمانی طی شده است، ثابت زمانی به صورت رابطه زیر بیان می شود:
τ^((second))=R×C
پس با دانستن مقدار مقاومت و اندازه گیری زمان شارژ خازن به میزان 63.2% می توانیم مقدار خازن را اندازه گیری کنیم.
لوازمی که به آن احتیاج دارید
قطعات مورد نیاز
نرم افزارهای مورد نیاز
ساخت یک مولتی متر دیجیتال با آردوینو
ساخت این مولتی متر شامل 5 مرحله می باشد:
مرحله اول) ساخت ولت متر
برای ساخت ولت متر از تکنیک تقسیم مقاومتی استفاده می کنیم. برای خواندن ولتاژ به واحد ADC آردوینو احتیاج داریم.
سیم بندی
برای اندازه گیری ولتاژ در اینجا از تقسیم مقاومتی 10 و 4.7 کیلو استفاده شده است.
مدار زیر را ببندید:
هشدار
با تغییر مقدار مقاومت ها می توانید رنج ولتاژ ورودی را تغییر دهید، هر چه رنج ولتاژ ورودی بیشتر باشد دقت اندازه گیری افت پیدا می کند.
نکته
کد
/*
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);
}
مرحله دوم) ساخت آمپر متر
برای ساخت آمپر متر از سنسور AC712 استفاده می کنیم، این سنسور به صورت ماژول در رنج های مختلف موجود است. در اینجا از رنج 5 آمپر این سنسور استفاده شده است.
سیم بندی
نکته
کد
/*
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);
}
نکته
مرحله سوم) ساخت اهم متر
سیم بندی
برای تعیین رنج از مقاومت های 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);
}
نکته
مرحله چهارم) ساخت ظرفیت سنج خازن
سیم بندی
اینجا برای شارژ خازن از مقاومت 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);
}
}
}
}
با فشردن کلید متصل به پایه شماره 3 بین منوها جا به جا می شوید و با فشردن کلید متصل به پایه شماره 2 وارد یک کمیت خواهید شد که با فراخوانی تابع اندازه گیری آن کمیت مقدار آن نمایش داده می شود، مجددا با فشردن همین کلید به منوهای اصلی بر می گردید.
موفق شدید
یک گام جلوتر
• سعی کنید برای ظرفیت سنج خازن نیر رنج خودکار بسازید.
• سعی کنید به مولتی متر خود قابلیت تست اتصال اضافه کنید.
Comments (10)
سلام
نهایت ولتاژ ک اردینو میتونه تحمل کنه چقدره ؟!
سنسور جریان 30 آمپر میتونه تحمل کنه
ولی آی سی نهایش نیم آمپر
احتمال سوختن آردینو به وجود نمیاد
سلام.
آردوینو تا حدود 5 – 5.5 ولت رو میتونه تحمل کنه.
قسمتی از سنسور جریان که به آردوینو متصل میشه ولتاژ خروجیشه و جریانی که از سنسور جریان رد میشه آسیبی به آردوینو نمیزنه. تو توضیحات بخش ساخت آمپرسنج هم ذکر شده که به ازای هر آمپر جریان، ولتاژ خروجی سنسور 185میلی آمپر تغییر میکنه. که تو 30 آمپر حدود 5.5ولت میشه.
سلام
لطفا اسم پایه های ال سی دی رو بگید ممنون میشم
و اینکه توی ولت سنج ورودی ولتاز مشخصه پایه منفی رو باید به کجا اتصال بدیم؟
به gnd?
سلام.
نمایشگر استفاده شده در این آموزش یک نمایشگر OLED با ارتباط I2C هست و پایههای اون SDA ،VCC ،GND و SCL هستن. آموزش مخصوص این نمایشگر هم نوشته شده و میتونید از اون هم استفاده کنید: “https://thecaferobot.com/learn/interfacing-0-96-inch-ssd1306-oled-i2c-display-with-arduino/”
در رابطه با ولت سنج هم، بله. پایه منفی ولتاژ ورودی رو باید به GND متصل کنید.
سلام
من کد رو وارد میکنم خطای logo.h میده چیکارش کنم ؟
سلام.
باید فایل logo.h در انتهای آموزش رو دانلود کنید و اون رو داخل فولدری که کد آردوینوتون (ino.) قرار داره، قرار بدید. با این کار مشکلتون حل میشه.
سلام، مهندس من واسه برقکاری ساختمان یه مولتیمتر نیاز دارم، شما میتونید همین مولتیمتر که آموزششو گذاشتین واسه ساخت خودتون واسه من بسازیدش؟ چون من خودم کارم الکترونیک نیستش.
سلام.
مقالات گذاشته شده در سایت جنبه آموزشی دارن و ساخت یه مولتیمتر با آردوینو بسیار گرونتر از یه مولتیمتر آماده ممکنه هزینه داشته باشه. در ضمن به اندازه یه مولتیمتر آماده قابل اتکا نیست. در نتیجه در عمل اصلا به صرفه نیست که برای کارهای عملی اقدام به ساخت یک مولتیمتر کرد.
سلام
ممنون میشم توضیح بدی فایل logo.h رو باید چیکار کنیم چون کد خطا logo.h
میده
میخواهم با برنامه ArduinoDroid پروگرام کنمش
با سلام
در انتهای کد توجه کنید فایل logo.h قرار داده شده است و اعلام شده است که فایل را در پوشه پروژه کپی کنید
در سایر نرم افزار های IDE نیز باید همین کار را بکنید (بنده از نرم افزار ArduinoDroid استفاده نکرده ام)