|
代码和说明 在ESP12和Arduino之间,我们采用的是串行通信方式。因此,我们必须为Arduino和NodeMCU编写代码,以实现发送和接收功能。
发送部分代码,即Arduino Uno代码:
完整的Arduino代码在本文的末尾处给出。我们将使用电流传感器库,可从此链接下载。
该库具有内置函数来计算电流。您可以编写代码来计算电流,但该库具有准确的电流测量算法。
首先,包含电流传感器的库: 声明一个数组来保存电量,以便将其发送到NodeMCU。 创建一个实例以在PIN A0处使用ACS712-30Amp。如果您使用20Amp或5 Amp,请更改第一个参数。 - ACS712 sensor(ACS712_30A, A0);
复制代码
在setup()函数中,定义与NodeMCU通信波特率为115200。调用sensor.calibrate()函数校准电流传感器以获得准确的读数。 - void setup() {
- Serial.begin(115200);
- sensor.calibrate();
- }
复制代码
在loop()函数中,我们将调用sensor.getCurrentAC();函数获取电流值,然后存储在浮点变量I中。获得电流值后,使用P = V * I公式计算功率。我们使用230V是因为它是欧洲国家的通用标准,如有必要,请更改为您当地的标准。 - void loop() {
- float V= 230;
- float I = sensor.getCurrentAC();
- float P = V * I;
复制代码以下代码将功率转换为Wh。 - last_time = current_time;
- current_time = millis();
- Wh = Wh+ P *(( current_time -last_time) /3600000.0) ;
复制代码
现在,我们必须将此Wh转换为字符形式,以将其发送到NodeMCU,对于此,dtostrf()函数将float转换为char数组,以便可以轻松打印: 函数的格式为: - dtostrf(floatvar, StringLengthIncDecimalPoint, numVarsAfterDecimal, charbuf);
复制代码
使用Serial.write();函数将此字符数组写入串行缓冲区。这将向NodeMCU发送Wh值。 - Serial.write(watt);
- delay(10000);
- }
复制代码
接收部分(NodeMCU ESP12)的代码
对于本部分的代码,我们需要AdaFruit MQTT库,可以从此链接下载。
现在,打开Arduino IDE。转到examples -> AdaFruit MQTT library -> mqtt_esp8266
我们将根据AIO密钥和Wi-Fi凭证以及来自Arduino的传入串行数据编辑此代码。
首先,我们包括ESP12 Wi-Fi模块和AdaFruit MQTT的所有库。 - #include <ESP8266WiFi.h>
- #include "Adafruit_MQTT.h"
- #include "Adafruit_MQTT_Client.h"
复制代码我们为您的Wi-Fi定义SSID和密码,您可以根据该wifi连接ESp-12e。 - #define WLAN_SSID "xxxxxxxx"
- #define WLAN_PASS "xxxxxxxxxxx"
复制代码
本节定义了AdaFruit服务器和服务器端口,分别固定为“io.adafruit.com”和“1883”。 - #define AIO_SERVER "io.adafruit.com"
- #define AIO_SERVERPORT 1883
复制代码
将这些字段替换为您在制作Feed时从AdaFruit网站复制的用户名和AIO密钥。 - #define AIO_USERNAME "********"
- #define AIO_KEY "******************************"
复制代码
然后我们创建了一个ESP12 WiFiClient类来连接到MQTT服务器。 通过传入WiFi客户端和MQTT服务器以及登录详细信息来设置MQTT客户端类。 - Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
复制代码设置名为“power”和“bill”的Feed,以便发布更改。 - Adafruit_MQTT_Publish Power = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/Power");
- Adafruit_MQTT_Publish bill = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/bill");
复制代码
在setup函数中,我们将Wi-Fi模块连接到Wi-Fi接入点。 - void setup() {
- Serial.begin(115200);
- delay(10);
- Serial.println(F("Adafruit MQTT demo"));
- // Connect to WiFi access point.
- Serial.println(); Serial.println();
- Serial.print("Connecting to ");
- Serial.println(WLAN_SSID);
- WiFi.begin(WLAN_SSID, WLAN_PASS);
- ….
- ….
- …
- }
复制代码
在loop()函数中,我们将检查来自Arduino的传入数据并将此数据发布到AdaFruit IO。 - void loop() {
- // Ensure the connection to the MQTT server is alive (this will make the first
- // connection and automatically reconnect when disconnected). See the MQTT_connect
- // function definition further below.
- MQTT_connect();
- int i=0;
- float watt1;
复制代码
此函数检查来自Arduino的传入数据,并使用serial.read()函数将此数据存储到watt []数组中。 - if(Serial.available() > 0 ){
- delay(100); //allows all serial sent to be received together
- while(Serial.available() && i<5) {
- watt[i++] = Serial.read();
- }
- watt[i++]='\0';
- }
复制代码
atof()函数将字符转换为浮点值,我们将此浮点值存储在另一个浮点变量watt1中。 通过将功率(以Wh计)与能量费率相乘来计算账单金额,并将其除以1000以使功率以KWh为单位。 - bill_amount = watt1 * (energyTariff/1000); // 1unit = 1kwH
复制代码
现在我们可以发布内容! - Serial.print(F("\nSending Power val "));
- Serial.println(watt1);
- Serial.print("...");
复制代码
这段代码是将功率值发布到Power Feed - if (! Power.publish(watt1)) {
- Serial.println(F("Failed"));
- } else {
- Serial.println(F("OK!"));
- }
复制代码
这将把电费账单发布到bill feed。 - if (! bill.publish(bill_amount)) {
- Serial.println(F("Failed"));
- } else {
- Serial.println(F("OK!"));
- }
复制代码
我们的bill值可能会快速变化,但IFTTT需要时间才能触发applet,因此这些代码将为触发提供时间,以便我们可以接收阈值电子邮件。
更改要获取电子邮件的bill_amount值。此外,更改IFTTT AdaFruit IO设置。 - if (bill_amount==4){
- for (int i =0; i<=2; i++)
- {
- bill.publish(bill_amount);
- delay(5000);
- }
- bill_amount =6;
- }
复制代码
现在,将代码上传到两个开发板。按照电路图和Open io.adafruit.com中所示连接硬件。打开刚刚创建的仪表板dashboard。您将看到功耗和电费账单正在更新。
当您的账单达到4卢比时,您将收到这样的电子邮件。
|