From 94e2d8583ac31875f699cdd64a26db5f8cc1a7e7 Mon Sep 17 00:00:00 2001 From: "Hein (Warky)" Date: Thu, 19 Sep 2024 19:17:24 +0200 Subject: [PATCH] Switch dev --- firmware/modbus-sd/modbus-sd-01.ino | 129 +++++++++++++++------------- 1 file changed, 69 insertions(+), 60 deletions(-) diff --git a/firmware/modbus-sd/modbus-sd-01.ino b/firmware/modbus-sd/modbus-sd-01.ino index a296af6..ae95170 100644 --- a/firmware/modbus-sd/modbus-sd-01.ino +++ b/firmware/modbus-sd/modbus-sd-01.ino @@ -1,23 +1,22 @@ #include #include -#include #include - +#include #include #include -#define DE_RE_PIN 4 -#define RX_PIN 6 // SoftwareSerial RX pin -#define TX_PIN 8 // SoftwareSerial TX pin #define SD_CS_PIN 10 // Chip Select for SD Card +//RS485 pins +#define DE_RE_PIN 4 +#define RX_PIN 3 // SoftwareSerial RX pin +#define TX_PIN 2 // SoftwareSerial TX pin +#define SLAVE_ID 101 RTC_DS3231 rtc; // Create an RTC object File dataFile; - SoftwareSerial modbusSerial(RX_PIN, TX_PIN); // Create a software serial instance -Modbus slave(1, modbusSerial, DE_RE_PIN); -uint16_t holdingRegisters[20]; // Array to hold Modbus registers +ModbusMaster node; void setup() { @@ -36,6 +35,7 @@ void setup() // Comment out the following line once the time is set to avoid resetting on every start rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); } + Serial.print("Time: "); Serial.print(rtc.now().timestamp()); Serial.println("\n"); @@ -43,7 +43,8 @@ void setup() // Initialize SD card Serial.println("SD card initializing..."); pinMode(SD_CS_PIN, OUTPUT); - if (!SD.begin(SPI_HALF_SPEED, SD_CS_PIN)) + + if (!SD.begin(SPI_HALF_SPEED, SD_CS_PIN )) { Serial.println("SD card initialization failed!\n"); return; @@ -51,18 +52,31 @@ void setup() Serial.println("SD card initialized.\n"); Serial.println("Initialize RS485 module / Modbus \n"); - // Initialize RS485 module - // Initialize DE and RE pins + + pinMode(DE_RE_PIN, OUTPUT); digitalWrite(DE_RE_PIN, LOW); // Set to LOW for receiving mode initially - slave.start(); - - // Initialize the holding registers - // holdingRegisters[0] = 0x0000; - // holdingRegisters[1] = 0x0000; + modbusSerial.begin(9600 ); +// +// while (!modbusSerial) { +// } + node.begin(SLAVE_ID, modbusSerial); + node.preTransmission(preTransmission); + node.postTransmission(postTransmission); } +void preTransmission() +{ + digitalWrite(DE_RE_PIN, HIGH); // Enable RS485 transmit +} + +void postTransmission() +{ + digitalWrite(DE_RE_PIN, LOW); // Disable RS485 transmit +} + + void writeFile(char *str) { if (!dataFile) @@ -100,57 +114,52 @@ String getFilename() return mb; } - +static unsigned long lastRefreshTime = 0; void loop() { - Serial.print("Time: "); - Serial.print(rtc.now().timestamp()); - // Serial.print("\nHeep:"); - // Serial.print(ESP.getFreeHeap()); - Serial.print("\n"); + uint8_t result = result = node.readHoldingRegisters(2705 , 2); - // Open file for writing - String filename = getFilename(); - Serial.print("Open Card "); - Serial.print(filename.c_str()); - Serial.print("\n"); - - dataFile = SD.open(filename.c_str(), FILE_WRITE); - - Serial.print("Error count "); - Serial.print(slave.getErrCnt()); - Serial.print("\n"); - Serial.print(slave.getLastError()); - Serial.print("\n"); - - // - const int result = slave.poll(holdingRegisters, 20); - String mb = "modbus,"; - mb += result; - mb += ","; - for (int i = 0; i < 20; i++) + // Check if the read was successful + if (result == node.ku8MBSuccess) { - mb += holdingRegisters[i]; - mb += ","; + Serial.print("Read successful: "); + + } else { + Serial.print("Read error: "); + Serial.println(result, HEX); } - Serial.println(mb.c_str()); - writeFile(mb.c_str()); - if (modbusSerial.available() > 0) + + + if(millis() - lastRefreshTime >= 1000) { - Serial.println(modbusSerial.read()); + lastRefreshTime += 1000; + + Serial.print("Time: "); + Serial.print(rtc.now().timestamp()); + // Serial.print("\nHeep:"); + // Serial.print(ESP.getFreeHeap()); + Serial.print("\n"); + + // Open file for writing + String filename = getFilename(); + Serial.print("Open Card "); + Serial.print(filename.c_str()); + Serial.print("\n"); + + dataFile = SD.open(filename.c_str(), FILE_WRITE); + + + if (dataFile) + { + dataFile.close(); // Close the file + Serial.print("Data written to SD card: "); + Serial.print(filename.c_str()); + Serial.print("\n"); + } + + Serial.print("\n\n"); + } - - if (dataFile) - { - dataFile.close(); // Close the file - Serial.print("Data written to SD card: "); - Serial.print(filename.c_str()); - Serial.print("\n"); - } - - Serial.print("\n\n"); - - delay(1000); // Delay between readings }