-
-
Save martinez20m/2597dd791224aa96e883bbdbef6921ef to your computer and use it in GitHub Desktop.
ArduinoModbus getting to work
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//Test code for modbus server (slave) | |
#include <Arduino.h> | |
#include <ArduinoRS485.h> | |
#include <ArduinoModbus.h> | |
#include "ntc.h" | |
#define D_RELAY_1 7 | |
#define S_RELAY_1 10 | |
#define PULLUP_OUT_1 11 | |
#define TEMP_1 A0 | |
#define BUTTON1 19 | |
#define BUTTON2 20 | |
#define BUTTON3 21 | |
#define DIODE0 0 | |
#define DIODE1 1 | |
NTC temp_sensor(TEMP_1, 3.3, 4000); | |
void setup() | |
{ | |
// put your setup code here, to run once: | |
pinMode(LED_BUILTIN, OUTPUT); | |
pinMode(D_RELAY_1, OUTPUT); | |
pinMode(S_RELAY_1, OUTPUT); | |
pinMode(PULLUP_OUT_1, OUTPUT); | |
pinMode(TEMP_1, INPUT); | |
pinMode(DIODE0, OUTPUT); | |
pinMode(DIODE1, OUTPUT); | |
//Serial2.begin(19200); | |
if (!ModbusRTUServer.begin(1, 115200)) | |
{ | |
while (1) | |
; | |
} | |
uint8_t ret = ModbusRTUServer.configureCoils(0x0000, 4); | |
while (!ret) | |
{ | |
digitalWrite(LED_BUILTIN, HIGH); | |
delay(500); | |
digitalWrite(LED_BUILTIN, LOW); | |
delay(500); | |
} | |
ret = ModbusRTUServer.configureHoldingRegisters(0, 5); | |
while (!ret) | |
{ | |
digitalWrite(LED_BUILTIN, HIGH); | |
delay(500); | |
digitalWrite(LED_BUILTIN, LOW); | |
delay(500); | |
} | |
ret = ModbusRTUServer.configureInputRegisters(0, 1); | |
while (!ret) | |
{ | |
digitalWrite(LED_BUILTIN, HIGH); | |
delay(500); | |
digitalWrite(LED_BUILTIN, LOW); | |
delay(500); | |
} | |
ret = ModbusRTUServer.configureDiscreteInputs(0, 3); | |
while (!ret) | |
{ | |
digitalWrite(LED_BUILTIN, HIGH); | |
delay(500); | |
digitalWrite(LED_BUILTIN, LOW); | |
delay(500); | |
} | |
} | |
void loop() | |
{ | |
// put your main code here, to run repeatedly: | |
static unsigned long prev = 0; | |
static uint8_t led_state = 0; | |
static uint8_t d_relay_state = 0; | |
static uint8_t s_relay_state = 0; | |
static uint8_t pullup_out_state = 0; | |
float temp_val; | |
static uint8_t btn1, btn2, btn3; | |
static uint16_t diode0_pwm, diode1_pwm; | |
ModbusRTUServer.poll(); | |
led_state = ModbusRTUServer.coilRead(0); | |
d_relay_state = ModbusRTUServer.coilRead(1); | |
s_relay_state = ModbusRTUServer.coilRead(2); | |
pullup_out_state = ModbusRTUServer.coilRead(3); | |
digitalWrite(LED_BUILTIN, led_state); | |
digitalWrite(D_RELAY_1, d_relay_state); | |
digitalWrite(S_RELAY_1, s_relay_state); | |
digitalWrite(PULLUP_OUT_1, pullup_out_state); | |
//temp_val = analogRead(TEMP_1); | |
// ModbusRTUServer.holdingRegisterWrite(0, temp_val); | |
// ModbusRTUServer.holdingRegisterWrite(1, 1234); | |
temp_val = temp_sensor.getAvgTemperature(64); | |
temp_val += 0.01; | |
ModbusRTUServer.inputRegisterWrite(0, temp_val); | |
btn1 = digitalRead(BUTTON1); | |
btn2 = digitalRead(BUTTON2); | |
btn3 = digitalRead(BUTTON3); | |
ModbusRTUServer.discreteInputWrite(0, btn1); | |
ModbusRTUServer.discreteInputWrite(1, btn2); | |
ModbusRTUServer.discreteInputWrite(2, btn3); | |
diode0_pwm = ModbusRTUServer.holdingRegisterRead(0); | |
diode1_pwm = ModbusRTUServer.holdingRegisterRead(1); | |
analogWrite(DIODE0, diode0_pwm); | |
analogWrite(DIODE1, diode1_pwm); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#pragma once | |
#include <macros.h> | |
#include <stdint.h> | |
#ifndef __PINS_ARDUINO__ | |
#define __PINS_ARDUINO__ | |
#ifdef __cplusplus | |
extern "C" unsigned int PINCOUNT_fn(); | |
#endif | |
// Pin count | |
// ---- | |
#define PINS_COUNT (PINCOUNT_fn()) | |
#define NUM_DIGITAL_PINS (30u) | |
#define NUM_ANALOG_INPUTS (4u) | |
#define NUM_ANALOG_OUTPUTS (0u) | |
extern PinName digitalPinToPinName(pin_size_t P); | |
// LEDs | |
// ---- | |
#define PIN_LED (25u) | |
#define LED_BUILTIN PIN_LED | |
// Analog pins | |
// ----------- | |
#define PIN_A0 (26u) | |
#define PIN_A1 (27u) | |
#define PIN_A2 (28u) | |
#define PIN_A3 (29u) | |
static const uint8_t A0 = PIN_A0; | |
static const uint8_t A1 = PIN_A1; | |
static const uint8_t A2 = PIN_A2; | |
static const uint8_t A3 = PIN_A3; | |
#define ADC_RESOLUTION 12 | |
// Serial | |
#define PIN_SERIAL_TX (0ul) | |
#define PIN_SERIAL_RX (1ul) | |
#define PIN_SERIAL2_TX (16ul) | |
#define PIN_SERIAL2_RX (17ul) | |
// SPI | |
#define PIN_SPI_MISO (16u) | |
#define PIN_SPI_MOSI (19u) | |
#define PIN_SPI_SCK (18u) | |
#define PIN_SPI_SS (17u) | |
static const uint8_t SS = PIN_SPI_SS; // SPI Slave SS not used. Set here only for reference. | |
static const uint8_t MOSI = PIN_SPI_MOSI; | |
static const uint8_t MISO = PIN_SPI_MISO; | |
static const uint8_t SCK = PIN_SPI_SCK; | |
// Wire | |
#define PIN_WIRE_SDA (4u) | |
#define PIN_WIRE_SCL (5u) | |
#define SERIAL_HOWMANY 2 | |
#define SERIAL1_TX (digitalPinToPinName(PIN_SERIAL_TX)) | |
#define SERIAL1_RX (digitalPinToPinName(PIN_SERIAL_RX)) | |
#define SERIAL2_TX (digitalPinToPinName(PIN_SERIAL2_TX)) | |
#define SERIAL2_RX (digitalPinToPinName(PIN_SERIAL2_RX)) | |
#define SERIAL_CDC 1 | |
#define HAS_UNIQUE_ISERIAL_DESCRIPTOR | |
#define BOARD_VENDORID 0x2e8a | |
#define BOARD_PRODUCTID 0x00c0 | |
#define BOARD_NAME "RaspberryPi Pico" | |
uint8_t getUniqueSerialNumber(uint8_t* name); | |
void _ontouch1200bps_(); | |
#define SPI_HOWMANY (1) | |
#define SPI_MISO (digitalPinToPinName(PIN_SPI_MISO)) | |
#define SPI_MOSI (digitalPinToPinName(PIN_SPI_MOSI)) | |
#define SPI_SCK (digitalPinToPinName(PIN_SPI_SCK)) | |
#define WIRE_HOWMANY (1) | |
#define I2C_SDA (digitalPinToPinName(PIN_WIRE_SDA)) | |
#define I2C_SCL (digitalPinToPinName(PIN_WIRE_SCL)) | |
#define digitalPinToPort(P) (digitalPinToPinName(P)/32) | |
#define SERIAL_PORT_USBVIRTUAL SerialUSB | |
#define SERIAL_PORT_MONITOR SerialUSB | |
#define SERIAL_PORT_HARDWARE Serial1 | |
#define SERIAL_PORT_HARDWARE_OPEN Serial1 | |
#define SERIAL_PORT_HARDWARE2 Serial2 | |
#define USB_MAX_POWER (500) | |
#endif //__PINS_ARDUINO__ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
. | |
. | |
. | |
RS485Class RS485(SERIAL_PORT_HARDWARE2, RS485_DEFAULT_TX_PIN, RS485_DEFAULT_DE_PIN, RS485_DEFAULT_RE_PIN); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
This file is part of the ArduinoRS485 library. | |
Copyright (c) 2018 Arduino SA. All rights reserved. | |
This library is free software; you can redistribute it and/or | |
modify it under the terms of the GNU Lesser General Public | |
License as published by the Free Software Foundation; either | |
version 2.1 of the License, or (at your option) any later version. | |
This library 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 | |
Lesser General Public License for more details. | |
You should have received a copy of the GNU Lesser General Public | |
License along with this library; if not, write to the Free Software | |
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
*/ | |
#ifndef _RS485_H_INCLUDED | |
#define _RS485_H_INCLUDED | |
#include <Arduino.h> | |
#ifdef PIN_SERIAL2_TX | |
#define RS485_DEFAULT_TX_PIN PIN_SERIAL2_TX | |
#else | |
#define RS485_DEFAULT_TX_PIN 16 | |
#endif | |
#ifdef __AVR__ | |
#define RS485_DEFAULT_DE_PIN 2 | |
#define RS485_DEFAULT_RE_PIN -1 | |
#else | |
#define RS485_DEFAULT_DE_PIN 18 | |
#define RS485_DEFAULT_RE_PIN 18 | |
#endif | |
#define RS485_DEFAULT_PRE_DELAY 100 | |
#define RS485_DEFAULT_POST_DELAY 5000 //this delay resolve timout/invalid checksum error | |
class RS485Class : public Stream { | |
public: | |
RS485Class(HardwareSerial& hwSerial, int txPin, int dePin, int rePin); | |
virtual void begin(unsigned long baudrate); | |
virtual void begin(unsigned long baudrate, uint16_t config); | |
virtual void begin(unsigned long baudrate, int predelay, int postdelay); | |
virtual void begin(unsigned long baudrate, uint16_t config, int predelay, int postdelay); | |
virtual void end(); | |
virtual int available(); | |
virtual int peek(); | |
virtual int read(void); | |
virtual void flush(); | |
virtual size_t write(uint8_t b); | |
using Print::write; // pull in write(str) and write(buf, size) from Print | |
virtual operator bool(); | |
void beginTransmission(); | |
void endTransmission(); | |
void receive(); | |
void noReceive(); | |
void sendBreak(unsigned int duration); | |
void sendBreakMicroseconds(unsigned int duration); | |
void setPins(int txPin, int dePin, int rePin); | |
void setDelays(int predelay, int postdelay); | |
private: | |
HardwareSerial* _serial; | |
int _txPin; | |
int _dePin; | |
int _rePin; | |
int _predelay = 0; | |
int _postdelay = 0; | |
bool _transmisionBegun; | |
unsigned long _baudrate; | |
uint16_t _config; | |
}; | |
extern RS485Class RS485; | |
#endif |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment