#define MSB_Baud 38400 // Serial baudrate for Unilog & MSB Sensors
#define DISPLAY_Baud 115200 // Serial baudrate for iMSB display
#define DEBUG_Baud 115200 // Serial baudrate for debug port
#define DEBUG_COM Serial
#define MSB_COM Serial1
#define MSB_COM_C1 UART0_C1 // <----- Handbook page 1055
#define DISPLAY_COM Serial2
#define LED 13
void transmitMLink(int sensor_id, byte data1, byte data2, byte data3) {
// Example:
// Sensor 11 12 13 21 22 23
// 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
// 0x02,0x00,0x30,0x34,0x34,0x00,0x40,0x06,0x41,0xFA,0x00,0x52,0x6E,0x01,0x00,0x00,0x00,0x00,0xAB,0x03
// Adr. 4, value class 1 "Voltage", 12.5 Volt + no alarm; Adr. 5, value class 2 "Current", 18.3A + no alarm
/* ----- DEBUG CODE -----*/
DEBUG_COM.print("Decoding ");
DEBUG_COM.print (sensor_id);
DEBUG_COM.print ("==> ");
DEBUG_COM.print(data1, HEX);
DEBUG_COM.print(" ");
DEBUG_COM.print(data2, HEX);
DEBUG_COM.print(" ");
DEBUG_COM.print(data3, HEX);
DEBUG_COM.print(" ");
DEBUG_COM.println();
DEBUG_COM.flush();
/*----------------------*/
// Test data
// int disp_message[] = {0x02,0x00,0x30,0x34,0x34,0x00,0x40,0x06,0x41,0xFA,0x00,0x52,0x6E,0x01,0x00,0x00,0x00,0x00,0xAB,0x03};
int disp_message[] = {0x02,0x00,0x30,0x34,0x34,0x00,0x40,0x06,0x41,0x00,0x1B,0x23,0x52,0x3F,0x01,0x00,0x00,0x00,0x00,0xAB,0x03};
// disp_message[9] = data2;
// disp_message[10] = data3;
for (int i = 0; i < 21; i++) {
DISPLAY_COM.write (disp_message[i]);
DISPLAY_COM.flush();
DEBUG_COM.print (disp_message[i],HEX);
DEBUG_COM.flush();
}
}
void setup() {
//enable serial ports
MSB_COM.begin(MSB_Baud);
MSB_COM_C1 |= 32+128; // Single wire mode <--------------------
DISPLAY_COM.begin(DISPLAY_Baud);
DEBUG_COM.begin(DEBUG_Baud);
pinMode(LED, OUTPUT);
boolean led_on = true;
DEBUG_COM.println("Set Unilog to MLINK Mode");
// sends an address (0x00 to 0x0f) to the bus every 6ms to switch the Unilog device to MLINK/MSB mode
for (int n=1; n < 100; n++) {
digitalWrite(LED, led_on); // blink during initializing Unilog
led_on = ! led_on;
for (byte i=1; i< 16; i++) {
MSB_COM.write(i); // send sensor address
MSB_COM.flush(); // make sure send is complete
delay(6); // wait up to 6ms for answer
}
}
digitalWrite(LED, false); // led off after init
DEBUG_COM.println("init done");
}
void loop() {
byte data1;
byte data2;
byte data3;
byte dummy;
int sensorSeenCounter = 0;
while (true) {
for (byte i=1; i< 16; i++) {
while(MSB_COM.available() > 0) { MSB_COM.read(); } // throw away any received bytes
MSB_COM.write(i); // send sensor address
MSB_COM.flush(); // make sure send is complete
dummy = MSB_COM.read(); // read the byte we just sent
delay(6); // wait up to 6ms for answer
if (MSB_COM.available() == 3) { // 3 bytes received means: got valid reply
data1 = MSB_COM.read();
data2 = MSB_COM.read();
data3 = MSB_COM.read();
transmitMLink(i, data1, data2, data3);
}
}
}
}