能源监控器,无论是覆盖整个公寓,还是仅用于监控一台设备,都为您提供了一种跟踪消耗并进行必要调整的方法。尽管它们在市场上的供应量越来越大,但在我看来,这家制造商仍然认为构建一个可以满足特定个人需求的DIY版本是一个好主意。因此,对于今天的教程,我们将构建一个Raspberry Pi功耗监视器,该监视器能够获取能耗并将其上传到Adafruit.io。
您还可以查看我们之前建造的基于Arduino的IoT电能表和预付费GSM电能表。
Raspberry Pi智能电表框图
下面显示了显示系统工作原理的框图。
接一个接一个接一个地
电流检测单元:电流检测单元由SCT -013电流传感器组成,该电流传感器可以测量高达100A的电流,具体取决于所购买的版本。传感器将流过电流的电流转换为小电流,然后将电流通过分压器网络馈入ADC。
电压传感单元: 当我无法将手放在电压传感器模块上时,我们将构建一个DIY无变压器电压传感器,该传感器使用分压器原理测量电压。DIY电压传感器包括分压器级,其中高压被转换为适合输入到ADC的值。
处理单元:处理单元包括ADC和Raspberry pi。ADC接收模拟信号,并将其发送到树莓派,然后由树莓派计算出所消耗的确切电量,并将其发送到指定的设备云。就本教程而言,我们将使用Adafruit.io作为我们的设备云。我们还建立了其他
免责声明: 在开始之前,重要的是要提到此项目涉及到交流电源的连接,这很危险,如果操作不当,可能会致命。尝试进行此操作之前,请确保您有解决AC的经验。
准备?让我们潜入。
所需组件
构建此项目需要以下组件;
- Raspberry Pi 3或4(带有WiFi加密狗的RPI2的过程应相同)
- ADS1115 16位I2C ADC
- YHDC SCT-013-000
- 2.5A 5V MicroUSB电源适配器
- 2W 10K电阻器(1)
- 1 / 2W 10K电阻器(2)
- 33ohm电阻器(1)
- 2W 3.3k电阻器(1)
- IN4007二极管(4)
- 3.6v稳压二极管(1)
- 10k电位器(或预设)(1)
- 50v 1uf电容器
- 50v 10uf电容器(2)
- 面包板
- 跳线
- Raspberry Pi使用的其他配件。
除了上面列出的硬件组件之外,该项目还需要一些软件依赖项和库,我们将在继续进行安装。
尽管本教程无论使用什么树莓派操作系统都可以运行,但我将使用在Pi 3上运行的Raspberry Pi破坏者操作系统(也应该在Pi 4上运行),并且假定您熟悉使用以下命令设置Raspberry Pi Raspbian Buster OS(与以前的版本几乎相同的过程),并且您知道如何使用诸如hyper的终端软件通过SSH进入它。如果您对此有任何疑问,此网站上有大量的Raspberry Pi教程可以为您提供帮助
准备Pi
在开始连接组件和编码之前,需要在树莓派上执行一些简单的任务,以确保我们准备就绪。
步骤1:启用Pi I2C
当今项目的核心不仅是树莓派,还包括基于16位I2C的ADS1115 ADC。ADC允许我们将模拟传感器连接到Raspberry Pi,因为Pi本身没有内置的ADC。它通过自己的ADC接收数据,并通过I2C将其转发到树莓派。因此,我们需要在Pi上启用I2C通信,以便它可以与其进行通信。
可以通过树莓派的配置页面启用或禁用Pi的I2C总线。要启动它,请单击桌面上的Pi图标,然后选择首选项,然后选择Raspberry pi配置。
这应该打开配置页面。检查已启用的I2C单选按钮,然后单击“确定”以保存它,然后重新启动Pi以进行更改。
如果您以无头模式运行Pi,则可以通过运行 sudo raspi-config 来访问Raspbian配置页面 。
步骤2:从Adafruit安装ADS11xx库
我们需要做的第二件事是安装ADS11xx python库,该库包含函数和例程,这些函数和例程使我们可以轻松编写python脚本以从ADC取值。
请按照以下步骤进行操作。
- 通过运行来更新您的pi; sudo易于得到更新 ,随后 通过 sudo易于得到提升 ,这将更新PI确保有供您选择安装任何新的软件不兼容的问题。
- 接下来,运行 cd〜 命令以确保您位于主目录中。
- 接下来,通过运行安装build-essentials; sudo apt-get install build-essential python-dev python-smbus git
- 接下来,通过运行克隆包含ADS库的Adafruit git文件夹; git clone https://github.com/adafruit/Adafruit_Python_ADS1x15.git
- 切换到克隆文件的目录,然后使用来运行安装文件;cd Adafruit_Python_ADS1x1z, 然后是 sudo python setup.py install
完成后,安装现在应该完成了。
您可以按照下面的示意图部分所示连接ADS1115来测试库的安装,并首先运行库附带的示例代码,使用进入其文件夹。 cd示例 并使用运行示例; python simpletest.py
步骤3:安装Adafruit.IO Python模块
正如在介绍中提到的那样,我们将把电压和电流传感器的读数发布到Adafruit IO Cloud,可以从世界各地查看它,或者与IFTTT连接以执行您想要的任何动作。
Adafruit.IO python模块包含子例程和函数,我们将利用这些子例程和函数轻松地将数据流式传输到云。请按照以下步骤安装模块。
- 运行 cd〜 返回主目录。
- 接下来,运行命令; sudo pip3安装adafruit-io 。它应该安装Adafruit IO python模块。
步骤4:设置您的Adafruit.io帐户
要使用Adafruit IO,肯定需要先创建一个帐户并获取一个AIO密钥。python脚本将使用此AIO密钥以及您的用户名来访问Adafruit IO云服务。要创建一个帐户,请访问;https://io.adafruit.com/,单击“免费入门”按钮,然后填写所有必需的参数。完成“注册”后,您应该在主页右侧看到“查看AIO密钥”按钮。
单击它以获取您的AIO密钥。
复制密钥后,我们就可以开始了。但是,为简化将数据发送到云服务的过程,您还可以创建将向其发送数据的提要。(有关AIO供稿的更多信息,请参见)。由于我们基本上将发送功耗,因此我们将创建一个供稿。要创建提要,请单击AIO页面顶部的“提要”,然后单击“添加新提要”。
给它起任何您想要的名字,但为了简单起见,我将其称为能耗。您还可以决定为电压和电流创建提要,并修改代码以将数据发布给它们。
有了所有这些之后,我们现在就可以开始构建项目了。
Pi电能表电路图
Raspberry Pi能源监控器项目的原理图相对复杂,涉及到如前所述连接到交流电压,请确保您采取了所有必要的预防措施,以避免触电。如果您不熟悉安全处理交流电压的方法,那么在不加电的情况下在面包板上实现此乐趣就可以令人满意。
原理图包括将电压和电流传感器单元连接到ADC,然后ADC将数据从传感器发送到Raspberry Pi。为了使连接更容易理解,每个单元的原理图都单独显示。
电流传感器原理图
如下图所示,连接电流传感器的组件。
下图显示了该项目中使用的电流互感器,您可以看到其中有三根线,分别是地线,Cout和3.3V
电压传感器原理图
如下图所示连接电压传感器的组件。
处理单元原理图
将所有内容与连接到树莓派的ADC(ADS1115)以及分别连接到ADS1115的引脚A0和A1的电流和电压传感器的输出连接在一起。
确保两个传感单元的GND引脚都连接到ADC或树莓派的GND。
为了使事情不再那么不稳定,我在Protoboard上实现了电压和电流传感器。另外,不建议在试验板上建立交流电源电路。如果执行相同的操作,则最终设置可能如下图所示;
连接完成后,我们就可以编写该项目的代码了。
Pi电表的Python代码
与树莓派项目一样,我们将使用python开发该项目的代码。单击桌面上的树莓派图标,选择编程并启动要使用的任何版本的python。我将使用Python 3,而python 3中的某些功能可能不适用于python 2.7。因此,如果您想使用python 2.7,可能需要对代码进行一些重大更改。我将把代码分解成小片段,最后与您分享完整的代码。
准备?凉。
代码背后的算法很简单。我们的python脚本查询ADS1115(通过I2C)的电压和电流读数。接收到的模拟值被接收,采样并获得电压和电流的均方根值。计算出以千瓦为单位的功率,并在特定时间间隔后将其发送到Adafruit IO饲料。
我们通过包括将要使用的所有库来启动脚本。这包括内置库,例如时间和数学库以及我们之前安装的其他库。
进口时间 进口Adafruit_ADS1x15 从Adafruit_IO进口* 进口数学
接下来,我们将创建ADS1115库的实例,该实例将用于处理后续的物理ADC。
#创建一个ADS1115 ADC(16位)实例.. adc1 = Adafruit_ADS1x15.ADS1115()
接下来,提供您的adafruit IO用户名和“ AIO”键。
用户名='在引号之间输入您的用户名' AIO_KEY ='您的aio密钥' aio =客户端(用户名,AIO_KEY)
请妥善保管钥匙。未经您的许可,它可以用于访问您的adafruit io帐户。
接下来,我们创建一些变量,例如ADC的增益,所需的采样数并设置舍入,这绝对不是关键。
GAIN = 1#有关潜在值,请参阅ads1015 / 1115文档。 样本= 200#从ads1115个 地方获取的样本数量= int(2)#设置舍入
接下来,我们创建一个while循环来监视电流和电压,并定期将数据发送到Adafruit io。while循环通过将所有变量设置为零开始。
而True: #重置变量 count = int(0) datai = datav = maxIValue = 0#样品内的 最大 电流值maxVValue = 0#样品内的最大 电压值IrmsA0 = 0#均方根 电流VrmsA1 = 0#均方根电压ampsA0 = 0#当前峰值 伏特A1 = 0#电压 千瓦= float(0)
由于我们正在使用交流电路,因此SCT-013和电压传感器的输出将为正弦波,因此,为了从正弦波计算电流和电压,我们需要获取峰值。为了获得峰值,我们将同时采样电压和电流(200个采样),并找到最大值(峰值)。
对于范围(样本)中的 计数 :datai.insert(count,(abs(adc1.read_adc(0,gain = GAIN))))datav.insert(count,(abs(adc1.read_adc(1,gain = GAIN)) )) # 如果datai> maxIValue:maxIValue = datai(如果datav> maxVValue:maxVValue = datav ),看看是否有新的maxValue打印(datai)
接下来,我们通过将ADC值转换为实际值来对这些值进行标准化,然后再使用均方根方程式求出RMS电压和电流。
# 使用采样数据计算电流 #使用的sct-013已针对1000mV输出@ 30A进行了校准。 IrmsA0 =浮点数(maxIValue / float(2047)* 30) IrmsA0 =舍入(IrmsA0,地方) ampsA0 = IrmsA0 / math.sqrt(2) ampsA0 =舍入(ampsA0,地方) #计算电压 VrmsA1 = float(maxVValue * 1100 / float(2047)) VrmsA1 =圆(VrmsA1,位置) voltsA1 = VrmsA1 / math.sqrt(2) voltsA1 =圆(voltsA1,位置) print('Voltage:{0}'。format(voltsA1)) print('Current :{0}'。format(ampsA0))
完成此操作后,将计算功效并在adafruit.io上发布数据
#calculate power power = round(ampsA0 * voltsA1,places) print('Power:{0}'。format(power)) #将数据发布到adafruit.io EnergyUsage = aio.feeds('EnergyUsage') aio.send_data('能源使用”,功率)
对于免费帐户,adafruit要求在请求或数据上传之间存在一定的时间延迟。
#等待重复循环时间 .sleep(0)
该项目的完整代码位于本页底部
演示版
完成代码后,将其保存并点击python IDE上的运行按钮。在此之前,请确保Pi已通过WiFi或LAN连接到Internet,并且您的aio密钥和用户名正确。一段时间后,您应该开始在Adafruit.io的Feed上看到显示的能量数据(功率)。演示期间我的硬件设置是这样的
为了更进一步,您可以在adafruit.io上创建一个仪表板并添加一个图形组件,以便获得数据的图形视图,如下图所示。
就是这样,伙计们,您现在可以监控世界各地的能源消耗。重要的是要注意,肯定要进行很多微调和校准才能将其转换为真正准确的解决方案,但是我相信这几乎为您提供了进行下一步所需的一切。
欢迎通过评论部分向我提出有关该项目的问题。我将尽可能回答。直到下一次。