Measuring current with arduino using ACS712 module

هنتكلم النهاردة عن قياس التيار باستخدام الأردوينو، فيه طرق كتير عشان نقدر نقيسه، ولازم برضه نضيف حاجات لو هنقيس التيار الموجب والسالب، والمتردد، فعشان نوفر على نفسنا المجهود بنتجه للحل الأسهل:

ACS712 current sensing module

الموديول دا بيعتمد على حاجة اسمها الـ Hall Effect عشان يقيس التيارات الموجبة والسالبة، وكمان الـAC.

خلونا نشوف الخرج الأول وبعدين نشرح ايه هو الـHall Effect وازاي وبنتعامل مع الموديول.

Output Video

نبذة مختصرة عن الـACS712

الموديول دا بيعتمد على IC اسمها ACS712 وهي اللي بتعمل الـHall effect الفكرة باختصار انه التيار اللي بيدخل للموديول بيتحول لجهد متناسب مع التيار دا.

فيه ٣ انواع للموديول:

١- بيقيس لحد -+5A والحساسية بتاعته 185mV/A

٢- بيقيس لحد -+20A والحساسية بتاعته 100mV/A

٣- بيقيس لحد -+30A والحساسية بتاعته 66mV/A

اتكلمنا قبل كدة عن الحساسية وهي انه مثلا اول نوع اللي بيقيس لحد ٥ أمبير دا حساسيته 185mV لكل 1A يعني لو التيار زاد ١ أمبير الإشارة اللي طالعة من الموديول هتزيد ١٨٥ مللي فولت. احنا عارفين انه حساسية الاردوينو 5mV تقريبا، فدا معناه انه أي تيار اقل من 27mA الاردوينو مش هيحس بيه للاسف.

بالنسبة بقا للـhall effect الموضوع وما فيه إنه أي تيار بيعدي في سلك بينتج مجال مغناطيسي، فهما بيعدوا التيار اللي احنا بنحاول نقيسه في سلك وحوالين السلك دا الـhall sensor اللي هو عبارة عن معدن عشان يتكون جواه المجال المغناطيسي ويتحول لـemf اللي بتكون متناسبة مع كمية التيار اللي ماشية في السلك.

طبعا الموديول دا بيطلع 2.5V لما يكون التيار صفر.

الدايرة



الكود

/************************************************************************* * * Ammeter * ************************************************************************/

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

#define AC_DC 8 // you can use pin 8 on arduino to determine is the current AC or DC, HIGH means AC and LOW means DC

float Vdd = 5.0; float c3 = Vdd/1023.0;

// LCD module connections (RS, E, D4, D5, D6, D7) LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //you can use an LCD or not, it's up to you

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

// get maximum reading value uint16_t get_max() { uint16_t max_i = 0; for(uint8_t i = 0; i < 100; i++) { uint16_t r = analogRead(A0); // read from analog channel 0 (A0) if(max_i < r) max_i = r; delayMicroseconds(500); } return max_i; }

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

// get actual voltage reading float get_real(uint32_t I_m) {

float I_analog = I_m*c3; float I_r = (I_analog-2.55)/0.185; // (current - offset) / sensitivity

return I_r; }

// main loop void loop() {

// get amplitude (maximum - or peak value) uint32_t i_divided = AC_DC? get_max() : get_avg(); // calculate actual current float i= get_real(i_divided);

i= AC_DC? i/1.414 : i;

Serial.println(i);

lcd.setCursor(0, 0); lcd.print(AC_DC? "AC Current" : "DC Current"); lcd.setCursor(0, 1); lcd.print("I= "); lcd.print(i, 2); lcd.print(" ");

}

الخرج

دا الخرج بتاع الحساس من غير أي تيار خالص، مخرج تقريبا 2.5 فولت
 


ودا شكل الخرج بعد ما شغلنا الجهاز وبدأ يسحب تيار، كان التيار صفر، فجأة ارتفع بقا 600 مللي أمبير 
 


 
 
ودا شكل التيار بعد ما فصلنا الجهاز تاني.
 
 


 
الاختبار دا كان على شاشة تلفيزيون، سحبت تقريبا 600 مللي أمبير، وهي شغالة على 220 فولت، يبقا استهلاكها للكهرباء:

P=IV=600m*220=132Watt

نتمنى تكونوا استفدتم من الشرح دا وإلى مشروع آخر.

Comments

Popular Posts