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說明。
撰寫範例程式
範例程式如下,將它貼至新建的專案
//
#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);
}
電流計算使用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
更新資訊
| 日期 | 內容 |
|---|---|
| 2016/12 | 新增文章 |
大大您好,請問arduino的電路圖中,有兩顆咖啡色很像眼睛的東西 那個是什麼呢? 此外,看不太清楚下面這句話 “接電路將電流轉換成電壓,而且電流帶有正負電壓的正弦波,最後會以差分輸入的方式取得轉換值” 1.想請問將電流轉成電壓是怎麼實現的呢? 2.以及差分輸入這個是直接依靠ADS1115 這塊模組就可以完成了嗎 謝謝您!!