风筝
发表于: 2018-7-19 11:48:18 | 显示全部楼层

大家都知道,在每个房子或办公室里面,都会安装有一块电能表来测量使用的电量。每个月的最后一天,很多人都会担心电费高,我们不得不偶尔看一下电能表。但是,如果我们能够监控世界各地的电力使用情况,并在电量达到阈值时收到短信/电子邮件提醒,那会怎么样呢?这里,我们介绍如何制作一款基于物联网的电能表项目。


在本篇文章中,我们使用Arduino开发板和ESP8266 Wi-Fi模块制作智能电能表,它不仅可以向您发送电费账单的短信/电子邮件,还可以随时随地监控能耗的使用情况。在这里,我们使用电流传感器ACS712来测量能耗。


我们将借助IFTTT平台将Wi-Fi链接到SMS /电子邮件通知。我们还将使用MQTT Dashboard Android App来监控能耗使用情况。是不是很期待?让我们开始吧......


所需的材料

●     Arduino Uno开发板

●     ESP12 / NodeMCU模块

●     30A电流传感器ACS712

●     AC设备

●     连接导线


ACS712电流传感器的工作原理

在我们开始制作项目之前,了解ACS712电流传感器的工作原理非常重要,因为它是项目的关键组成部分。由于噪声以及不正确的隔离问题等,测量电流尤其是交流电流,一直是一项艰巨的任务。但是,借助这款由Allegro设计的ACS712模块,测量电流将会变得非常容易。


该模块的工作原理是由Edwin Hall博士发现的霍尔效应原理。根据他的原理,当载流导体置于磁场中时,在其垂直于电流和磁场方向的边缘上产生电压。我们不要深入了解这个概念,只需知道使用霍尔传感器来测量载流导体周围的磁场。这个测量将以毫伏为单位,我们称之为霍尔电压。该测量的霍尔电压与流过导体的电流成比例。



使用ACS712电流传感器的主要优点是可以测量交流和直流电流,还可以在负载(交流/直流负载)和测量单元(微控制器部件)之间提供隔离。如图所示,模块上有三个引脚,分别为Vcc、Vout和Ground。

current-sesnor-module-ACS712-5A.jpg

电流传感器模块ACS712-5A


两针的接线端子是载流导线应通过的地方。模块工作在+ 5V,因此Vcc应由5V供电,接地应连接到系统的接地。 Vout引脚的偏移电压为2500mV,这意味着当没有电流流过导线时,输出电压将为2500mV;当电流为正时,电压将大于2500mV,当电流为负时,电压小于2500mV。


我们将使用Arduino的模拟引脚读取模块的输出电压(Vout),当没有电流流过电线时,输出电压为512(2500mV)。当电流沿负方向流动时,该值将减小,并且随着电流在正方向上流动,该值将增加。下表将帮助您了解输出电压和ADC值如何根据流过电线的电流而变化。

digital-ammeter-output-current-and-ADC-values.png


这些值是根据ACS712数据表中给出的信息计算的。您还可以使用以下公式计算它们:

  1. Vout Voltage(mV) = (ADC Value/  1023)*5000
  2. Current Through the Wire (A) = (Vout(mv)-2500)/185
复制代码

现在,我们知道ACS712传感器的工作原理以及可以用它实现哪些功能。我们来看项目的电路图。


电路原理图

Circuit-Diagram-for-IoT-based-Electricity-Energy-Meter-using-ESP12-and-Arduino.png


以上给出了使用Arduino和NodeMCU制作的基于物联网的电能表的电路图,与ESP12的连接方式如下:

连接ESP12的Rx - > Arduino的Tx。

连接ESP12的Tx - > Arduino的Rx。


在NodeMCU(ESP12)中有一个模拟引脚,我们可以使用该引脚,但ESP系列的引脚可以输入最高3.3伏的电压。由于我们使用的电流传感器可以提供高达5伏的电压,因此可能会损坏Wi-Fi模块,这就是我们不使用独立NodeMCU的原因。


为了使电流传感器输出3.3V而不是5V,我们不能在电流传感器和NodeMCU的模拟引脚之间使用分压电路,因为正如我们上面讨论的那样,在2.5V输出电流传感器时,电流为0Amp。

因此,Arduino将通过模拟引脚读取当前传感器值,并使用串行通信将其发送到Wi-Fi模块ESP12。在NodeMCU的接收引脚上使用分压电路,使接收器引脚可以达到3.3电压电平。

IoT-based-Electricity-Energy-Meter-using-ESP12-and-Arduino.jpg



为了监控我们在互联网上的能量使用情况,我们必须使用MQTT中间件。我们将使用MQTT中间件作为AdaFruit IO平台,并按照以下流程制作此物联网电能表:

1.    注册AdaFruit帐户以存储电表读数。

2.    在IFTTT中创建小程序,用于触发电能表的SMS /电子邮件

3.    编写Arduino和ESP12 Wi-Fi模块的代码。

跳转到指定楼层
风筝
发表于: 2018-7-19 14:28:34 | 显示全部楼层

注册一个AdaFruit帐户用于通信

首先,我们将在AdaFruit IO中制作一个Feed。 Feed存储由IFTTT发送的数据。要制作一个Feed,请按以下步骤操作:

第1步: - 使用您的凭据登录Adafruit IO,或者如果您没有帐户,请注册一个账户。

Login-to-Adafruit-IO.jpg


第2步:点击My account -> Dashboard

Open-Dashboard-in-your-Adafruit-Account.jpg


第3步:单击Actions,然后单击Create a New Dashboard

Create-new-Dashboard-in-your-Adafruit-Account.png


第4步:为您的Feed提供名称和说明,然后单击Create

Give-name-and-description-to-your-feed-on-Adafruit.jpg


第5步:单击Key按钮,并记下AIO Keys,我们将在代码中使用此密钥。

Get-your-AIO-keys-from-key-button.png


Note-down-AIO-keys.jpg


第6步:单击“+”按钮创建一个新块,然后单击Gauge以显示电量使用情况。您还可以使用简单的文本框来显示电量。

Create-a-new-Block-on-Adafruit-Dashboard.png


第7步:现在,输入Feed的名称,然后单击“Create”。然后选择Feed并单击Next步骤。

Name-your-Feed.jpg


第8步:在Block Setting块设置中,分别填写最小值和最大值为0和100,或者您可以根据需要进行修改。

Setup-the-Block-setting-created-on-Adafruit-Dashboard.jpg


第9步:成功创建了电量的Feed。现在,通过单击“+”符号创建显示Bill的Feed。

Successfully-created-Power-feed.png


现在,我们可以使用IFTTT将AdaFruit IO链接到SMS / E-mail。


在IFTTT中创建小程序,用于触发电能表的SMS /电子邮件

第1步:使用您的凭据登录IFTTT。

第2步:在我的小程序上,单击“New Applet”.

Choose-New-Applet-on-IFTT.png


第3步:点击+ this

第4步:搜索AdaFruit并单击它。

Choose-Adafruit-Service-on-your-IFTT-server.png


第5步:单击监控AdaFruit IO上的Feed。

Choose-trigger-on-your-IFTT-server.png


第6步:选择Feed作为帐单,将Relationship作为“等于”以及您想要电子邮件的阈值。单击“Create action”。我用4作为我的阈值触发值。

Monitor-a-feed-on-Adafruit-IO-using-IFTT.png



第7步:点击+this。搜索G-mail并单击它并使用您的g-mail凭据登录。

Choose-Gmail-as-action-service-on-your-IFTT-server.png


第8步:点击send yourself an email

Choose-action-for-gmail-on-your-IFTT-server.png



第9步:如图所示编写主题和正文,然后单击以创建。

Complete-action-field-for-gmail-on-your-IFTT-server.png



第10步:方法已经准备就绪。检查,然后单击Finish


Review-and-finish-Email-setup-on-your-IFTT-server.png



现在,我们完成了Web集成。接下来继续编写代码的部分..

回复

使用道具 举报

风筝
发表于: 2018-7-19 15:09:46 | 显示全部楼层

代码和说明

在ESP12和Arduino之间,我们采用的是串行通信方式。因此,我们必须为Arduino和NodeMCU编写代码,以实现发送和接收功能。


发送部分代码,即Arduino Uno代码:

完整的Arduino代码在本文的末尾处给出。我们将使用电流传感器库,可从此链接下载。


该库具有内置函数来计算电流。您可以编写代码来计算电流,但该库具有准确的电流测量算法。


首先,包含电流传感器的库:

  1. #include“ACS712.h”
复制代码

声明一个数组来保存电量,以便将其发送到NodeMCU。

  1. char watt [5];
复制代码

创建一个实例以在PIN A0处使用ACS712-30Amp。如果您使用20Amp或5 Amp,请更改第一个参数。

  1. ACS712 sensor(ACS712_30A, A0);
复制代码

setup()函数中,定义与NodeMCU通信波特率为115200。调用sensor.calibrate()函数校准电流传感器以获得准确的读数。

  1. void setup() {
  2.   Serial.begin(115200);
  3.   sensor.calibrate();
  4. }
复制代码

loop()函数中,我们将调用sensor.getCurrentAC();函数获取电流值,然后存储在浮点变量I中。获得电流值后,使用P = V * I公式计算功率。我们使用230V是因为它是欧洲国家的通用标准,如有必要,请更改为您当地的标准。

  1. void loop() {
  2.   float V= 230;
  3.   float I = sensor.getCurrentAC();
  4.   float P = V * I;
复制代码

以下代码将功率转换为Wh。

  1. last_time = current_time;
  2.   current_time = millis();   
  3.   Wh = Wh+  P *(( current_time -last_time) /3600000.0) ;
复制代码

现在,我们必须将此Wh转换为字符形式,以将其发送到NodeMCU,对于此,dtostrf()函数将float转换为char数组,以便可以轻松打印:

  1.    dtostrf(Wh, 4, 2, watt);
复制代码

函数的格式为:

  1. dtostrf(floatvar, StringLengthIncDecimalPoint, numVarsAfterDecimal, charbuf);
复制代码

使用Serial.write();函数将此字符数组写入串行缓冲区。这将向NodeMCU发送Wh值。

  1. Serial.write(watt);
  2.   delay(10000);
  3. }
复制代码


接收部分(NodeMCU ESP12)的代码

对于本部分的代码,我们需要AdaFruit MQTT库,可以从此链接下载。


现在,打开Arduino IDE。转到examples -> AdaFruit MQTT library -> mqtt_esp8266

Open-Example-for-mqtt-esp8266-in-Arduino-UNO.png


我们将根据AIO密钥和Wi-Fi凭证以及来自Arduino的传入串行数据编辑此代码。


首先,我们包括ESP12 Wi-Fi模块和AdaFruit MQTT的所有库。

  1. #include <ESP8266WiFi.h>
  2. #include "Adafruit_MQTT.h"
  3. #include "Adafruit_MQTT_Client.h"
复制代码

我们为您的Wi-Fi定义SSID和密码,您可以根据该wifi连接ESp-12e。

  1. #define WLAN_SSID       "xxxxxxxx"
  2. #define WLAN_PASS       "xxxxxxxxxxx"
复制代码

本节定义了AdaFruit服务器和服务器端口,分别固定为“io.adafruit.com”和“1883”。

  1. #define AIO_SERVER      "io.adafruit.com"
  2. #define AIO_SERVERPORT  1883   
复制代码

将这些字段替换为您在制作Feed时从AdaFruit网站复制的用户名和AIO密钥。

  1. #define AIO_USERNAME    "********"
  2. #define AIO_KEY         "******************************"
复制代码

然后我们创建了一个ESP12 WiFiClient类来连接到MQTT服务器。

  1. WiFiClient client;
复制代码

通过传入WiFi客户端和MQTT服务器以及登录详细信息来设置MQTT客户端类。

  1. Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
复制代码

设置名为“power”和“bill”的Feed,以便发布更改。

  1. Adafruit_MQTT_Publish Power = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/Power");
  2. Adafruit_MQTT_Publish bill = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/bill");
复制代码

setup函数中,我们将Wi-Fi模块连接到Wi-Fi接入点。

  1. void setup() {
  2.   Serial.begin(115200);
  3.   delay(10);
  4.   Serial.println(F("Adafruit MQTT demo"));
  5.   // Connect to WiFi access point.
  6.   Serial.println(); Serial.println();
  7.   Serial.print("Connecting to ");
  8.   Serial.println(WLAN_SSID);
  9.   WiFi.begin(WLAN_SSID, WLAN_PASS);
  10. ….
  11. ….

  12. }
复制代码

loop()函数中,我们将检查来自Arduino的传入数据并将此数据发布到AdaFruit IO。

  1. void loop() {
  2.   // Ensure the connection to the MQTT server is alive (this will make the first
  3.   // connection and automatically reconnect when disconnected).  See the MQTT_connect
  4.   // function definition further below.
  5.   MQTT_connect();

  6. int i=0;
  7. float watt1;
复制代码

此函数检查来自Arduino的传入数据,并使用serial.read()函数将此数据存储到watt []数组中。

  1. if(Serial.available() > 0 ){
  2.    delay(100); //allows all serial sent to be received together
  3.     while(Serial.available() && i<5) {
  4.      watt[i++] = Serial.read();
  5.     }
  6.     watt[i++]='\0';
  7.   }
复制代码

atof()函数将字符转换为浮点值,我们将此浮点值存储在另一个浮点变量watt1中。

  1. watt1 = atof(watt);
复制代码

通过将功率(以Wh计)与能量费率相乘来计算账单金额,并将其除以1000以使功率以KWh为单位。

  1.   bill_amount = watt1 * (energyTariff/1000);      // 1unit = 1kwH
复制代码

现在我们可以发布内容!

  1.   Serial.print(F("\nSending Power val "));
  2.   Serial.println(watt1);
  3.   Serial.print("...");
复制代码

这段代码是将功率值发布到Power Feed

  1.   if (! Power.publish(watt1)) {
  2.     Serial.println(F("Failed"));
  3.   } else {
  4.     Serial.println(F("OK!"));
  5.   }
复制代码

这将把电费账单发布到bill feed。

  1.    if (! bill.publish(bill_amount)) {
  2.     Serial.println(F("Failed"));
  3.   } else {
  4.     Serial.println(F("OK!"));
  5. }
复制代码

我们的bill值可能会快速变化,但IFTTT需要时间才能触发applet,因此这些代码将为触发提供时间,以便我们可以接收阈值电子邮件。


更改要获取电子邮件的bill_amount值。此外,更改IFTTT AdaFruit IO设置。

  1. if (bill_amount==4){
  2. for (int i =0; i<=2; i++)
  3. {
  4.   bill.publish(bill_amount);
  5. delay(5000);
  6. }
  7. bill_amount =6;
  8. }
复制代码

现在,将代码上传到两个开发板。按照电路图和Open io.adafruit.com中所示连接硬件。打开刚刚创建的仪表板dashboard。您将看到功耗和电费账单正在更新。


当您的账单达到4卢比时,您将收到这样的电子邮件。

Mail-Received-on-Gmail-from-IFTT-server.png

回复

使用道具 举报

风筝
发表于: 2018-7-19 15:40:09 | 显示全部楼层

监控电量的Android App

我们可以使用Android App监控这些值。从此链接下载MQTT Dashboard Android应用程序。


要设置与io.adafruit.com的连接,请按照下列步骤操作:

第1步:打开应用程序,然后单击“+”符号。填写Client ID。服务器和端口保持和屏幕截图保持一致。您将从AdaFruit IO仪表板获取用户名和密码(活动密钥),如下所示。

Add-a-connection-on-MQTT-Dashboard-android-app.png

Active Key是您的密码。


步骤2:选择Electricity Meter,然后选择Subscribe。在订阅中,给名称和主题起个名字。主题格式为“yourusername”/ feeds /'feedname',然后点击“Create”。

Select-Electricity-meter-in-connection-and-subscribe.png


第3步:以同样的方式,制作bill feed订阅。

第4步:当您的设备消耗能量时,更新的值将显示在Power和Bill下。

Displaying-Bill-and-Power-on-MQTT-Dashboard-app.png


以上内容就是创建智能电能表的方法,它不仅可以在世界任何地方进行监控,还可以在电量消耗较高时触发电子邮件。


代码

本篇文章使用的完成代码如下: main.rar (1.45 KB, 下载次数: 55)

回复

使用道具 举报

FarGood2002
发表于: 2019-11-29 19:20:34 | 显示全部楼层

风筝 发表于 2018-7-19 15:09
代码和说明在ESP12和Arduino之间,我们采用的是串行通信方式。因此,我们必须为Arduino和NodeMCU编写代码, ...

请问一下楼主,为什么我把ACS712 sensor(ACS712_30A, A0);改为ACS712 sensor(ACS712_5A, A0);时这行代码又不行了呢 IMG_20191129_192000.jpg
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1479



手机版|

GMT+8, 2024-3-29 17:27 , Processed in 0.689099 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表