Untitled

 avatar
unknown
plain_text
5 months ago
5.7 kB
3
Indexable
#include <SoftwareSerial.h>
//#include <avr/wdt.h>
#include <Wire.h>


#define rxPin1 5
#define txPin1 6
#define txEnPin1 4




SoftwareSerial mySerial1 = SoftwareSerial(rxPin1, txPin1);

unsigned char ibuf[128];


float liczAVcc = 0;
float liczBVcc = 0;
float liczCVcc = 0;

float liczAC = 0;
float liczBC = 0;
float liczCC = 0;

float liczAP = 0;
float liczBP = 0;
float liczCP = 0;

float liczFRQ = 0;
float liczPOBRANO = 0;

unsigned long millis1 = 0;
unsigned long rmillis1 = 0;

unsigned long loopStartTime;      // Czas rozpoczęcia pętli loop()
unsigned long loopDuration;

int x = 12;

void setup() {
  Wire.begin(); 
  Serial.begin(9600);

  pinMode(rxPin1, INPUT);
  pinMode(txPin1, OUTPUT);
  pinMode(txEnPin1, OUTPUT);
  mySerial1.begin(9600);
  delay(500);
  Serial.println("boot");
  
  
}


void loop() {
  Serial.println("test");
  loopStartTime = micros();
  delay(1000);
  zapytaniedoLicznika(0);
  yield();
  delay(500);
  
  if (mySerial1.available() > 0) {
    parsujDanezLicznika();
    yield();
  }
  
  delay(1000);

    
yield();

  loopDuration = micros() - loopStartTime; // Oblicz czas trwania pętli loop()
  delay(200);
  Serial.print("Czas trwania pętli loop(): ");
  Serial.print(loopDuration/1000000);
  Serial.println(" sekundy");

delay(200);
/*
if (loopDuration > 10000000 || loopDuration < 1000000) {                     // jest to nie w milisekundach a w mikrosekundach 1 milion = 1 sekunda
    Serial.println("Restart programu");
    wdt_enable(20);  // Ustaw krótki czas resetowania watchdog timera (np. 15 ms)
    while (1);  // Zawieszenie programu, co spowoduje resetowanie przez watchdog timer
  }
*/
  





}


float bin2float(int istart) {
yield();
  byte bA[4] = { 0x00, 0x00, 0x00, 0x00 };  // Example array of 4 bytes
  bA[3] = ibuf[istart];
  bA[2] = ibuf[istart + 1];
  bA[1] = ibuf[istart + 2];
  bA[0] = ibuf[istart + 3];
  float result;
  memcpy(&result, bA, sizeof(float));
  return result;
yield();
}





void zapytaniedoLicznika(unsigned char startadr) {
  unsigned char Inputs[] = { 0x02, 0x04, 0x00, 0x18, 0x00, 0x02, 0xFF, 0xFF };  
 // Inputs[3] = startadr;
  wyslij_po_rs(Inputs, 6);  //6 bajtów danych + suma kontrolna
}

void parsujDanezLicznika() {
  delay(50);
  for (int i = 0; i <= 32; i++) {
    ibuf[i] = 255;
    yield();
  }
  int licz = 0;
  //licz = mySerial1.readBytes(ibuf, licz);
  while (mySerial1.available() && licz < 32) {
    ibuf[licz++] = mySerial1.read();
    yield();
  }


  String stringOne = "";
  for (int i = 0; i <= licz + 1; i++) {
    stringOne += String(ibuf[i], HEX) + ",";
    yield();
  }


  int inCRC = (ibuf[licz - 1] << 8 ) + ibuf[licz - 2];

  uint16_t CRC16 = 0xFFFF;

  CRC16 = 0xFFFF;
  int i = 0;
  for (i = 0; i < licz - 2; i++) {
    Calc_CRC(ibuf[i], &CRC16);
    yield();
  }

 //  Serial.print("Dane odebrane : ");                // wypisanie danych odebranych 
 //   Serial.println(stringOne);


  if (inCRC != CRC16) {
    yield();
    Serial.print("Błędna suma kontrolna !!! ");
    Serial.print("CRC Wyliczona / odebrana: ");
    Serial.print(String(CRC16, HEX));
    Serial.print(" / ");
    Serial.println(String(inCRC, HEX));
    yield();
    return;
  }


  int offset = 3;
  Serial.println();
  yield();
 // Serial.print("Parsuje Dane od adresu: ");
 // Serial.println(licznikStartAdr);
 // Serial.print("licz: ");
 //  Serial.println(licz);

  //  Serial.print("Dane RAW: ");
  //  Serial.println(stringOne);



    liczAVcc = bin2float(offset + 0);
    //liczBVcc = bin2float(offset + 4);
   // liczCVcc = bin2float(offset + 8 );
  

   // Serial.print("Moc kW: ");
  //  Serial.println(liczAVcc);
    //Serial.print("Napięcie B: ");
   // Serial.println(liczBVcc);
    //Serial.print("Napięcie C: ");
    //Serial.println(liczCVcc);


   if (liczAVcc < 0) {
    Serial.print("Mod oddawana do sieci: ");
    Serial.print(liczAVcc*(-1));
    Serial.print("kW");
    Serial.println();
   }
   else {
    Serial.print("Moc pobierana z sieci: ");
    Serial.print(liczAVcc);
    Serial.print("kW");
    Serial.println();
   }

  if (liczAVcc >= 6.0) {
    x = 6;
  } else if (liczAVcc >= 4.0) {
   x = 4;
  } else {
   x = 0;
  }
  Serial.println(x);


  Wire.beginTransmission(9); // Rozpocznij transmisję do urządzenia o adresie #9
  Wire.write(x); // Prześlij dane jako tablicę bajtów
  Wire.endTransmission(); // Zakończ transmisję


}


// Compute the MODBUS RTU CRC
void Calc_CRC(unsigned char b, uint16_t* CRC) {
  int carry, i;
  yield();

  CRC[0] ^= b & 0xFF;
  for (i = 0; i < 8; i++) {
    carry = CRC[0] & 0x0001;
    CRC[0] >>= 1;
    if (carry) CRC[0] ^= 0xA001;
  }
}

void wyslij_po_rs(unsigned char inbuf[20], int ile) {
  uint16_t CRC16 = 0xFFFF;
  yield();

  CRC16 = 0xFFFF;
  int i = 0;
  for (i = 0; i < ile; i++) {
    Calc_CRC(inbuf[i], &CRC16);
  }
  inbuf[ile] = CRC16;
  CRC16 = CRC16 >> 8;
  inbuf[ile + 1] = CRC16 & 0x00ff;


  String stringOne = "";
  for (int i = 0; i <= ile + 1; i++) {
    stringOne += String(inbuf[i], HEX) + ",";
  }
 // Serial.print("Dane RAW: ");                           // wypisanie czystych danych
 // Serial.println(stringOne);
  delay(500);
  yield();


   

  while (mySerial1.read() != -1)
    ;

  digitalWrite(txEnPin1, HIGH);
  delay(20);
  mySerial1.write(inbuf, ile + 2);
  delay(5);
  yield();
  digitalWrite(txEnPin1, LOW);
}





int StrToHex(char str[]) {
  return (int)strtol(str, 0, 16);
}




Editor is loading...
Leave a Comment