HC-06 + PZEM-004T + Arduino MEGA

Тема в разделе "Проводная и беспроводная связь", создана пользователем KVL80, 3 сен 2018.

  1. KVL80

    KVL80 Нуб

    Суть да дело вот в чём. Есть модуль Arduino MEGA 2560. Плата PZEM-004T предназначенная для измерения электроэнергии. Как сделать так, чтобы показания он передавал Arduino, а затем эти показания передавались через модуль HC-06 блютуз? На плате PZEM-004T следующие разъёмы (+5, RX, TX, GND).
     
  2. Mitrandir

    Mitrandir Гуру

    Соединить pzem с rx1 rx1 меги, а hc-06 c rx2 tx2.

    Обращаться к ним через Serial1 и Serial2 соответственно
     
  3. ИгорьК

    ИгорьК Гуру

    Варианты:
    1. Изучить документацию на PZEM, задавать ему правильные вопросы по UART, получать ответы, декодировать и отправлять на ВТ.
    2. Найти аналогичный проект, скопипастить его и библиотеки и допилить под свои нужды.
    3. Заказать проект за денежку.
     
    SergeiL нравится это.
  4. KVL80

    KVL80 Нуб

    У
    А tx1 от pzem с чем соединить?
     
  5. Mitrandir

    Mitrandir Гуру

  6. ИгорьК

    ИгорьК Гуру

  7. KVL80

    KVL80 Нуб

    Читал, не один раз. У него работает без ардуино. Передает показания по Ви-Фи.
     
  8. Mitrandir

    Mitrandir Гуру

    Вот его скетч
    Код (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; "); заменить на отправку по Блютусу и будет счастье
     
  9. KVL80

    KVL80 Нуб

    Вот так?
    Код (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);
    }
     
  10. KVL80

    KVL80 Нуб

    Просто настоящий НУБ, в этом деле. Это я про себя.:(
     
  11. Mitrandir

    Mitrandir Гуру

    Да, вроде как.
     
  12. KVL80

    KVL80 Нуб

    Вот в таком виде подключается. Но показаний нет.
    Код (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);
     
  13. KVL80

    KVL80 Нуб

    Как только вставишь расчёт показаний, подключиться невозможно. Пишет устройство недоступно.
    Код (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;
     
     
  14. b707

    b707 Гуру

    единственный вариант - перестать гордиться что нуб и чему-то научиться :)
     
    ИгорьК нравится это.
  15. parovoZZ

    parovoZZ Гуру

    а действительно необходимо рассчитывать показания в непрерывном темпе? Может попробовать это делать раз в секунду?
     
  16. KVL80

    KVL80 Нуб

    Учусь...
     
  17. KVL80

    KVL80 Нуб

    С помощью delay?
     
  18. KVL80

    KVL80 Нуб

    Код (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 сделал такие изменения. Заработало. Показания передаються, но только два. Добавляешь третье или четвертое. Не коннектиться по блютуз.
     
  19. Applefug

    Applefug Нуб

    вас посетила просто блестящая мысль