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 新增文章