// modbus slave PA 6cm control rgk 2018 // bedoeld voor een arduino nano board #include #include /* SimpleModbusSlaveV10 supports function 3, 6 & 16. The modbus_update() method updates the holdingRegs register array and checks communication. REG_1 = control register (read) REG_2 = status register (write) */ #define MCP 0x4d //I2c adres van de MCP9800 temperatuursensor #define LED_ERR 11 // error led datacommunicatie #define SLAVE_ID 3 // modbus slave adres #define TX_RX 2 // RS485 Rx/Tx omschakel lijn //control register low-byte #define PA_ON 0 #define TX_COAX 1 #define TX_MUTE 2 //status register low-byte (high byte is temperatuur uitlezing) #define PA_STATUS 0 // digital pins #define POWER_ON 3 #define COAX 4 #define MUTE 5 #define STATUS 6 // Using the enum instruction allows for an easy method for adding and // removing registers. Doing it this way saves you #defining the size // of your slaves register array each time you want to add more registers // and at a glimpse informs you of your slaves register layout. //////////////// registers of your slave /////////////////// enum { // just add or remove registers and your good to go... // The first register starts at address 0 REG_1, REG_2, HOLDING_REGS_SIZE // leave this one // total number of registers for function 3 and 16 share the same register array // i.e. the same address space }; unsigned int holdingRegs[HOLDING_REGS_SIZE]; // function 3 and 16 register array //////////////////////////////////////////////////////////// void setup() { Wire.begin(); // start de i2c service modbus_configure(&Serial, 38400, SERIAL_8N2, SLAVE_ID, TX_RX, HOLDING_REGS_SIZE, holdingRegs); pinMode(TX_RX,OUTPUT); pinMode(LED_ERR, OUTPUT); pinMode(POWER_ON,OUTPUT); pinMode(COAX,OUTPUT); pinMode(MUTE,OUTPUT); pinMode(STATUS,INPUT_PULLUP); } void loop() { static byte CONTROL=0; static byte CONTROL_OLD=0; static int error; static unsigned int data; static long tijd; static long tijd_oud = 0; static int interval = 100; // delay time tussen coax om en TX-ON static bool send_enable; static char TEMP; tijd = millis(); error = modbus_update(); TEMP = get_temp(); CONTROL = lowByte(holdingRegs[REG_1]); if(CONTROL != CONTROL_OLD){ digitalWrite(POWER_ON,bitRead(CONTROL,PA_ON)); digitalWrite(COAX,bitRead(CONTROL,TX_COAX)); if(bitRead(CONTROL,TX_MUTE) == 1){ send_enable = 1; } else{ send_enable = 0; digitalWrite(MUTE,0); } tijd_oud = tijd; CONTROL_OLD=CONTROL; } data=0; data |= digitalRead(STATUS); data |= TEMP*256; holdingRegs[REG_2] = data; if(error>10)digitalWrite(LED_ERR,HIGH); else digitalWrite(LED_ERR,LOW); if(tijd-tijd_oud > interval & send_enable==1){ digitalWrite(MUTE,1); tijd_oud=tijd; } if(TEMP>45){ send_enable = 0; digitalWrite(MUTE,0); } } char get_temp(){ Wire.beginTransmission(MCP); Wire.write(00); Wire.requestFrom(MCP,2); char hi = Wire.read(); char lo = Wire.read();//discard if(hi>127)hi-=256; // hi=0x16;//test temp return hi; }