diff --git a/examples/RS485_HalfDuplex/RS485_HalfDuplex.ino b/examples/RS485_HalfDuplex/RS485_HalfDuplex.ino new file mode 100644 index 0000000..e11d3ef --- /dev/null +++ b/examples/RS485_HalfDuplex/RS485_HalfDuplex.ino @@ -0,0 +1,96 @@ +/* + + RS485_HalfDuplex.pde - example using ModbusMaster library + + This example is tested against an EPSolar LS2024B solar charge controller. + See here for protocol specs: + http://www.solar-elektro.cz/data/dokumenty/1733_modbus_protocol.pdf + + This file is part of ModbusMaster. + + ModbusMaster is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + ModbusMaster is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with ModbusMaster. If not, see . + + Written by Marius Kintel + +*/ +#include + +/*! + We're using a MAX485-compatible RS485 Transceiver. + Rx/Tx is hooked up to the hardware serial port at 'Serial'. + The Data Enable and Receiver Enable pins are hooked up as follows: +*/ +#define MAX485_DE 3 +#define MAX485_RE_NEG 2 + +// instantiate ModbusMaster object +ModbusMaster node; + +void preTransmission() +{ + digitalWrite(MAX485_RE_NEG, 1); + digitalWrite(MAX485_DE, 1); +} + +void postTransmission() +{ + digitalWrite(MAX485_RE_NEG, 0); + digitalWrite(MAX485_DE, 0); +} + +void setup() +{ + pinMode(MAX485_RE_NEG, OUTPUT); + pinMode(MAX485_DE, OUTPUT); + // Init in receive mode + digitalWrite(MAX485_RE_NEG, 0); + digitalWrite(MAX485_DE, 0); + + // Modbus communication runs at 115200 baud + Serial.begin(115200); + + // Modbus slave ID 1 + node.begin(1, Serial); + // Callbacks allow us to configure the RS485 transceiver correctly + node.preTransmission(preTransmission); + node.postTransmission(postTransmission); +} + +bool state = true; + +void loop() +{ + uint8_t result; + uint16_t data[6]; + + // Toggle the coil at address 0x0002 (Manual Load Control) + result = node.writeSingleCoil(0x0002, state); + state = !state; + + // Read 16 registers starting at 0x3100) + result = node.readInputRegisters(0x3100, 16); + if (result == node.ku8MBSuccess) + { + Serial.print("Vbatt: "); + Serial.println(node.getResponseBuffer(0x04)/100.0f); + Serial.print("Vload: "); + Serial.println(node.getResponseBuffer(0xC0)/100.0f); + Serial.print("Pload: "); + Serial.println((node.getResponseBuffer(0x0D) + + node.getResponseBuffer(0x0E) << 16)/100.0f); + } + + delay(1000); +} +