Arduino 使用 SCT013 量電流(ADS1115)

Arduino 使用 SCT013 量電流(ADS1115)

量電流方式有串聯方式與非接觸式,一般非接觸式都是使用霍爾電流感應方式量測,但因為使用感應電流方式取得一定比率的電流再回推實際值,這會因為環境因素影響準確性,但非接觸式有個好處如其名稱一樣,我們不需要變更線路設計就能量測到電流此篇為Arduino 使用 SCT013 量電流進階版本,主要是加上16位元解析度的ADC模組,及差分輸入解決電流只能只能量超過0.5A。

準備工作

下面列出硬體方面的準備工作如下:

  • Arduin UNO

  • SCT013

  • ADS1115

這是一款4通道 ADS1115 16位元解析度ADS類比轉數位模組,細節規格可以參考Adafruit ADS1115或是TI官網ADS1115

此次是要利用它具有差分輸入的方式輸入具有正負波型的資訊,省掉像Arduino 使用 SCT013 量電流文中需要增加提升電壓的電路,加上高解析度16位元可以讓量測的電流更精確。

  • SCT013 with ADS1115 for Arduino 電路

SCT013輸出是電流的方式,但ADS1115 IN是量電壓方式,所以需要另外接電路將電流轉換成電壓,而且電流帶有正負電壓的正弦波,最後會以差分輸入的方式取得轉換值:

實際連接如下:

安裝 Adafruit ADS1X15 Library

下載Adafruit_ADS1X15,解壓後安裝至Arduino的Library中,成功的話可以看到如下圖:

如果不清楚Library怎麼下載及安裝可以參考Arduino遙控大金(daikin)冷氣中的下載Arduino_IRremote_Daikin說明。

撰寫範例程式

範例程式如下,將它貼至新建的專案

//-----------start-----------
//
#include <Wire.h>
#include <Adafruit_ADS1015.h>

Adafruit_ADS1115 ads;
//
double sqI,sumI;
double sampleI;
double Irms;

double squareRoot(double fg)
{
    double n = fg / 2.0;
    double lstX = 0.0;
    while (n != lstX)
    {
        lstX = n;
        n = (n + fg / n) / 2.0;
    }
    return n;
}

double calcIrms(unsigned int Number_of_Samples, float multiplier,double ical)
{

    for (unsigned int n = 0; n < Number_of_Samples; n++)
    {
        sampleI = (double)ads.readADC_Differential_0_1();
        sqI = sampleI * sampleI;
        sumI += sqI;
    }
    Irms = squareRoot(sumI / Number_of_Samples) * multiplier * ical;
    sumI = 0;
//--------------------------------------------------------------------------------------

    return Irms;
}



void setup()
{
    Serial.begin(115200);
    Wire.begin();
    /* ADS1115 @ +/- 4.096V gain (16-bit results) 0.125mV Step*/
    ads.setGain(GAIN_ONE);
    ads.begin();
    Serial.println();
    Serial.println("current meter");

}

void loop()
{
    double Irms = calcIrms(64, 0.125F,4.5) / 100;
    Serial.print(Irms*110.0);        // Apparent power
    Serial.print(" ");
    Serial.println(Irms);            // Irms
    delay(1000);
}




//------------end------------

電流計算使用calcIrmsFunction,參數依序為:

  • 取樣次數 輸入為64以上階行,愈小速度愈快

  • 解析度最小電壓 依照ADS115的模式來決定解析度最小電壓,Library範例中所提示:

//
  ads.setGain(GAIN_TWOTHIRDS);  // 2/3x gain +/- 6.144V  1 bit = 3mV      0.1875mV (default)
  ads.setGain(GAIN_ONE);        // 1x gain   +/- 4.096V  1 bit = 2mV      0.125mV
  ads.setGain(GAIN_TWO);        // 2x gain   +/- 2.048V  1 bit = 1mV      0.0625mV
  ads.setGain(GAIN_FOUR);       // 4x gain   +/- 1.024V  1 bit = 0.5mV    0.03125mV
  ads.setGain(GAIN_EIGHT);      // 8x gain   +/- 0.512V  1 bit = 0.25mV   0.015625mV
  ads.setGain(GAIN_SIXTEEN);    // 16x gain  +/- 0.256V  1 bit = 0.125mV  0.0078125mV


Danny使用GAIN_ONE,所以解析度最小電壓為:0.125mV。

  • 校正值,範例使用4.5,使用時可以利用勾表配合調整該數值大小,例如:先將校正值輸入1,再依照勾表量出的值/量電流輸出大小所得的值為校正值輸入。

輸出結果:

左邊數據為使用計算後使用的瓦數(W),右邊值為電流大小(A)

注意事項

如果你量測的電流小於60A,可以更換成100歐姆的電阻讓ADS1115讀取電壓的範選大一點會更準。

參考資料

使用前可以看一下如何使用鉤錶來量測電流?影片了解勾表型的互感器使用方式:

Arduino ADS1115 Module Getting Started Tutorial

ADS1115 Module with CT/Grove Connectors from whatnick on Tindie

ESP8266 and Emoncms

更新資訊

日期 內容
2016/12 新增文章