Untitled
unknown
plain_text
a year ago
5.7 kB
7
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