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(" ");
}الخرج
P=IV=600m*220=132Watt
نتمنى تكونوا استفدتم من الشرح دا وإلى مشروع آخر.
Comments
Post a Comment