ขอโค้ด ACS712-30 A หน่อยครับ (ลองกระทู้อื่นแล้วไม่เวิค ไม่เข้าใจ)

Started by bewplayboy, January 26, 2017, 09:54:53 PM

Previous topic - Next topic

bewplayboy

ผมจะขอโค้ด ACS712-30 A  วัดกระแส 220V AC หน่อยครับ  แค่มี Arduino mega 2560 r3  แล้วมีโหลดเป็นแสงสว่าง 1 ชุดครับ กับ ตัว ACS712-30 A โดยจ่ายไฟ AC แค่อยากวัดกระแสที่ไหลผ่านในวงจรครับ  ผมอยากขอโค้ด Arduino ให้มันขึ้นค่าใน Serial monitor ในโปรแกรม Arduino ให้ขึ้นเป็น Amp แค่นั้นอะครับ

รบกวนของโค้ดหน่อยนะครับ  ขอบคุณมากๆครับ

RoLRoR


#include <EEPROM.h>
void EEPROMWriteInt(int p_address, int p_value)
{ byte lowByte  = ((p_value >> 0) & 0xFF);
byte highByte = ((p_value >> 8) & 0xFF);
p_address *= 2;
EEPROM.write((p_address + 0), lowByte);
EEPROM.write((p_address + 1), highByte);
}
unsigned int EEPROMReadInt(int p_address)
{ byte lowByte  = EEPROM.read(p_address + 0);
byte highByte = EEPROM.read(p_address + 1);
return( ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00) );
}

int tick_state = 0;
int adc_zero = 0;
int adc_val = 0;
int adc_index = 0;
int adc_samp[20] = 0;
double adc_sum;
double adc_rms = 0;
double adc_last;

void setup()
{ Serial.begin(9600); // BAUD 9600,8,N,1
pinMode(2, INPUT); // SWITCH PIN2
adc_zero = EEPROMReadInt(1); // Restore Set.Zero
}

void loop()
{ delay(1); // delay 1ms
if(++tick_state > 1000); tick_state = 0; // state next

//--PushSwitch Store SetZero------------------
if(!digitalRead(2))
{ adc_zero = analogRead(A2);
EEPROMWriteInt(1, adc_zero);
}

if(adc_index < 20) //--Sampling--
{ adc_val = analogRead(A2);
if(adc_val >= adc_zero) adc_samp[adc_index++] = (adc_val - adc_zero);
else adc_samp[adc_index++] = (adc_zero - adc_val);
}
else //--RMS.Process--
{ adc_sum = 0;
for(adc_index=0; adc_index<20; adc_index++)
{ adc_sum += pow(adc_samp[adc_index], 2);
} adc_sum /= 20;
adc_rms = sqrt(adc_sum);
}

//--Display-----------------------------------
if(!(tick_state % 250))
{ adc_rms = (adc_rms + adc_last) / 2;
adc_rms *= cal_value;
Serial.println(adc_rms);
}
}


http://www.electoday.com/index.php/topic,10364.8.html

bewplayboy

ผมลองโหลดใส่ Arduino แล้วมันเออเร่อตรงบรรทัด  int adc_samp[20] = 0;  ครับพี่ชาย  :-[


bewplayboy

ตอนนี้ใช้โค้ดนี้อยู่ครับ ค่าพอจะออกมา  ตอนเสียบขึ้น 0.86 Amp Rms กว่าๆ ในมิเตอร์ 0.051 A ครับ แต่พอถอดสาย จะอยู่ที่ 2-3 amp ครับ ไม่เป็น 0 (T T)  พอจะแก้โค้ดแนะนำ อันนี้ดูได้ไหมครับ

/*
Measuring AC Current Using ACS712
*/
const int sensorIn = A0;
int mVperAmp = 66; // use 100 for 20A Module and 66 for 30A Module


double Voltage = 0;
double VRMS = 0;
double AmpsRMS = 0;



void setup(){
Serial.begin(9600);
}

void loop(){


Voltage = getVPP();
VRMS = (Voltage/2.0) *0.707;
AmpsRMS = (VRMS * 1000)/mVperAmp;
Serial.print(AmpsRMS);
Serial.println(" Amps RMS");

}

float getVPP()
{
  float result;
 
  int readValue;             //value read from the sensor
  int maxValue = 0;          // store max value here
  int minValue = 1023;          // store min value here
 
   uint32_t start_time = millis();
   while((millis()-start_time) < 1000) //sample for 1 Sec
   {
       readValue = analogRead(sensorIn);
       // see if you have a new maxValue
       if (readValue > maxValue)
       {
           /*record the maximum sensor value*/
           maxValue = readValue;
       }
       if (readValue < minValue)
       {
           /*record the maximum sensor value*/
           minValue = readValue;
       }
   }
   
   // Subtract min from max
   result = ((maxValue - minValue) * 5.0)/1023.0;
     
   return result;
}

crywolf

ขา AREF ต่อยังไงครับ ต้องต่อ AREF กับ +5V นะครับ
หรือไม่ก็เซ็ต ADMUX เป็น  ADMUX= ADMUX | 0x40;




bewplayboy

Quote from: crywolf on January 27, 2017, 04:51:15 PM
ขา AREF ต่อยังไงครับ ต้องต่อ AREF กับ +5V นะครับ
หรือไม่ก็เซ็ต ADMUX เป็น  ADMUX= ADMUX | 0x40;

ยังไงครับ คือ บอร์ด กับ ตัวเซนเซอร์ ที่ต่อแล้วใช้โค้ดที่ผมบอกไป คือต่อตามนี้ครับ (ขออภัยหน่อยนะครับ ผมมือใหม่ Arduino อะ ) 

VCC ---- +5
OUT ---- A0
GNA  ---- GND

แล้วแซกหลอดไฟ AC ไปในวงจร แต่กระแสไหล ไม่ออก ตาม มิเตอร์ครับ

crywolf

เพิ่ม analogReference(DEFAULT); ไปด้วยครับ

เป็น

void setup() {
Serial.begin(9600);
analogReference(DEFAULT);
}


เนื่องจาก Arduino มี ADC ความละเอียดแค่ 10-Bit (0-1023)
เมื่อเอามาใช้กับ Vref +5V ทำให้ ได้ความละเอียด 4.88mv/Bit
และเมื่อใช้กับ ACS712-30A (66mV/A)
ทำให้การวัดกระแส จะได้ความละเอียด 0.074 Amp/Bit

bewplayboy

Quote from: crywolf on January 27, 2017, 07:16:25 PM
เพิ่ม analogReference(DEFAULT); ไปด้วยครับ

เป็น

void setup() {
Serial.begin(9600);
analogReference(DEFAULT);
}


เนื่องจาก Arduino มี ADC ความละเอียดแค่ 10-Bit (0-1023)
เมื่อเอามาใช้กับ Vref +5V ทำให้ ได้ความละเอียด 4.88mv/Bit
และเมื่อใช้กับ ACS712-30A (66mV/A)
ทำให้การวัดกระแส จะได้ความละเอียด 0.074 Amp/Bit

จากที่ให้ไปเต็มมาเริ่มเข้าทางแล้วครับ ผมเปลี่ยนความละเอียด จาก 0.707 ที่ให้มาเป็น 0.074 ที่พี่บอกด้วยครับ
/*
Measuring AC Current Using ACS712
*/
const int sensorIn = A0;
int mVperAmp = 66; // use 100 for 20A Module and 66 for 30A Module


double Voltage = 0;
double VRMS = 0;
double AmpsRMS = 0;



void setup(){
Serial.begin(9600);
analogReference(DEFAULT);
}

void loop(){


Voltage = getVPP();
VRMS = (Voltage/2.0) *0.074; 
AmpsRMS = (VRMS * 1000)/mVperAmp;
Serial.print(AmpsRMS);
Serial.println(" Amps RMS");

}

float getVPP()
{
  float result;
 
  int readValue;             //value read from the sensor
  int maxValue = 0;          // store max value here
  int minValue = 1023;          // store min value here
 
   uint32_t start_time = millis();
   while((millis()-start_time) < 1000) //sample for 1 Sec
   {
       readValue = analogRead(sensorIn);
       // see if you have a new maxValue
       if (readValue > maxValue)
       {
           /*record the maximum sensor value*/
           maxValue = readValue;
       }
       if (readValue < minValue)
       {
           /*record the maximum sensor value*/
           minValue = readValue;
       }
   }
   
   // Subtract min from max
   result = ((maxValue - minValue) * 5.0)/1023.0;
     
   return result;
}

ผลออกมาเป็นแบบนี้ครับ โดยทดสอบกับหลอดไฟ AC มิเตอร์วัดได้ 0.052 A ครับ แต่ Serial monitor ขึ้นประมานนี้ครับผม ตอนเสียบกับถอดต่างกันไม่มากครับ

ตัวคูณความละอียด 0.707


ตัวคูณความละเอียด 0.074
 


ขอบคุณที่ช่วยเหลือครับล่วงหน้าครับ