PZEM-004T и ARDUINO UNO

Тема в разделе "Arduino & Shields", создана пользователем maga7733, 9 июл 2018.

  1. maga7733

    maga7733 Нуб

    Нужна помощь, посмотрев в ютубе энергомонитор pzem-004t по ссылке

    решил к arduino uno подключить, скачал библиотеку для работы PZEM004T-master.zip только я не знаю, что загрузить в arduino, загрузил один скетч PZEMDisplay рис. 4 вот что показывает рис. 1 собрал по такой схеме рис. 11 пожалуйста помогите создать скетч я могу только залить скетч, программах я не разбираюсь.
    Купил pzem-004t до закрытия заказа осталось: 2 дн 21 ч мне только узнать работает pzem-004t или нет.
    Жду посылку esp8266
     

    Вложения:

    Последнее редактирование: 9 июл 2018
  2. parovoZZ

    parovoZZ Гуру

    Надо было готовый брать, зачем покупать то, в чем не в зуб ногой?
     
  3. maga7733

    maga7733 Нуб

    Нужна для монитора электроэнергии, надо проверить на работоспособность до закрытия заказа, жду еще esp8266
     
  4. Airbus

    Airbus Радиохулиган Модератор

    Така в чём проблема?Вы же залили скетч от у вас работает и в порт выдаёт данные?
    Этот скетч?
    Код (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);
    }
     
  5. проблема в том, что человек хочет в UNO залить код для леонардо.
     
  6. Airbus

    Airbus Радиохулиган Модератор

    А ну да цэ ж твой видос.А автор про Леонардо ничего не сказал.
     
  7. PZEM004T pzem(&Serial1); это для леонардо

    а в остальном, вообще не особо понятно что это и зачем.
     
  8. maga7733

    maga7733 Нуб

    Я же сказал жду из Китая esp8266 все что мне нужно это убедиться что pzem-004t работает а для проверки под рукой у меня есть уно нано и мини про, если вы считаете скетчем который я залил показания правильные то я закрою заказ и так китаец продлил заказ на 10 дней,
    извините забыл сказать про леонардо
     
  9. maga7733

    maga7733 Нуб

    Этот скетч я заливал

    PZEMDisplay

    #include <SoftwareSerial.h> // Arduino IDE <1.6.6
    #include <PZEM004T.h>

    PZEM004T pzem(10,11); // (RX,TX) connect to TX,RX of PZEM
    IPAddress ip(192,168,1,1);

    void setup() {
    Serial.begin(9600);
    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);
    }
     
  10. parovoZZ

    parovoZZ Гуру

    В абдурино есть разница? И там и там нативный USART. Не понимаю корня проблемы.
     
  11. Airbus

    Airbus Радиохулиган Модератор

    И для esp такой же.
     
  12. SergeiL

    SergeiL Оракул Модератор

    Да тут совсем бред... Выделил жирным...
     
    Mitrandir нравится это.
  13. parovoZZ

    parovoZZ Гуру

    Смех смехом, а в pdf написано:
     
  14. maga7733

    maga7733 Нуб

    Скажите пожалуйста этот скетч для какого контроллера и для чего

    #include "PZEM004T.h"

    #define PZEM_VOLTAGE (uint8_t)0xB0
    #define RESP_VOLTAGE (uint8_t)0xA0

    #define PZEM_CURRENT (uint8_t)0xB1
    #define RESP_CURRENT (uint8_t)0xA1

    #define PZEM_POWER (uint8_t)0xB2
    #define RESP_POWER (uint8_t)0xA2

    #define PZEM_ENERGY (uint8_t)0xB3
    #define RESP_ENERGY (uint8_t)0xA3

    #define PZEM_SET_ADDRESS (uint8_t)0xB4
    #define RESP_SET_ADDRESS (uint8_t)0xA4

    #define PZEM_POWER_ALARM (uint8_t)0xB5
    #define RESP_POWER_ALARM (uint8_t)0xA5

    #define RESPONSE_SIZE sizeof(PZEMCommand)
    #define RESPONSE_DATA_SIZE RESPONSE_SIZE - 2

    #define PZEM_BAUD_RATE 9600
    #define PZEM_DEFAULT_READ_TIMEOUT 1000

    #define PZEM_ERROR_VALUE -1.0


    PZEM004T::ZEM004T(uint8_t receivePin, uint8_t transmitPin)
    {
    SoftwareSerial *port = new SoftwareSerial(receivePin, transmitPin);
    port->begin(PZEM_BAUD_RATE);
    this->serial = port;
    this->_readTimeOut = PZEM_DEFAULT_READ_TIMEOUT;
    this->_isSoft = true;
    }

    PZEM004T::ZEM004T(HardwareSerial *port)
    {
    port->begin(PZEM_BAUD_RATE);
    this->serial = port;
    this->_readTimeOut = PZEM_DEFAULT_READ_TIMEOUT;
    this->_isSoft = false;
    }

    PZEM004T::~PZEM004T()
    {
    if(_isSoft)
    delete this->serial;
    }

    void PZEM004T::setReadTimeout(unsigned long msec)
    {
    _readTimeOut = msec;
    }

    float PZEM004T::voltage(const IPAddress &addr)
    {
    uint8_t data[RESPONSE_DATA_SIZE];

    send(addr, PZEM_VOLTAGE);
    if(!recieve(RESP_VOLTAGE, data))
    return PZEM_ERROR_VALUE;

    return (data[0] << 8) + data[1] + (data[2] / 10.0);
    }

    float PZEM004T::current(const IPAddress &addr)
    {
    uint8_t data[RESPONSE_DATA_SIZE];

    send(addr, PZEM_CURRENT);
    if(!recieve(RESP_CURRENT, data))
    return PZEM_ERROR_VALUE;

    return (data[0] << 8) + data[1] + (data[2] / 100.0);
    }

    float PZEM004T::wer(const IPAddress &addr)
    {
    uint8_t data[RESPONSE_DATA_SIZE];

    send(addr, PZEM_POWER);
    if(!recieve(RESP_POWER, data))
    return PZEM_ERROR_VALUE;

    return (data[0] << 8) + data[1];
    }

    float PZEM004T::energy(const IPAddress &addr)
    {
    uint8_t data[RESPONSE_DATA_SIZE];

    send(addr, PZEM_ENERGY);
    if(!recieve(RESP_ENERGY, data))
    return PZEM_ERROR_VALUE;

    return ((uint32_t)data[0] << 16) + ((uint16_t)data[1] << 8) + data[2];
    }

    bool PZEM004T::setAddress(const IPAddress &newAddr)
    {
    send(newAddr, PZEM_SET_ADDRESS);
    return recieve(RESP_SET_ADDRESS);
    }

    bool PZEM004T::setPowerAlarm(const IPAddress &addr, uint8_t threshold)
    {
    send(addr, PZEM_POWER_ALARM, threshold);
    return recieve(RESP_POWER_ALARM);
    }

    void PZEM004T::send(const IPAddress &addr, uint8_t cmd, uint8_t data)
    {
    PZEMCommand pzem;

    pzem.command = cmd;
    for(int i=0; i<sizeof(pzem.addr); i++)
    pzem.addr = addr;
    pzem.data = data;

    uint8_t *bytes = (uint8_t*)&pzem;
    pzem.crc = crc(bytes, sizeof(pzem) - 1);

    while(serial->available())
    serial->read();

    serial->write(bytes, sizeof(pzem));
    }

    bool PZEM004T::recieve(uint8_t resp, uint8_t *data)
    {
    uint8_t buffer[RESPONSE_SIZE];

    if(_isSoft)
    ((SoftwareSerial *)serial)->listen();

    unsigned long startTime = millis();
    uint8_t len = 0;
    while((len < RESPONSE_SIZE) && (millis() - startTime < _readTimeOut))
    {
    if(serial->available() > 0)
    {
    uint8_t c = (uint8_t)serial->read();
    if(!c && !len)
    continue; // skip 0 at startup
    buffer[len++] = c;
    }
    yield(); // do background netw tasks while blocked for IO (prevents ESP watchdog trigger)
    }

    if(len != RESPONSE_SIZE)
    return false;

    if(buffer[6] != crc(buffer, len - 1))
    return false;

    if(buffer[0] != resp)
    return false;

    if(data)
    {
    for(int i=0; i<RESPONSE_DATA_SIZE; i++)
    data = buffer[1 + i];
    }

    return true;
    }

    uint8_t PZEM004T::crc(uint8_t *data, uint8_t sz)
    {
    uint16_t crc = 0;
    for(uint8_t i=0; i<sz; i++)
    crc += *data++;
    return (uint8_t)(crc & 0xFF);
    }
     
    Последнее редактирование: 11 июл 2018
  15. SergeiL

    SergeiL Оракул Модератор

    Это очень похоже на файл библиотеки.;)
    Не могу понять, чего Вы хотите добиться, и что Вас так сильно заставляет идти по такому непонятному для Вас пути???:)
     
    parovoZZ нравится это.
  16. Airbus

    Airbus Радиохулиган Модератор

    [​IMG]
     
    Mitrandir нравится это.
  17. parovoZZ

    parovoZZ Гуру

    а если я отгадаю, что мне за это будет? Купи счетчик и не парь мозг.