From cabf29dd5133c8ce340222c76ff10509e0599f3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A6=82=E6=84=8F=20=E5=BD=AD?= <2417589739@qq.com> Date: Mon, 15 Aug 2022 10:31:30 +0800 Subject: [PATCH] init --- .gitignore | 5 ++ .vscode/arduino.json | 6 ++ .vscode/extensions.json | 10 +++ .vscode/tasks.json | 13 +++ Image/Esp32.png | Bin 0 -> 114712 bytes include/Delay.h | 22 +++++ include/ElectricityDevice.h | 25 ++++++ include/Global.h | 19 +++++ include/Json.h | 37 +++++++++ include/MainDevice.h | 30 +++++++ include/ModbusRtu.h | 31 +++++++ include/MqttHelper.h | 44 ++++++++++ include/README | 39 +++++++++ include/VoltageDevice.h | 33 ++++++++ lib/README | 46 +++++++++++ platformio.ini | 21 +++++ src/Delay.cpp | 38 +++++++++ src/ElectricityDevice.cpp | 49 +++++++++++ src/Global.cpp | 5 ++ src/Json.cpp | 84 +++++++++++++++++++ src/JsonDemo.json | 19 +++++ src/MainDevice.cpp | 69 ++++++++++++++++ src/ModbusRtu.cpp | 101 +++++++++++++++++++++++ src/MqttHelper.cpp | 158 ++++++++++++++++++++++++++++++++++++ src/VoltageDevice.cpp | 56 +++++++++++++ src/main.cpp | 27 ++++++ test/README | 11 +++ 27 files changed, 998 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/arduino.json create mode 100644 .vscode/extensions.json create mode 100644 .vscode/tasks.json create mode 100644 Image/Esp32.png create mode 100644 include/Delay.h create mode 100644 include/ElectricityDevice.h create mode 100644 include/Global.h create mode 100644 include/Json.h create mode 100644 include/MainDevice.h create mode 100644 include/ModbusRtu.h create mode 100644 include/MqttHelper.h create mode 100644 include/README create mode 100644 include/VoltageDevice.h create mode 100644 lib/README create mode 100644 platformio.ini create mode 100644 src/Delay.cpp create mode 100644 src/ElectricityDevice.cpp create mode 100644 src/Global.cpp create mode 100644 src/Json.cpp create mode 100644 src/JsonDemo.json create mode 100644 src/MainDevice.cpp create mode 100644 src/ModbusRtu.cpp create mode 100644 src/MqttHelper.cpp create mode 100644 src/VoltageDevice.cpp create mode 100644 src/main.cpp create mode 100644 test/README diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..89cc49c --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.pio +.vscode/.browse.c_cpp.db* +.vscode/c_cpp_properties.json +.vscode/launch.json +.vscode/ipch diff --git a/.vscode/arduino.json b/.vscode/arduino.json new file mode 100644 index 0000000..9dd1002 --- /dev/null +++ b/.vscode/arduino.json @@ -0,0 +1,6 @@ +{ + "configuration": "FlashFreq=80,UploadSpeed=115200,DebugLevel=none", + "board": "esp32:esp32:esp32doit-devkit-v1", + "port": "COM9", + "sketch": "d:\\HBL\\Arduino\\test.ino" +} \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..080e70d --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,10 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "platformio.platformio-ide" + ], + "unwantedRecommendations": [ + "ms-vscode.cpptools-extension-pack" + ] +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..38680ca --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,13 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "type": "PlatformIO", + "task": "Check", + "problemMatcher": [ + "$platformio" + ], + "label": "PlatformIO: Check" + } + ] +} \ No newline at end of file diff --git a/Image/Esp32.png b/Image/Esp32.png new file mode 100644 index 0000000000000000000000000000000000000000..795a57f5dd8d17a28d290d8665b7f060fac1a040 GIT binary patch literal 114712 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 literal 0 HcmV?d00001 diff --git a/include/Delay.h b/include/Delay.h new file mode 100644 index 0000000..b89f3d7 --- /dev/null +++ b/include/Delay.h @@ -0,0 +1,22 @@ +#ifndef Delay_h +#define Delay_h + +#include +#include +#include + +class Delay +{ +private: + time_t start = 0, end = 0; + float cost = 0; + bool flag = false; + bool EN; + +public: + Delay(); + ~Delay(); + bool Start(bool IN, int PT); +}; + +#endif diff --git a/include/ElectricityDevice.h b/include/ElectricityDevice.h new file mode 100644 index 0000000..3dafdb1 --- /dev/null +++ b/include/ElectricityDevice.h @@ -0,0 +1,25 @@ +#include +#include "ModbusRtu.h" +#include "MqttHelper.h" +#include "Json.h" +#include "Global.h" + +/** + * @brief 电力设备 + * + */ +class ElectricityDevice +{ +private: + const byte interruptPin = 21; + + +public: + ElectricityDevice(/* args */); + ~ElectricityDevice(); + + void Init(); + void Start(); +}; + +extern ElectricityDevice _electricityDevice; diff --git a/include/Global.h b/include/Global.h new file mode 100644 index 0000000..5e81888 --- /dev/null +++ b/include/Global.h @@ -0,0 +1,19 @@ +#define AISLE 8 //采集设备通道数 +#ifndef _GLOBAL_H +#define _GLOBAL_H +struct DeviceData +{ + float Voltage; //电压 + float Current; //电流 + float Power; //功率 + float Energy; //电能 +}; + +extern struct DeviceData objDeviceData; + +extern float Voltage; + +extern float Current[AISLE]; + +extern DeviceData deviceModel[AISLE]; +#endif \ No newline at end of file diff --git a/include/Json.h b/include/Json.h new file mode 100644 index 0000000..6423df6 --- /dev/null +++ b/include/Json.h @@ -0,0 +1,37 @@ + +#ifndef Json_h +#define Json_h + +#include +#include "Global.h" + +class Json +{ +private: +public: + Json(/* args */); + ~Json(); + + /** + * @brief 设备状态Json数据上报 + * + */ + String StatusDataReport(); + + /** + * @brief 电能数据josn封装 + * + * @return String + */ + String PowerHarvesting(); + + /** + * @brief 解析获取到的电能数据 + * + * @param str + */ + void ParseJson(String str); +}; + +extern Json myJson; +#endif \ No newline at end of file diff --git a/include/MainDevice.h b/include/MainDevice.h new file mode 100644 index 0000000..5b28670 --- /dev/null +++ b/include/MainDevice.h @@ -0,0 +1,30 @@ +#include +#include "ModbusRtu.h" +#include "MqttHelper.h" +#include "Json.h" +#include "Global.h" +#include +#include +#include + +#define MAXITEMS 1000 +#define MAXMEMORY 1000 + +/** + * @brief 主设备 + * + */ +class MainDevice +{ +private: + TaskHandle_t MqttTest; + +public: + MainDevice(/* args */); + ~MainDevice(); + + void Init(); + void Start(); +}; + +extern MainDevice _mainDevice; diff --git a/include/ModbusRtu.h b/include/ModbusRtu.h new file mode 100644 index 0000000..f9b1ce1 --- /dev/null +++ b/include/ModbusRtu.h @@ -0,0 +1,31 @@ +#ifndef ModbusRtu_h +#define ModbusRtu_h + +#include +#include +#include "VoltageDevice.h" +#include +#include "Global.h" + +#define RE 22 +#define DE 23 +#define Status 2 +// #define AISLE 8 //采集设备通道数 + +class ModbusRtu +{ +private: + ModbusMaster myMaster; + +public: + ModbusRtu(/* args */); + ~ModbusRtu(); + + void Init(); + void Start(); + void Test(); +}; + +extern ModbusRtu myRtu; + +#endif \ No newline at end of file diff --git a/include/MqttHelper.h b/include/MqttHelper.h new file mode 100644 index 0000000..0c58254 --- /dev/null +++ b/include/MqttHelper.h @@ -0,0 +1,44 @@ +#ifndef MqttHelper_h +#define MqttHelper_h + +#include +#include +#include +#include + + +class MqttHelper +{ +private: + const char *id = "HBL1"; + const char *psw = "bpa.1qaz@WSX"; + const char *mqttServer = "10.2.1.21"; + const int mqttPort = 1883; //服务器TCP协议的端口号 + const char *mqttUser = "emqx_u_block"; //登录服务器所需的用户名 + const char *mqttPsw = "emqx_p_admin8765490789"; //密码 + const char *HeartbeatTopic = "UP/ENERGY_POWER/BUSINESS/0"; + + // const char *id = "pert"; + // const char *psw = "12345678"; + // const char *mqttServer = "111.9.47.105"; + // const int mqttPort = 18883; //服务器TCP协议的端口号 + // const char *mqttUser = "admin"; //登录服务器所需的用户名 + // const char *mqttPsw = "admin8765490789"; //密码 + // const char *HeartbeatTopic = "UP/ENERGY_POWER/BUSINESS/0"; + String clientId; + +public: + MqttHelper(/* args */); + ~MqttHelper(); + + + + void Init(); + void Loop(); + void publish(String message); + void ReConnect(); +}; + +extern MqttHelper _mqttHelper; + +#endif diff --git a/include/README b/include/README new file mode 100644 index 0000000..194dcd4 --- /dev/null +++ b/include/README @@ -0,0 +1,39 @@ + +This directory is intended for project header files. + +A header file is a file containing C declarations and macro definitions +to be shared between several project source files. You request the use of a +header file in your project source file (C, C++, etc) located in `src` folder +by including it, with the C preprocessing directive `#include'. + +```src/main.c + +#include "header.h" + +int main (void) +{ + ... +} +``` + +Including a header file produces the same results as copying the header file +into each source file that needs it. Such copying would be time-consuming +and error-prone. With a header file, the related declarations appear +in only one place. If they need to be changed, they can be changed in one +place, and programs that include the header file will automatically use the +new version when next recompiled. The header file eliminates the labor of +finding and changing all the copies as well as the risk that a failure to +find one copy will result in inconsistencies within a program. + +In C, the usual convention is to give header files names that end with `.h'. +It is most portable to use only letters, digits, dashes, and underscores in +header file names, and at most one dot. + +Read more about using header files in official GCC documentation: + +* Include Syntax +* Include Operation +* Once-Only Headers +* Computed Includes + +https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff --git a/include/VoltageDevice.h b/include/VoltageDevice.h new file mode 100644 index 0000000..95d3f37 --- /dev/null +++ b/include/VoltageDevice.h @@ -0,0 +1,33 @@ +#ifndef VoltageDevice_h +#define VoltageDevice_h + +#include +#include "Delay.h" + +class VoltageDevice +{ +private: + byte data[25]; + +public: + VoltageDevice(/* args */); + ~VoltageDevice(); + + /** + *@brief 通过串口读取设备数据 + */ + bool ReadData(); + + /** + * @brief 字节数组转换成浮点数 + * + * @param len 字节长度 + * @param Index 起始字节索引 + * @param bl 转换倍率 + * @return float + */ + float DataConvert(int len, int Index, int bl = 1); +}; + +extern VoltageDevice MyVd; +#endif \ No newline at end of file diff --git a/lib/README b/lib/README new file mode 100644 index 0000000..6debab1 --- /dev/null +++ b/lib/README @@ -0,0 +1,46 @@ + +This directory is intended for project specific (private) libraries. +PlatformIO will compile them to static libraries and link into executable file. + +The source code of each library should be placed in a an own separate directory +("lib/your_library_name/[here are source files]"). + +For example, see a structure of the following two libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- README --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +and a contents of `src/main.c`: +``` +#include +#include + +int main (void) +{ + ... +} + +``` + +PlatformIO Library Dependency Finder will find automatically dependent +libraries scanning project source files. + +More information about PlatformIO Library Dependency Finder +- https://docs.platformio.org/page/librarymanager/ldf.html diff --git a/platformio.ini b/platformio.ini new file mode 100644 index 0000000..6ab4fa4 --- /dev/null +++ b/platformio.ini @@ -0,0 +1,21 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[env:esp32doit-devkit-v1] +platform = espressif32 +board = esp32doit-devkit-v1 +framework = arduino +lib_ldf_mode = deep+ +lib_deps = + 4-20ma/ModbusMaster@^2.0.1 + khoih-prog/ESPAsync_WiFiManager@^1.12.2 + knolleary/PubSubClient@^2.8 + einararnason/ArduinoQueue@^1.2.5 + 256dpi/MQTT@^2.5.0 diff --git a/src/Delay.cpp b/src/Delay.cpp new file mode 100644 index 0000000..c353fc0 --- /dev/null +++ b/src/Delay.cpp @@ -0,0 +1,38 @@ +#include "Delay.h" + +Delay::Delay() +{ +} + +Delay::~Delay() +{ +} + +/** + * @brief 定时器 + * + * @param IN 定时器触发条件 + * @param PT 定时器时间设置 单位s + * @return true 到达定时时间 + * @return false 未到定时时间 + */ +bool Delay::Start(bool IN, int PT) +{ + EN = IN; + if (EN && cost < PT) + { + if (!flag) + { + time(&start); + flag = true; + } + time(&end); + cost = difftime(end, start); + } + else + { + cost = 0; + flag = false; + } + return cost >= PT; +} \ No newline at end of file diff --git a/src/ElectricityDevice.cpp b/src/ElectricityDevice.cpp new file mode 100644 index 0000000..0d7b001 --- /dev/null +++ b/src/ElectricityDevice.cpp @@ -0,0 +1,49 @@ +#include "ElectricityDevice.h" + +ElectricityDevice::ElectricityDevice(/* args */) +{ +} + +ElectricityDevice::~ElectricityDevice() +{ +} + +bool IsSend = false; + +void DataInit() +{ + for (size_t i = 0; i < AISLE; i++) + { + deviceModel[i].Current = 0.0; + deviceModel[i].Energy = 0.0; + deviceModel[i].Power = 0.0; + deviceModel[i].Voltage = 0.0; + Current[i] = 0; + } +} + +void blink() +{ + IsSend = digitalRead(21) == 1; +} + +void ElectricityDevice::Init() +{ + Serial.begin(115200); // Lora 模块通讯串口 + pinMode(interruptPin, INPUT_PULLDOWN); + attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE); + myRtu.Init(); + DataInit(); +} + +void ElectricityDevice::Start() +{ + myRtu.Start(); + IsSend = true; + String SendData = "A" + myJson.PowerHarvesting() + "B"; + Serial.print(SendData); + while (IsSend) + delay(1); +} + +ElectricityDevice _electricityDevice; \ No newline at end of file diff --git a/src/Global.cpp b/src/Global.cpp new file mode 100644 index 0000000..b37fcfb --- /dev/null +++ b/src/Global.cpp @@ -0,0 +1,5 @@ +#include "Global.h" +DeviceData deviceModel[AISLE]; +DeviceData objDeviceData; +float Voltage = 0.0; +float Current[AISLE]; \ No newline at end of file diff --git a/src/Json.cpp b/src/Json.cpp new file mode 100644 index 0000000..dfd7ffb --- /dev/null +++ b/src/Json.cpp @@ -0,0 +1,84 @@ +#include "Json.h" +#include + +Json::Json(/* args */) +{ +} + +Json::~Json() {} + +// json 数据封装 带数组数据 +String Json::StatusDataReport() +{ + cJSON *mainJson = cJSON_CreateObject(); //创建主体对象 + cJSON *message = cJSON_CreateObject(); //创建消息体对象 + cJSON *arrayData = cJSON_CreateArray(); //创建数组对象 + + cJSON_AddStringToObject(mainJson, "MessageId", "256"); + cJSON_AddStringToObject(mainJson, "MessageVersion", "24"); + cJSON_AddStringToObject(mainJson, "ClientId", "1"); + cJSON_AddStringToObject(mainJson, "ClientType", "20"); + cJSON_AddStringToObject(mainJson, "Timestamp", __TIME__); + cJSON_AddStringToObject(message, "Timestamp", "0"); + + for (size_t i = 0; i < AISLE; i++) + { + cJSON *Data = cJSON_CreateObject(); //创建消息体里面的数据对象 + cJSON_AddItemToArray(arrayData, Data); + cJSON_AddStringToObject(Data, "Channel", String(i + 1).c_str()); + cJSON_AddStringToObject(Data, "Current", String(Current[i]).c_str()); + cJSON_AddStringToObject(Data, "Voltage", String(Voltage).c_str()); + cJSON_AddStringToObject(Data, "Power", String(Current[i] * Voltage).c_str()); + cJSON_AddStringToObject(Data, "Energy", String(deviceModel[i].Energy).c_str()); + } + + cJSON_AddItemToObject(message, "Datas", arrayData); + cJSON_AddItemToObject(mainJson, "Message", message); + char *date = cJSON_Print(mainJson); + String jsondata(date); + cJSON_free((void *)date); // 释放cJSON_Print ()分配出来的内存空间 + cJSON_Delete(mainJson); // 释放cJSON_CreateObject ()分配出来的内存空间 + return jsondata; +} + +String Json::PowerHarvesting() +{ + cJSON *mainJson = cJSON_CreateObject(); + cJSON_AddStringToObject(mainJson, "DeviceType", "Electricity"); + cJSON_AddStringToObject(mainJson, "Voltage", String(Voltage).c_str()); + for (size_t i = 0; i < AISLE; i++) + { + cJSON_AddStringToObject(mainJson, ("Current" + String(i + 1)).c_str(), String(Current[i]).c_str()); + } + char *date = cJSON_Print(mainJson); + String jsondata(date); + cJSON_free((void *)date); // 释放cJSON_Print ()分配出来的内存空间 + cJSON_Delete(mainJson); // 释放cJSON_CreateObject ()分配出来的内存空间 + return jsondata; +} + +void Json::ParseJson(String str) +{ + cJSON *mainJson = cJSON_Parse(str.c_str()); + if (mainJson != NULL) + { + String DeviceType = cJSON_GetObjectItem(mainJson, "DeviceType")->valuestring; + if (DeviceType == "Electricity") //电力设备 + { + Voltage = String(cJSON_GetObjectItem(mainJson, "Voltage")->valuestring).toFloat(); + for (size_t i = 0; i < AISLE; i++) + { + String ResultValue(cJSON_GetObjectItem(mainJson, ("Current" + String(i + 1)).c_str())->valuestring); + Current[i] = ResultValue.toFloat(); + } + } + else if (DeviceType == "Gas") //燃气设备 + { + } + else if (DeviceType == "Water") //用水设备 + { + } + } +} + +Json myJson; diff --git a/src/JsonDemo.json b/src/JsonDemo.json new file mode 100644 index 0000000..37da9db --- /dev/null +++ b/src/JsonDemo.json @@ -0,0 +1,19 @@ +{ + "MessageId": 257, + "MessageVersion": 24, + "ClientId": 1, + "ClientType": 20, + "Timestamp": "2022-08-03T17:06:31.3024375+08:00", + "Message": { + "Timestamp": 0, + "Datas": [ + { + "Channel": 0, + "Current": 0.0, + "Voltage": 0.0, + "Power": 0.0, + "Energy": 0.0 + } + ] + } +} \ No newline at end of file diff --git a/src/MainDevice.cpp b/src/MainDevice.cpp new file mode 100644 index 0000000..40dd9f0 --- /dev/null +++ b/src/MainDevice.cpp @@ -0,0 +1,69 @@ +#include "MainDevice.h" + +MainDevice::MainDevice(/* args */) +{ +} + +MainDevice::~MainDevice() +{ +} + +ArduinoQueue MyQueue(MAXITEMS, MAXMEMORY); + +void TaskMqttPublish(void *pvParameters) +{ + while (true) + { + while (MyQueue.itemCount() > 0) + { + String res = MyQueue.dequeue(); + myJson.ParseJson(res); + _mqttHelper.publish(myJson.StatusDataReport()); + _mqttHelper.Loop(); + vTaskDelay(1); + } + _mqttHelper.Loop(); + vTaskDelay(10); + } +} + +void MainDevice::Init() +{ + Serial2.begin(115200); // lora 模块通讯串口 + Serial.begin(115200); //消息日志串口 + pinMode(2, OUTPUT); + _mqttHelper.Init(); + digitalWrite(2, 1); + xTaskCreatePinnedToCore(TaskMqttPublish, "MqttHelt", 4096, NULL, 1, &MqttTest, 0); +} + +void MainDevice::Start() +{ + digitalWrite(2, 0); + String res; + Delay mydelay; + bool StartRevice = false; + while (true) + { + if (Serial2.available() > 0) + { + char resRead = (char)Serial2.read(); + if (StartRevice && resRead == 'B') + { + MyQueue.enqueue(res); + digitalWrite(2, 1); + return; + } + if (StartRevice) + res += resRead; + if (resRead == 'A') + StartRevice = true; + } + if (mydelay.Start(true, 2)) + { + return; + } + } +} + +MainDevice _mainDevice; \ No newline at end of file diff --git a/src/ModbusRtu.cpp b/src/ModbusRtu.cpp new file mode 100644 index 0000000..9f9254b --- /dev/null +++ b/src/ModbusRtu.cpp @@ -0,0 +1,101 @@ +#include "ModbusRtu.h" + +ModbusRtu::ModbusRtu(/* args */) +{ +} + +ModbusRtu::~ModbusRtu() +{ +} + +void preTransmission() +{ + digitalWrite(RE, 1); + digitalWrite(DE, 1); +} + +void posTransmission() +{ + digitalWrite(RE, 0); + digitalWrite(DE, 0); +} + +float UshorsToFloat(uint16_t Word1, uint16_t word2) +{ + byte Udata[4]; + Udata[3] = (byte)(Word1 >> 8); + Udata[2] = (byte)(Word1); + Udata[1] = (byte)(word2 >> 8); + Udata[0] = (byte)(word2); + float f; + union change + { + float d; + unsigned char dat[4]; + } r1; + + r1.dat[0] = Udata[0]; + r1.dat[1] = Udata[1]; + r1.dat[2] = Udata[2]; + r1.dat[3] = Udata[3]; + f = r1.d; + return f; +} + +void ModbusRtu::Init() +{ + pinMode(RE, OUTPUT); + pinMode(DE, OUTPUT); + pinMode(Status, OUTPUT); + posTransmission(); + Serial2.begin(9600); //电压采集模块串口 和 电流采集模块的串口 + myMaster.begin(1, Serial2); + myMaster.preTransmission(preTransmission); + myMaster.postTransmission(posTransmission); +} + +void ModbusRtu::Start() +{ + digitalWrite(Status, 0); + preTransmission(); + bool result = MyVd.ReadData(); + if (result) + // Serial.println("电压获取成功"); + digitalWrite(Status, 1); + // else + // Serial.println("电压获取失败"); + // float Voltage = MyVd.DataConvert(2, 3, 100); //电压 + Voltage = MyVd.DataConvert(2, 3, 100); + uint8_t res = myMaster.readHoldingRegisters(32, 16); + if (res == myMaster.ku8MBSuccess) + { + // Serial.print("读取寄存器:"); + for (size_t i = 0; i < 8; i++) + { + deviceModel[i].Current = UshorsToFloat(myMaster.getResponseBuffer(i * 2), myMaster.getResponseBuffer(i * 2 + 1)); + deviceModel[i].Voltage = Voltage; + deviceModel[i].Power = deviceModel[i].Current * Voltage; + deviceModel[i].Energy = deviceModel[i].Power * 0; //电能公式 W = UIT 电压 * 电流 * 时间 + + Current[i] = deviceModel[i].Current; + + // Serial.print("电流:"); + // Serial.println(deviceModel[i].Current); + + // Serial.print("电压:"); + // Serial.println(deviceModel[i].Voltage); + + // Serial.print("功率:"); + // Serial.println(deviceModel[i].Power); + + // Serial.print("电能:"); + // Serial.println(deviceModel[i].Energy); + } + } + else + { + // Serial.println("Modbus rtu 读取失败"); + } +} + +ModbusRtu myRtu; diff --git a/src/MqttHelper.cpp b/src/MqttHelper.cpp new file mode 100644 index 0000000..925faa8 --- /dev/null +++ b/src/MqttHelper.cpp @@ -0,0 +1,158 @@ +#include "MqttHelper.h" + +WiFiClient espClient; //实例WiFiClient对象 +PubSubClient myClient(espClient); //实例PubSubClient对象,espClient做参数 + +MQTTClient client(2048); + +MqttHelper::MqttHelper(/* args */) +{ +} + +MqttHelper::~MqttHelper() +{ +} + +void callback(char *topic, byte *payload, unsigned int length) +{ + Serial.print("来自订阅的主题:"); //串口打印:来自订阅的主题: + Serial.println(topic); //串口打印订阅的主题 + Serial.print("信息:"); //串口打印:信息: + for (int i = 0; i < length; i++) //使用循环打印接收到的信息 + { + Serial.print((char)payload[i]); + } + Serial.println(); + Serial.println("-----------------------"); +} + +void MqttHelper::Init() +{ + while (WiFi.status() != WL_CONNECTED) + { //判断wifi是否连接,请确保你所连接的wifi联通了互联网 + delay(3000); + WiFi.begin(id, psw); //连接wifi + Serial.println("正在连接wifi..."); + } + Serial.println("WIFI 已连接!"); + + myClient.setServer(mqttServer, mqttPort); //设置服务器地址,端口 + myClient.setCallback(callback); //设定回调方式,当ESP32收到订阅消息时会调用此方法 + + clientId = "ESP32Client-"; + clientId += String(random(0xffff), HEX); //生成随机客户端id + + //测试MQTT连接 + client.begin(mqttServer, mqttPort, espClient); + + Serial.println("正连接至MQTT服务器..."); + while (!client.connect(clientId.c_str(), mqttUser, mqttPsw)) + { + Serial.print("."); + delay(2000); + } + Serial.println("MQTT 已连接!"); + + // while (!myClient.connected()) + // { //判断是否连接到服务器 + // Serial.println("正连接至MQTT服务器..."); + // if (myClient.connect(clientId.c_str(), mqttUser, mqttPsw)) + // { + // Serial.println("MQTT 已连接!"); + // } + // else + // { + // Serial.println("连接失败"); + // Serial.println(myClient.state()); //重连函数 + // delay(2000); + // } + // } + // myClient.subscribe("Down/ENERGY_POWER/BUSINESS/0"); //订阅名为ESP32的主题 + + Serial.println("已订阅主题,等待消息..."); +} + +void MqttHelper::ReConnect() +{ + // myClient.unsubscribe("UP/ENERGY_POWER/BUSINESS/0"); + // myClient.disconnect(); + Serial.println("开始重连"); + while (!client.connect(clientId.c_str(), mqttUser, mqttPsw)) + { + Serial.print("."); + delay(2000); + } + Serial.println("MQTT 重连成功!"); + + // while (!myClient.connected()) + // { //判断是否连接到服务器 + // Serial.println("正连接至MQTT服务器..."); + // if (myClient.connect(clientId.c_str(), mqttUser, mqttPsw)) + // { + // Serial.println("MQTT 已连接!"); + // } + // else + // { + // Serial.println("连接失败"); + // Serial.println(myClient.state()); + // delay(2000); + // } + // } + // myClient.subscribe("Down/ENERGY_POWER/BUSINESS/0"); //订阅名为ESP32的主题 + // Serial.println("已订阅主题,等待消息..."); +} + +/** + * @brief MQTT 发布数据 + * + * @param message 需要发布的数据 + * 这个库只能发布很短的消息信息,需要拆分消息发送 + */ +void MqttHelper::publish(String message) +{ + if (!client.connected()) + ReConnect(); + bool res = client.publish(HeartbeatTopic, message.c_str()); + if (res) + Serial.println("数据发布成功"); + else + Serial.println("-------------------------------数-据-发-布-失-败-------------------------------"); + + // message.trim(); + // message.replace(" ", ""); + // if (!myClient.connected()) + // ReConnect(); + // int cut = 128; //要拆分发送的实际大小 + // int json_str_len = message.length(); //总数据长度 + // if (json_str_len > cut) + // { + // //开始发送长文件参数分别为 主题,长度,是否持续 + // myClient.beginPublish(HeartbeatTopic, json_str_len, true); + // int count = json_str_len / cut; + // for (int i = 0; i < (count - 1); i++) + // { + // size_t WriteSizeof = myClient.print(message.substring(i * cut, (i * cut + cut))); + // if (WriteSizeof <= 0) + // { + // myClient.disconnect(); + // return; + // } + // } + // myClient.print(message.substring(cut * (count - 1))); + // myClient.endPublish(); //结束发送文本 + // } + // else + // { + // myClient.publish(HeartbeatTopic, message.c_str()); + // } + // Serial.println("MQTT 消息发布"); +} + +void MqttHelper::Loop() +{ + // myClient.loop(); //回旋接收函数 等待服务器返回的数据 + + client.loop(); +} + +MqttHelper _mqttHelper; diff --git a/src/VoltageDevice.cpp b/src/VoltageDevice.cpp new file mode 100644 index 0000000..186b2d1 --- /dev/null +++ b/src/VoltageDevice.cpp @@ -0,0 +1,56 @@ +#include "VoltageDevice.h" + +VoltageDevice::VoltageDevice(/* args */) +{ +} + +VoltageDevice::~VoltageDevice() +{ +} + +bool VoltageDevice::ReadData() +{ + for (size_t i = 0; i < sizeof(data); i++) + data[i] = 0; + Delay myDelay; //定时器 + bool IsRun = true; + int count = 0; + byte read[8] = {0x01, 0x03, 0x00, 0x48, 0x00, 0x0A, 0x45, 0xDB}; + Serial2.write(read, sizeof(read)); + // Serial.println("写入数据:0x01, 0x03, 0x00, 0x48, 0x00, 0x0A, 0x45, 0xDB"); + while (IsRun) + { + if (Serial2.available() > 0 && count < sizeof(data)) + { + data[count] = Serial2.read(); + count++; + } + if (count >= sizeof(data)) + return true; + if (myDelay.Start(IsRun, 2)) + return false; + } +} + +float VoltageDevice::DataConvert(int len, int Index, int bl) +{ + byte dt[len]; + int tempIndex; + for (size_t i = 0; i < len; i++) + { + tempIndex = len + Index - 1 - i; + if (tempIndex >= 0 && tempIndex < sizeof(data)) + { + dt[i] = data[len + Index - 1 - i]; + } + } + + int Temp = 0; + for (size_t i = 0; i < sizeof(dt); i++) + { + Temp += (int)(dt[i] << (i * 8)); + } + return (float)(Temp / bl); +} + +VoltageDevice MyVd; diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..5df69a9 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,27 @@ +// #include +#include "ElectricityDevice.h" +#include "MainDevice.h" + +//电力设备程序 +// void setup() +// { +// _electricityDevice.Init(); //电力设备程序 +// } + +// void loop() +// { +// _electricityDevice.Start(); //电力设备程序 +// delay(1000); +// } + +//主设备程序 +void setup() +{ + _mainDevice.Init(); //主设备程序 +} + +void loop() +{ + _mainDevice.Start(); //主设备程序 + delay(100); +} diff --git a/test/README b/test/README new file mode 100644 index 0000000..9b1e87b --- /dev/null +++ b/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PlatformIO Test Runner and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PlatformIO Unit Testing: +- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html