• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Pzem-017 plus aplikacja blink(stary) jako monitoring DC
#1
Witam
Wykonałem  projekt  na podstawie tego poradnika: 
https://solarduino.com/pzem-017-dc-energ...blynk-app/

I problem jest taki, że niby wszystko działa, ale aplikacja  Blynk nie pokazuje  żadnych danych z pzem-017.
Program wgrał się bez żadnych błędów. Blynk odpowiednio skonfigurowany, łączy się z serwerem. Pzem-017 sprawdzony bo przy podłączenie bezpośrednio do PC pokazuje wszystkie dane.
Czy w sofcie trzeba coś zmienić, żeby dane z Psem-017 pokazały się w aplikacji Blynk?

Proszę o pomoc, poniżej załączam oryginalny program ( oczywiście w swoim zmieniłem token, oraz ustawienia wifi i serwera na swoje).
Jakie macie pomysły, czemu to nie działa?



Kod:
// PZEM-017 DC Energy Meter Online Monitoring using Blynk App By Solarduino

// Note Summary
// Note :  Safety is very important when dealing with electricity. We take no responsibilities while you do it at your own risk.
// Note :  This DC Energy Monitoring Code needs PZEM-017 DC Energy Meter to measure values and Arduio Mega / UNO for communication and display.
// Note :  This Code monitors DC Voltage, current, Power, and Energy.
// Note :  The values are calculated internally by energy meter and function of Node MCU is only to read the value and for further submission to Blynk Server for display
// Note :  The first step is need to select shunt value and change the value accordingly in this code. look for line "static uint16_t NewshuntAddr = 0x0000; "
// Note :  You need to download and install (modified) Modbus Master library at our website (https://solarduino.com/pzem-014-or-016-ac-energy-meter-with-arduino/ )
// Note :  You need to download the Blynk App on your smart phone for display.
// Note :  The Core of the code was from EvertDekker.com 2018 which based on the example from http://solar4living.com/pzem-arduino-modbus.htm
// Note :  Solarduino only amend necessary code and integrate with Blynk Server.
// Note :  Blog page for this code : https://solarduino.com/pzem-017-dc-energy-meter-online-monitoring-with-blynk-app/

/*/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/////////////*/

        /* Virtual Serial Port */

        #include <SoftwareSerial.h>                          /* include virtual Serial Port coding */
        SoftwareSerial PZEMSerial;                            // Move the PZEM DC Energy Meter communication pins from Rx to pin D1 = GPIO 5 & TX to pin D2 = GPIO 4

        /* 0- Blynk Server and Wifi Connection */

        #include <ESP8266WiFi.h>                              // Enable the use of wifi module. Make sure you downloaded and installed the ESP8266 library
        #include <BlynkSimpleEsp8266.h>                    
        char auth[] = "55dt91QmWb3TNWJRxy6sE2HJJXFStdw1";    // Put in the Auth Token for the project from Blynk. You should receive it in your email.
        char ssid[] = "unififibreLKH@unifi";                  // Key in your wifi name. You can check with your smart phone for your wifi name
        char pass[] = "58828515";                            // Key in your wifi password.

        /* 1- PZEM-017 DC Energy Meter */
      
        #include <ModbusMaster.h>                            // Load the (modified) library for modbus communication command codes. Kindly install at our website.
        #define MAX485_DE  16                                // Define DE Pin to Arduino pin. Connect DE Pin of Max485 converter module to Pin D0 (GPIO 16) Node MCU board
        #define MAX485_RE  5                                  // Define RE Pin to Arduino pin. Connect RE Pin of Max485 converter module to Pin D1 (GIPO 5) Node MCU board
                                                              // These DE anr RE pins can be any other Digital Pins to be activated during transmission and reception process.
        static uint8_t pzemSlaveAddr = 0x01;                  // Declare the address of device (meter 1) in term of 8 bits.
        static uint16_t NewshuntAddr = 0x0000;                // Declare your external shunt value for DC Meter. Default 0x0000 is 100A, replace to "0x0001" if using 50A shunt, 0x0002 is for 200A, 0x0003 is for 300A
    
        ModbusMaster node;                                    /* activate modbus master codes*/
      
        float PZEMVoltage =0;                                /* Declare value for DC voltage */
        float PZEMCurrent =0;                                /* Declare value for DC current*/
        float PZEMPower =0;                                  /* Declare value for DC Power */
        float PZEMEnergy=0;                                  /* Declare value for DC Energy */

        unsigned long startMillisPZEM;                        /* start counting time for LCD Display */
        unsigned long currentMillisPZEM;                      /* current counting time for LCD Display */
        const unsigned long periodPZEM = 1000;                // refresh every X seconds (in seconds) in LED Display. Default 1000 = 1 second

        /* 2 - Data submission to Blynk Server  */

        unsigned long startMillisReadData;                    /* start counting time for data collection */
        unsigned long currentMillisReadData;                  /* current counting time for data collection */
        const unsigned long periodReadData = 1000;            /* refresh every X seconds (in seconds) in LED Display. Default 1000 = 1 second */
        int ResetEnergy = 0;                                  /* reset energy function */
        int a = 1;
        unsigned long startMillis1;                          // to count time during initial start up (PZEM Software got some error so need to have initial pending time)

void setup()
{
      
        /*0 General*/
      
        startMillis1 = millis();
      
        Serial.begin(9600);                                  /* To assign communication port to communicate with meter. with 2 stop bits (refer to manual)*/
        PZEMSerial.begin(9600,SWSERIAL_8N2,4,0);              // 4 = Rx/R0/ GPIO 4 (D2) & 0 = Tx/DI/ GPIO 0 (D3) on NodeMCU
        Blynk.begin(auth, ssid, pass);  

        /* 1- PZEM-017 DC Energy Meter */

        startMillisPZEM = millis();                          /* Start counting time for run code */
        pinMode(MAX485_RE, OUTPUT);                          /* Define RE Pin as Signal Output for RS485 converter. Output pin means Arduino command the pin signal to go high or low so that signal is received by the converter*/
        pinMode(MAX485_DE, OUTPUT);                          /* Define DE Pin as Signal Output for RS485 converter. Output pin means Arduino command the pin signal to go high or low so that signal is received by the converter*/
        digitalWrite(MAX485_RE, 0);                          /* Arduino create output signal for pin RE as LOW (no output)*/
        digitalWrite(MAX485_DE, 0);                          /* Arduino create output signal for pin DE as LOW (no output)*/
                                                              // both pins no output means the converter is in communication signal receiving mode
        node.preTransmission(preTransmission);                // Callbacks allow us to configure the RS485 transceiver correctly
        node.postTransmission(postTransmission);
        node.begin(pzemSlaveAddr,PZEMSerial);                        
        delay(1000);                                          /* after everything done, wait for 1 second */

        /* 2 - Data submission to Blynk Server  */

        startMillisReadData = millis();                      /* Start counting time for data submission to Blynk Server*/

}

void loop()
{
      
        /* 0- General */
      
        Blynk.run();
    
        if ((millis()- startMillis1 >= 10000) && (a ==1))
        {
          setShunt(pzemSlaveAddr);                                      // Delete the "//" to set shunt rating (0x01) is the meter address by default. If you changed the meter address, you must change here as well.  
          changeAddress(0XF8, pzemSlaveAddr);                            // By delete the double slash symbol, the meter address will be set as 0x01.
          a = 0;
        }                                                    // By default I allow this code to run every program startup. Will not have effect if you only have 1 meter

        /* 1- PZEM-017 DC Energy Meter */
      
        currentMillisPZEM = millis();
      
        if (currentMillisPZEM - startMillisPZEM >= periodPZEM)                                            /* for every x seconds, run the codes below*/
        {  
          uint8_t result;                                                                                /* Declare variable "result" as 8 bits */
          result = node.readInputRegisters(0x0000, 6);                                                    /* read the 9 registers (information) of the PZEM-014 / 016 starting 0x0000 (voltage information) kindly refer to manual)*/
          if (result == node.ku8MBSuccess)                                                                /* If there is a response */
            {
              uint32_t tempdouble = 0x00000000;                                                          /* Declare variable "tempdouble" as 32 bits with initial value is 0 */
              PZEMVoltage = node.getResponseBuffer(0x0000) / 100.0;                                      /* get the 16bit value for the voltage value, divide it by 100 (as per manual) */
                                                                                                          // 0x0000 to 0x0008 are the register address of the measurement value
              PZEMCurrent = node.getResponseBuffer(0x0001) / 100.0;                                      /* get the 16bit value for the current value, divide it by 100 (as per manual) */
            
              tempdouble =  (node.getResponseBuffer(0x0003) << 16) + node.getResponseBuffer(0x0002);      /* get the power value. Power value is consists of 2 parts (2 digits of 16 bits in front and 2 digits of 16 bits at the back) and combine them to an unsigned 32bit */
              PZEMPower = tempdouble / 10.0;                                                              /* Divide the value by 10 to get actual power value (as per manual) */
            
              tempdouble =  (node.getResponseBuffer(0x0005) << 16) + node.getResponseBuffer(0x0004);      /* get the energy value. Energy value is consists of 2 parts (2 digits of 16 bits in front and 2 digits of 16 bits at the back) and combine them to an unsigned 32bit */
              PZEMEnergy = tempdouble;                                                                  
            
              if (pzemSlaveAddr==2)                                                                      /* just for checking purpose to see whether can read modbus*/
                {
                }
            }
              else
                {
                }
              startMillisPZEM = currentMillisPZEM ;                                                      /* Set the starting point again for next counting time */
        }
                                                                                                        /* count time for program run every second (by default)*/
        /* 2 - Data submission to Blynk Server  */
      
        currentMillisReadData = millis();                                                                /* Set counting time for data submission to server*/
        if (currentMillisReadData - startMillisReadData >= periodReadData)                                /* for every x seconds, run the codes below*/
          {
            Serial.print("Vdc : "); Serial.print(PZEMVoltage); Serial.println(" V ");
            Serial.print("Idc : "); Serial.print(PZEMCurrent); Serial.println(" A ");
            Serial.print("Power : "); Serial.print(PZEMPower); Serial.println(" W ");
            Serial.print("Energy : "); Serial.print(PZEMEnergy); Serial.println(" Wh ");
            Blynk.virtualWrite(V0,PZEMVoltage);                                                          // Send data to Blynk Server. Voltage value as virtual pin V0
            Blynk.virtualWrite(V1,PZEMCurrent);
            Blynk.virtualWrite(V2,PZEMPower);
            Blynk.virtualWrite(V3,PZEMEnergy);
            startMillisReadData = millis();
          }
        
}

void preTransmission()                                                                                    /* transmission program when triggered*/
{
        /* 1- PZEM-017 DC Energy Meter */
        if(millis() - startMillis1 > 5000)                                                                // Wait for 5 seconds as ESP Serial cause start up code crash
        {
          digitalWrite(MAX485_RE, 1);                                                                    /* put RE Pin to high*/
          digitalWrite(MAX485_DE, 1);                                                                    /* put DE Pin to high*/
          delay(1);                                                                                      // When both RE and DE Pin are high, converter is allow to transmit communication
        }
}

void postTransmission()                                                                                  /* Reception program when triggered*/
{
      
        /* 1- PZEM-017 DC Energy Meter */
        if(millis() - startMillis1 > 5000)                                                                // Wait for 5 seconds as ESP Serial cause start up code crash
        {
          delay(3);                                                                                      // When both RE and DE Pin are low, converter is allow to receive communication
          digitalWrite(MAX485_RE, 0);                                                                    /* put RE Pin to low*/
          digitalWrite(MAX485_DE, 0);                                                                    /* put DE Pin to low*/
        }
}

void setShunt(uint8_t slaveAddr)                                                                          //Change the slave address of a node
{

        /* 1- PZEM-017 DC Energy Meter */
      
        static uint8_t SlaveParameter = 0x06;                                                            /* Write command code to PZEM */
        static uint16_t registerAddress = 0x0003;                                                        /* change shunt register address command code */
      
        uint16_t u16CRC = 0xFFFF;                                                                        /* declare CRC check 16 bits*/
        u16CRC = crc16_update(u16CRC, slaveAddr);                                                        // Calculate the crc16 over the 6bytes to be send
        u16CRC = crc16_update(u16CRC, SlaveParameter);
        u16CRC = crc16_update(u16CRC, highByte(registerAddress));
        u16CRC = crc16_update(u16CRC, lowByte(registerAddress));
        u16CRC = crc16_update(u16CRC, highByte(NewshuntAddr));
        u16CRC = crc16_update(u16CRC, lowByte(NewshuntAddr));
    
        preTransmission();                                                                                /* trigger transmission mode*/
    
        PZEMSerial.write(slaveAddr);                                                                      /* these whole process code sequence refer to manual*/
        PZEMSerial.write(SlaveParameter);
        PZEMSerial.write(highByte(registerAddress));
        PZEMSerial.write(lowByte(registerAddress));
        PZEMSerial.write(highByte(NewshuntAddr));
        PZEMSerial.write(lowByte(NewshuntAddr));
        PZEMSerial.write(lowByte(u16CRC));
        PZEMSerial.write(highByte(u16CRC));
        delay(10);
        postTransmission();                                                                              /* trigger reception mode*/
        delay(100);
}

BLYNK_WRITE(V4)                                              // Virtual push button to reset energy for Meter 1
{
        if(param.asInt()==1)
          {
            uint16_t u16CRC = 0xFFFF;                        /* declare CRC check 16 bits*/
            static uint8_t resetCommand = 0x42;              /* reset command code*/
            uint8_t slaveAddr = pzemSlaveAddr;                // if you set different address, make sure this slaveAddr must change also
            u16CRC = crc16_update(u16CRC, slaveAddr);
            u16CRC = crc16_update(u16CRC, resetCommand);
            preTransmission();                                /* trigger transmission mode*/              
            PZEMSerial.write(slaveAddr);                      /* send device address in 8 bit*/
            PZEMSerial.write(resetCommand);                  /* send reset command */
            PZEMSerial.write(lowByte(u16CRC));                /* send CRC check code low byte  (1st part) */
            PZEMSerial.write(highByte(u16CRC));              /* send CRC check code high byte (2nd part) */
            delay(10);
            postTransmission();                              /* trigger reception mode*/
            delay(100);
          }
}

void changeAddress(uint8_t OldslaveAddr, uint8_t NewslaveAddr)                                            //Change the slave address of a node
{

        /* 1- PZEM-017 DC Energy Meter */
  
        static uint8_t SlaveParameter = 0x06;                                                            /* Write command code to PZEM */
        static uint16_t registerAddress = 0x0002;                                                        /* Modbus RTU device address command code */
        uint16_t u16CRC = 0xFFFF;                                                                        /* declare CRC check 16 bits*/
        u16CRC = crc16_update(u16CRC, OldslaveAddr);                                                      // Calculate the crc16 over the 6bytes to be send
        u16CRC = crc16_update(u16CRC, SlaveParameter);
        u16CRC = crc16_update(u16CRC, highByte(registerAddress));
        u16CRC = crc16_update(u16CRC, lowByte(registerAddress));
        u16CRC = crc16_update(u16CRC, highByte(NewslaveAddr));
        u16CRC = crc16_update(u16CRC, lowByte(NewslaveAddr));
        preTransmission();                                                                                /* trigger transmission mode*/
        PZEMSerial.write(OldslaveAddr);                                                                      /* these whole process code sequence refer to manual*/
        PZEMSerial.write(SlaveParameter);
        PZEMSerial.write(highByte(registerAddress));
        PZEMSerial.write(lowByte(registerAddress));
        PZEMSerial.write(highByte(NewslaveAddr));
        PZEMSerial.write(lowByte(NewslaveAddr));
        PZEMSerial.write(lowByte(u16CRC));
        PZEMSerial.write(highByte(u16CRC));
        delay(10);
        postTransmission();                                                                                /* trigger reception mode*/
        delay(100);
}
 
  


Wiadomości w tym wątku
Pzem-017 plus aplikacja blink(stary) jako monitoring DC - przez Romek - 04-10-2022, 16:47

Skocz do:


Przeglądający: 1 gości