Заказ доработки скетча

Тема в разделе "Закажу проект", создана пользователем Alex.V, 19 окт 2020.

  1. Alex.V

    Alex.V Нуб

    Добрый день. Есть потребность снимать показания со счетчика энергомера с102м
    По средствам wemos d1 mini и трансивера 485

    Есть скетч Ардуино.

    https://github.com/vgamaev/Energomera-CE102M-Arduino

    Код (C++):
    #include <SoftwareSerial.h>

    #define  ENERGOMERA

    long Previous = 0;
    int Step = 0;
    char x [50];

    // открываем сессию
    byte CmdOpenSesion[] = {0xaF,0x3F,0x21,0x8D,0x0A};
    // читаем тип счетчика
    byte CmdReadType[] = {0x06,0x30,0x35,0xb1,0x8d,0x0a};
    // снимаем показания
    byte CmdEtope[] = {0x81,0xd2,0xb1,0x82,0xc5,0xd4,0x30,0x50,0xc5,0x28,0xa9,0x03,0xb7};
    //напряжение на фазах
    byte CmdVolta[] = {0x81,0xd2,0xb1,0x82,0x56,0xcf,0xcc,0xd4,0x41,0x28,0xa9,0x03,0x5f};
    // мощность
    byte CmdPower[] = {0x81,0xd2,0xb1,0x82,0x50,0xcf,0xd7,0xc5,0x50,0x28,0xa9,0x03,0xe4};
    // частота
    byte CmdFrequ[] = {0x81,0xd2,0xb1,0x82,0xc6,0xd2,0xc5,0xd1,0x55,0x28,0xa9,0x03,0x5c};
    // ток
    byte CmdCurre[] = {0x81,0xd2,0xb1,0x82,0xc3,0x55,0xd2,0xd2,0xc5,0x28,0xa9,0x03,0x5a};
    // cos f
    byte CmdCos_f[] = {0x81,0xd2,0xb1,0x82,0xc3,0x55,0xd2,0xd2,0xc5,0x28,0xa9,0x03,0x5a};


    #define CYCLE_TIME 15
    #define DIR 15  //8
    SoftwareSerial UART(14, 12); //(10, 11); // RX, TX

    struct Energomera{
      String NameParam;
      String StrValue;
      float  FloatValue;
    };


    String ReadStr;
    Energomera Etope;
    Energomera Volta;
    Energomera Power;
    Energomera Curre;
    Energomera Frequ;
    Energomera Cos_f;


    Energomera ValueParser(String inString, String Param)
    {
      String inString2;
      Energomera Buffer;

      Buffer.NameParam = Param;
      Buffer.StrValue = "0";
      Buffer.FloatValue = 0;

      if (inString.lastIndexOf(Param)>0)
          {
              int first = inString.indexOf(Param);
              first = inString.indexOf('(', first + 1 );
              first = first +1;
              //Serial.println(first);
              int first_2 = inString.indexOf(')', first + 1 );
                   
              inString2 = inString.substring(first,first_2);
              inString2.toCharArray(x, sizeof(x));
              float f = atof(x);
           
              Buffer.StrValue = inString2;
              Buffer.FloatValue = f;
           
              inString = "";
          }
          return Buffer;
    }

    void PrintVolume(Energomera Buffer)
    {
       Serial.print(Buffer.NameParam);
       Serial.print("   ");
       Serial.print(Buffer.StrValue);   //формат string
       Serial.print("------>");
       Serial.println(Buffer.FloatValue);           //формат float
    }

    void EnergomeraRead()
    {
      switch (Step) {
            case 1:
               
            break;
            case 2:
               
            break;
            case 3:
                  Etope = ValueParser(ReadStr, "ET0PE");
                  PrintVolume(Etope);
            break;
            case 4:
                  Volta = ValueParser(ReadStr, "VOLTA");
                  PrintVolume(Volta);
            break;
            case 5:
                  Power = ValueParser(ReadStr, "POWEP");
                  PrintVolume(Power);
            break;
            case 6:
                  Frequ = ValueParser(ReadStr, "FREQU");
                  PrintVolume(Frequ);
            break;
            case 7:
                  Curre = ValueParser(ReadStr, "CURRE");
                  PrintVolume(Curre);
            break;
            case 8:
                  Cos_f = ValueParser(ReadStr, "COS_f");
                  PrintVolume(Cos_f);
                  Serial.println();
            break;
            default:

            break;
          }
          ReadStr = "";
    }


    void SendCommand(byte* cmd, int size)
    {
        digitalWrite(DIR, HIGH);
        UART.write (cmd,size);
        digitalWrite(DIR, LOW);
    }

    void EmergomeraWrite()
    {
        switch (Step) {
            case 1:
                 SendCommand(CmdOpenSesion,5);
            break;
            case 2:
                 SendCommand(CmdReadType,6);
            break;
            case 3:
                 SendCommand(CmdEtope,13);
            break;
            case 4:
                 SendCommand(CmdVolta,13);
            break;
            case 5:
                 SendCommand(CmdPower,13);
            break;
            case 6:
                 SendCommand(CmdFrequ,13);
            break;
            case 7:
                 SendCommand(CmdCurre,13);
            break;
            case 8:
                 SendCommand(CmdCos_f,13);
            break;
            case CYCLE_TIME:
                   Step = 0;
            break;
              default:

            break;
          }
     
    }

    void setup()
    {
      Serial.begin(9600);
      UART.begin(9600); //, SWSERIAL_8N1, 14, 12, false, 256);
      pinMode(DIR, OUTPUT);
      digitalWrite(DIR, HIGH);
    }

    void EnergomeraCycle()
    {
      if (UART.available())
        {
          char response = UART.read();
          response &= 0x7F;// convert 8N1 to 7E1
       
          //Serial.print(response);
          char inChar = response;

          ReadStr += inChar;
        }
     
        //ReadStr = "FREQU(50.00)";
        //Serial.println(ReadStr);
       
        if (millis() - Previous > 1000)
        {
         Previous = millis();
         EnergomeraRead();
         Step ++;
         EmergomeraWrite();      
         }
    }

    void loop()
    {
        EnergomeraCycle();
    }
     

    Необходимо дописать функцию подключения к WiFi и передачу данных в mqtt

    Тема в соседней ветке
    http://forum.amperka.ru/threads/Таймер-alarm.21321/

    Захват обмена прилагаю
     

    Вложения:

  2. perfomaster

    perfomaster Нерд

  3. b707

    b707 Гуру

    Вроде тут уже был один в один такой заказ, только ник Заказчика другой.
    Вы ник сменили или это другой человек?

    В любом случае для такой работы исполнителю нужен такой счетчик - а то вам напишут абы что...
     
  4. Alex.V

    Alex.V Нуб

    Добрый день. Нет, я не менял ник. У мен два скетча есть. Оба работают. Показания идут , когда слушаешь порт. Но в одном скетче код похуже , но приходят показания как надо, день/ночь. А во втором код получше, но приходит только один тариф общий. Зачем счётчик, если скетч работает?
     
  5. Alex.V

    Alex.V Нуб

    Заказ закрыт
     
  6. b707

    b707 Гуру

    сделали или бросили?
     
  7. Alex.V

    Alex.V Нуб

    Сделал, ответил один человек и за небольшую плату довел скетч до ума