Activity › Forums › Questions & Troubleshooting › Controllino MAXI RS485 Modbus › Reply To: Controllino MAXI RS485 Modbus
-
my and originally someone else’s code: (Thanks to whomever I don’t recall)
#include <SPI.h>
#include <Controllino.h>
float RH;
//———————————————————————————–
#define MAX_MILLIS_TO_WAIT 300
#define FRAMESIZE 9
//———————————————————————————–
#define ADDRESS 0x01 // BYTE 1
#define FUNCTION_CODE 0x04 // BYTE 2
#define BYTE_03 0x00 // BYTE 3
#define BYTE_04 0x01 // BYTE 4
#define BYTE_05 0x00 // BYTE 5
#define BYTE_06 0x01 // BYTE 6
//———————————————————————————–
void setup() {
Serial.begin(9600);
// initialize the modbus communication
Serial3.begin(9600);
Controllino_RS485Init();
Controllino_RS485RxEnable();
/* This will initialize Controllino RS485 pins */
}
void loop() {
if (runEvery(3000)) {
Serial.println(“===================================”);
uint16_t ws;
soil(&ws);
//for debugging purpose
RH = ws / 10; Serial.println(” Temp: \t” + String(RH));
}
}
/////////////////////////////function: access modbus data/////////////////////
float soil(uint16_t* ws) {
uint16_t temp;
unsigned long resptime;
uint8_t frame[FRAMESIZE] = {ADDRESS, FUNCTION_CODE, BYTE_03, BYTE_04, BYTE_05, BYTE_06, 0, 0, 0};
temp = calculateCRC(frame, FRAMESIZE – 3); // calculate out crc only from first 6 bytes
frame[6] = lowByte(temp);
frame[7] = highByte(temp);
Serial.println(“=========================================================”);
//=====================For debugging purposes======================//
String request = “Request: “;
for (int n = 0; n < FRAMESIZE – 1; n++) {
request += frame[n] < 0x10 ? ” 0″ : ” “;
request += String(frame[n], HEX);
request.toUpperCase();
}
Serial.println(request);
//=========================================================//
Controllino_RS485TxEnable();
Serial3.write(frame, FRAMESIZE – 1); // send 8 bytes
Serial3.flush(); // wait until the trasmission is complete
//delay(1000);
uint8_t DoPON[8] = {0x02, 0x06, 0x00, 0x83, 0x00, 0x01, 0xB9, 0x0D1};
Serial3.write(DoPON, 8);
Serial3.flush();
Controllino_RS485RxEnable();
resptime = millis();
while ((Serial3.available() < FRAMESIZE) && ((millis() – resptime) < MAX_MILLIS_TO_WAIT) ) {
delay(50);
}
String Response = “Response: “;
if (Serial3.available()) {
for (int n = 0; n < FRAMESIZE – 2; n++) {
frame[n] = Serial3.read();
//debugging//
Response += frame[n] < 0x10 ? ” 0″ : ” “;
Response += String(frame[n], HEX);
Response.toUpperCase();
}
Serial.println(Response);
*ws = ((uint16_t)frame[3] << 8) | frame[4];
}
}
/////////////////////////////function: access modbus data/////////////////////
uint16_t calculateCRC(uint8_t *array, uint8_t num) {
uint16_t temp, flag;
temp = 0xFFFF;
for (uint8_t i = 0; i < num; i++) {
temp = temp ^ array[i];
for (uint8_t j = 8; j; j–) {
flag = temp & 0x0001;
temp >>= 1;
if (flag)
temp ^= 0xA001;
}
}
return temp;
}
//————————————————-//
boolean runEvery(unsigned long interval)
{
static unsigned long previousMillis = 0;
unsigned long currentMillis = millis();
if ((currentMillis – previousMillis) >= interval)
{
previousMillis = currentMillis;
return true;
}
return false;
}