Суть да дело вот в чём. Есть модуль Arduino MEGA 2560. Плата PZEM-004T предназначенная для измерения электроэнергии. Как сделать так, чтобы показания он передавал Arduino, а затем эти показания передавались через модуль HC-06 блютуз? На плате PZEM-004T следующие разъёмы (+5, RX, TX, GND).
Соединить pzem с rx1 rx1 меги, а hc-06 c rx2 tx2. Обращаться к ним через Serial1 и Serial2 соответственно
Варианты: 1. Изучить документацию на PZEM, задавать ему правильные вопросы по UART, получать ответы, декодировать и отправлять на ВТ. 2. Найти аналогичный проект, скопипастить его и библиотеки и допилить под свои нужды. 3. Заказать проект за денежку.
Pzem tx - mega rx1 PZEM rx - mega tx1 Вот тут человек рассказывает про pzem https://mysku.ru/blog/aliexpress/52206.html
Вот его скетч Код (C++): #include <SoftwareSerial.h> // Arduino IDE <1.6.6 #include "PZEM004T.h" PZEM004T pzem(&Serial1); IPAddress ip(192,168,1,1); void setup() { Serial.begin(115200); pzem.setAddress(ip); } void loop() { float v = pzem.voltage(ip); if (v < 0.0) v = 0.0; Serial.print(v);Serial.print("V; "); float i = pzem.current(ip); if(i >= 0.0){ Serial.print(i);Serial.print("A; "); } float p = pzem.power(ip); if(p >= 0.0){ Serial.print(p);Serial.print("W; "); } float e = pzem.energy(ip); if(e >= 0.0){ Serial.print(e);Serial.print("Wh; "); } Serial.println(); delay(1000); } Подобный вывод в консоль:Serial.print(i);Serial.print("A; "); заменить на отправку по Блютусу и будет счастье
Вот так? Код (C++): #include <SoftwareSerial.h> // Arduino IDE <1.6.6 #include "PZEM004T.h" PZEM004T pzem(&Serial1); IPAddress ip(192,168,1,1); void setup() { Serial2.begin(9600); pzem.setAddress(ip); } void loop() { float v = pzem.voltage(ip); if (v < 0.0) v = 0.0; Serial2.print(v);Serial2.print("V; "); float i = pzem.current(ip); if(i >= 0.0){ Serial2.print(i);Serial2.print("A; "); } float p = pzem.power(ip); if(p >= 0.0){ Serial2.print(p);Serial2.print("W; "); } float e = pzem.energy(ip); if(e >= 0.0){ Serial2.print(e);Serial2.print("Wh; "); } Serial2.println(); delay(1000); }
Вот в таком виде подключается. Но показаний нет. Код (C++): #define REMOTEXY_MODE__SOFTSERIAL #include <SoftwareSerial.h> #include <RemoteXY.h> #include "PZEM004T.h" PZEM004T pzem(18,19); IPAddress ip(192,168,1,1); #define REMOTEXY_SERIAL_RX 10 #define REMOTEXY_SERIAL_TX 11 #define REMOTEXY_SERIAL_SPEED 9600 #pragma pack(push, 1) uint8_t RemoteXY_CONF[] = {0, 44, 39, 0, 8, 13, 0, 67, 4, 20, 11, 20, 5, 2, 26, 11, 67, 4, 20, 34, 20, 5, 2, 26, 11, 67, 4, 52, 10, 20, 5, 2, 26, 11, 67, 4, 57, 31, 20, 5, 2, 26, 11}; struct { char text_1[11]; char text_2[11]; char text_3[11]; char text_4[11]; unsigned char connect_flag; } RemoteXY; #pragma pack(pop) float v; float i; float p; float e; void setup() { RemoteXY_Init (); pzem.setAddress(ip); } void loop() {RemoteXY_Handler (); //Плата:1 ((String(v,2))).toCharArray((RemoteXY.text_1), 11); ((String(i,2))).toCharArray((RemoteXY.text_2), 11); ((String(p,2))).toCharArray((RemoteXY.text_3), 11); ((String(e,2))).toCharArray((RemoteXY.text_4), 11);
Как только вставишь расчёт показаний, подключиться невозможно. Пишет устройство недоступно. Код (C++): //Плата:1 float v = pzem.voltage(ip); if (v < 0.0) v = 0.0; float i = pzem.current(ip); if (i < 0.0) i = 0.0; float p = pzem.power(ip); if (p < 0.0) p = 0.0; float e = pzem.energy(ip); if (e < 0.0) e = 0.0;
а действительно необходимо рассчитывать показания в непрерывном темпе? Может попробовать это делать раз в секунду?
Код (C++): #define REMOTEXY_MODE__HARDSERIAL #include <RemoteXY.h> #include <SoftwareSerial.h> #include <PZEM004T.h> #define REMOTEXY_SERIAL Serial1 #define REMOTEXY_SERIAL_SPEED 9600 #pragma pack(push, 1) uint8_t RemoteXY_CONF[] = {0, 44, 39, 0, 8, 13, 0, 67, 4, 20, 11, 20, 5, 2, 26, 11, 67, 4, 20, 34, 20, 5, 2, 26, 11, 67, 4, 52, 10, 20, 5, 2, 26, 11, 67, 4, 57, 31, 20, 5, 2, 26, 11}; struct { char text_1[11]; char text_2[11]; char text_3[11]; char text_4[11]; unsigned char connect_flag; } RemoteXY; #pragma pack(pop) float v; PZEM004T pzem(10,11); // RX,TX IPAddress ip(192,168,1,1); float i; void setup() { RemoteXY_Init (); Serial.begin(9600); pzem.setAddress(ip); } void loop() {RemoteXY_Handler (); //Плата:1 [B][U] v = pzem.voltage(ip); if (v < 0.0) v = 0.0; i = pzem.current(ip); if (i < 0.0) i = 0.0;[/U][/B] (( _floatToStringWitRaz(v,2))).toCharArray((RemoteXY.text_1), 11); (( _floatToStringWitRaz(i,2))).toCharArray((RemoteXY.text_2), 11); ((String(0, DEC))).toCharArray((RemoteXY.text_3), 11); ((String(0, DEC))).toCharArray((RemoteXY.text_4), 11); } String _floatToStringWitRaz(float value, int raz) { return String(value,raz); } В плате 1 сделал такие изменения. Заработало. Показания передаються, но только два. Добавляешь третье или четвертое. Не коннектиться по блютуз.