Untitled
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