Arduino 使用 SCT013 量電流

Arduino 使用 SCT013 量電流

量電流方式有串聯方式與非接觸式,一般非接觸式都是使用霍爾電流感應方式量測,但因為使用感應電流方式取得一定比率的電流再回推實際值,這會因為環境因素影響準確性,但非接觸式有個好處如其名稱一樣,我們不需要變更線路設計就能量測到電流。

準備工作

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

  • Arduin UNO

  • SCT013

  • SCT013 for Arduino 電路

SCT013輸出是電流的方式,但Arduino Analog IN是量電壓方式,所以需要另外接電路將電流轉換成電壓,而且電流帶有正負電壓的正弦波,需將電壓位準提升至0V以上,上圖為連接的示意圖,等效圖如下:

實際連接如下:

安裝Electricity monitoring library

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

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

開啟範例程式

Library安裝完成後有附上範例程式,範例程式有量電流、量電流與量電壓,但我們的電路只有量流電,所以選擇current_only

接下來就會開啟一個視窗並且會看到範例程式的內容:

//-----------start-----------
// EmonLibrary examples openenergymonitor.org, Licence GNU GPL V3

#include "EmonLib.h"                   // Include Emon Library
EnergyMonitor emon1;                   // Create an instance

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

  emon1.current(1, 111.1);             // Current: input pin, calibration.
}

void loop()
{
  double Irms = emon1.calcIrms(1480);  // Calculate Irms only

  Serial.print(Irms*230.0);        // Apparent power
  Serial.print(" ");
  Serial.println(Irms);            // Irms
}
//------------end------------

此範例作者是使用220V系統,在台灣是使用110V,以及接收Analog PIN也不同,所以更改一下程式:

emon1.current(5, 65);             // Current: input pin, calibration.

上面程式中的65為校正的調整值,依照電路圖中及110V系統,參考值約為65,使用時可以利用勾表配合調整該數值大小。

  Serial.print(Irms*110.0);        // Apparent power

因使用110V系統,所以顯示值將它乘上110,下面為完整的測試程式:

//-----------start-----------
// EmonLibrary examples openenergymonitor.org, Licence GNU GPL V3

#include "EmonLib.h"                   // Include Emon Library
EnergyMonitor emon1;                   // Create an instance
double Irms;
void setup()
{
  Serial.begin(9600);

  emon1.current(5, 65);             // Current: input pin, calibration.
  //依照你的電路需要使用勾表電流表來校準該值
  delay(100);
  Irms = emon1.calcIrms(1480);  // Calculate Irms only
}

void loop()
{
  Irms = emon1.calcIrms(1480);  // Calculate Irms only

  Serial.print(Irms*110.0);        // Apparent power
  Serial.print(" ");
  Serial.println(Irms);            // Irms
  delay(1000);
}
//------------end------------

輸出結果:

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

注意事項

  • 使用SCT013時要注意下圖的箭頭方向:

  • 這次使用到的外接電路:

  • emon1.current(5, 65);

    電路會受整體線路的阻抗產生的微弱電流會有所不同,65值利用勾表電流表所校準後的值,整體DIY成功後,需要自行重新校正該數值,比如在實作使用麵包版連接後所校正的值為45

麵包版電路照片

新增許多使用麵包板連接後電路的照片,希望提供更多想要DIY網友們參考。

參考資料

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

更新資訊

日期 內容
2015/01/27 增加麵包版實際電路照片

  • yi-shan wu

    你好 我也嘗試做了這個裝置 可是出現了一些狀況 想和版主請教 在還沒有負載的狀態下 我的值就會一直跳動 加上負載後 值的轉換並沒有很顯著 請問這大概會是哪裡有問題呢?

    • 感應是有方向性的,你可以確認一下接線方向是否正確,另外要注意一下你感應電流使用方式是否正確,可以拍張你使用的方式及你接線的圖幫你看一下

      • yi-shan wu

        有請人確認過接線方向和電流方向了 因為是將各用具焊上板子的 照片可能會較難讀懂 目前值出現的不太規律 偶爾會跳出很高的數值

        反覆測試幾次後 終於沒有問題時 將線路用焊接固定後 值的出現卻不太符合正常變化了 例如調高吹風機的風速 她的值並不會依風力的強度增加 甚至將吹風機關掉時 值也不會下降 請問可以推測是哪一方面問題呢?

        • 假設你的電路都沒問題情況,這個出來的感應電流很小,在焊接時盡量降低阻抗,比如焊點簡單,導線粗一點的,我有發生過手焊第二塊時出來的值不正確,後來修一下電路的焊點就正常了,還有這類的要量微小電流可能準確性不高,這點要注意,如果你要量的電流很小就要改用ACS-712這種的可能比較適當

          • yi-shan wu

            好的 謝謝

  • yi-shan wu

    嘗試很多次後 現在用麵包板試 可以幫忙看一下線路這樣對嗎?

    還有 我對loop內的這行 double Irms = emon1.calcIrms(1480); 裡面的1480這個值有疑問 請問怎麼來的呢? 我想嘗試手動把值調高

    • 這個是取樣次數的值,數值愈多取樣次數愈多,準確度會高一點點(但差異不太大),1480是在台灣算還合用的參考值,如果你要校準的話應該要調整emon1.current(5,65)中的65值,至於校準需要用到市面上的勾表來輔助校準。(你的圖接線錯了,下圖試試)

      • yi-shan wu

        謝謝

    • 已經補上麵包版電路照片

  • Guest

    嘗試很多次後 現在用麵包板試 可以幫忙看一下線路這樣對嗎?

    還有 我對loop內的這行 double Irms = emon1.calcIrms(1480); 裡面的1480這個值有疑問 請問怎麼來的呢? 我想嘗試手動把值調高 謝謝你的幫忙

    • 這個是取樣次數的值,數值愈多取樣次數愈多,準確度會高一點點(但差異不太大),1480是在台灣算還合用的參考值,如果你要校準的話應該要調整emon1.current(5,65)中的65值,至於校準需要用到市面上的勾表來輔助校準。

      • Sean Wang

        請問如果是sct-013-060 他本身是電壓1v輸出 是否就不用再接電容轉成電壓

        • 可以啊,不過你要將準位做一些調整才能配合library

          • Sean Wang

            所以您在本範例使用的是 http://goods.ruten.com.tw/item/show?21110264485194 是這個嗎 我看規格 只有這個訊號是電流 其他都是電壓 抱歉 還是不確定再跟您問一下 那如果是像 http://goods.ruten.com.tw/item/show?21602665849065 能請問電路該怎麼接嗎 不好意思 對這個完全不懂

          • 雖然我這是電流,但有經過轉成電壓動作,您的如果已經輸出是電壓,且確定輸入時不會超過Arduino輸入的承受電壓(<5V),那就可以接入後試試調整emon1.current(5, 65); 之中的65值(配合電流表校正),您可以改成30試試看。

          • Sean Wang

            請問這個 偏移植 是指 我電表量測到得值 與 輸出的 比例值嗎? 很感謝您寫這範例,我請廠商將 零件的3.5mm拆掉 直接拉線出來接 照您的 電路輸出 初步有成功量測到數值

          • 的確為比例值,所以您要先大約校正一下才能量出接近實際的值

          • Sean Wang

            能否請問一下 電容耐壓應該買幾v的呀, 小弟碰到一個很怪的狀況 電源都關的 但是感測器 竟然有輸出值 用 電表量測也是0 這樣算是壞掉媽

          • 感測器是利用霍爾電流的方式感應電流再轉成電壓,所以本身有沒有插電,如果它能感應到電流且夠大就能轉成電壓的,這算正常

          • Sean Wang

            不好意思 丹尼大 能幫我看一下 我這樣接有錯嗎 電阻值有量測過 ok , 電容10uf/50v 我的問題在於 電流從0.1升到0.7安培 , 都感測不到== 輸出都一直在0.2上下跳動這樣

          • SCT013-060?電壓型中間不用接33歐姆的電阻。

          • Sean Wang

            不好意思 能再請教一下嗎 電容是 正極接地嗎? 因為看電路圖看不出來 謝謝

          • 負極接地

        • Sean Wang

          另外能否請教 3.5mm那個插座名稱是?

  • yi-shan wu

    安安 謝謝版主一直以來的幫忙 我按照版主的建議去更改接線 做出來的值在吹風機調整風速時 有了合理的變化 但目前最為頭痛的問題是 當沒有任何負載時值也會一直瘋狂地跳亂 且忽大忽小 另我無法直接扣除該值

    請問這該怎麼處理呢?

    • 使用互感的方式取得的容易受環境影響,解析度也如此,所以可能你要設限去忽略低於某些值情況下算是"雜訊",如果你無負載時的跳動範圍非常的寬時就要注意電路的設計是否過長(因在此電路上並未做特別的放大處理)。

      • yi-shan wu

        謝謝 我會試試

  • yi-shan wu

    丹尼大大 很抱歉我聽了你的說明後 每次嘗試都沒有成功 我實驗非常需要這個模組 請問可以直接跟你買一整套嗎? 請寄信給我 和我談細節 我會和你解釋我的用途 真的非常非常急需你的幫忙

  • chen jimmy

    能不用外接電路 也有 功能麼

    • 不行喔!

    • chen jimmy

      SCT 013 插頭 插的是 耳機座麼

      • 轉接成耳機的插頭再配合耳機座進行連接

      • chen jimmy

        想問的是 如果sct 013我買來 用插頭拆下的兩條線來做 會影響到麼?

        • 不會,只知確定2條線的定義去連接就能正常使用,並需要耳機接頭去使用

  • chen jimmy

    SCT 013 030 跟 文中的 020 有差麼

    • 不同,030、020輸出是電壓,文中是 000 輸出是電流再經過電路轉換

      • chen jimmy

        意思是如果使用030 將電壓弄成arduino 能量測到的範圍就可以?

        • 對啊!

          • chen jimmy

            那程式有差別麼 畢竟 000是量電流

          • chen jimmy

  • Pingback: Arduino 使用 SCT013 量電流(ADS1115) | 可丁丹尼@一路往前走2.0()