Skip to content

Instantly share code, notes, and snippets.

@martinez20m
Created March 27, 2023 18:35
Show Gist options
  • Save martinez20m/2597dd791224aa96e883bbdbef6921ef to your computer and use it in GitHub Desktop.
Save martinez20m/2597dd791224aa96e883bbdbef6921ef to your computer and use it in GitHub Desktop.
ArduinoModbus getting to work
//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);
}
#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__
.
.
.
RS485Class RS485(SERIAL_PORT_HARDWARE2, RS485_DEFAULT_TX_PIN, RS485_DEFAULT_DE_PIN, RS485_DEFAULT_RE_PIN);
/*
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