AC arduino voltmeter

ازاي نقيس الجهود الـAC باستخدام Arduino؟

اشتري كل المكونات المطلوبة للمشروع عن طريق صفحتنا على الفيسبوك من هنا، اكتب اسم المشروع وقولنا عالعنوان واحنا هنوصله لحد عندك.

الموضوع سهل جدًا ولكن محتاج شوية دراسة، الكهرباء اللي موجودة في الفيشة بتكون على شكل sine wave ليها قمة وقاع وتردد، التردد في مصر 50Hz والقمة بتكون عند 300V دا بنسميه Vpeak، اللي هو الجهد من صفر بحد القمة أو القاع. ولكن شكل الـsine wave فيه حاجة، إنه مش طول الوقت فيه جهد، اوقات كتير قيمة الجهد بصفر، على عكس الـDC قيمته ثابتة طول الوقت، بالتالي عشان نعرف نقارن الكهرباء بالـDC بياخدوا المتوسط الضربي، اللي هو:

بناخد samples من الاشارة ونربع كل sample، ونجمعهم ونقسم على عددهم، وبعدين ناخد الجذر التربيعي. 

 



ولاحظوا انه بالنسبة للـsine wave فالعملية دي بتساوي دايما Vpeak/1.414. فمن هنا جت التحويلة دي. لو الكهرباء اللي بنقيسها مش sine wave يبقا الجهاز بتاعنا بيقيس غلط. ودا الفرق بين أجهزة القياس اللي بيبقا مكتوب عليهم true rms وغيرهم.

Arduino AC Voltmeter

 


هندخل الجهد الـAC على half-wave rectifier اللي هيعدي الجزء الموجب بس. هناخد الجزء الموجب دا وندخله على voltage divider مكون من 3 مقاومات، وناخد الجهد على أصغر مقاومة فيهم، ونقيسه. الجهد على المقاومة دي هيكون بـ:

Vr3=Vin*(R3/(R1+R2+R3))

فلما نقيس من الأردوينو هيطلعلنا رقم ما بين 0 و 1023، فليكن 300. أول حاجة هنحوله لجهد:

V=bin_number*5V/1023=1.47V

وبعدين نضرب الجهد دا في الـratio عشان نجيب الجهد اللي بنحاول نقيسه:

V_real=V*(R1+R2+R3)/R3=294.72V

يبقا الـVpeak بـ294.72 فولت. هنقسم على المعامل 1.414، هيطلع بـ 208.43. دا على سبيل المثال.

الكود

أخيرا الكود اللي هنرفعه على الأردوينو:

/************************************************************************* * * voltmeter * ************************************************************************/

#include <LiquidCrystal.h> // include Arduino LCD library

#define AC_DC 8

float R1 = 10000.0; float R2 = 100000.0; float R3 = 1000000.0; float Vdd = 5.0; float c1 = Vdd * R2 / R1 + 0.43; float c2 = 2.0 * (1+R2/R1); float c3 = Vdd/1023.0; float c4 = (R1+2*R3)/R1;

// LCD connections (RS, E, D4, D5, D6, D7)

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup(void) { lcd.begin(16, 2); // set up the LCD's number of columns and rows lcd.setCursor(0, 0); lcd.print("Voltage"); pinMode (AC_DC, INPUT); }

// get maximum reading value uint16_t get_max() { uint16_t max_v = 0; for(uint8_t i = 0; i < 100; i++) { uint16_t r = analogRead(A0); // read from analog channel 0 (A0)

if(max_v < r) max_v = r; delayMicroseconds(200); } return max_v; }

uint16_t get_avg() { uint16_t Vx = 0; for(uint8_t i = 0; i < 100; i++) { uint16_t r = analogRead(A0); // read from analog channel 0 (A0) Vx+=r; delay(1); } Vx/=100; return Vx; }

// get actual voltage reading float get_real(uint32_t V_m) { float V_analog = V_m*c3;

float V_r = AC_DC? ( c4*V_analog) : ( c2*V_analog - c1);

return V_r; }

// main loop void loop() {

// get amplitude (maximum - or peak value) uint32_t v_divided = AC_DC? get_max() : get_avg();

// calculate actual voltage float v= get_real(v_divided);

v= AC_DC? v/1.414 : v;

lcd.setCursor(0, 0); lcd.print(AC_DC? "AC Voltage" : "DC Voltage"); lcd.setCursor(0, 1); lcd.print("V= "); lcd.print(v, 2); lcd.print(" ");

delay(500);

}

نتمنى تكونوا استفدتم بالمقال، وإلى مقال اخر.

Comments

Popular Posts