It works but i can only send digital outputs, i want to acheive getting values back.
The master code:
#include "WConstants.h"
#include <NewSoftSerial.h>
#include "RS485_protocol.h"
NewSoftSerial rs485 (2, 3); // receive pin, transmit pin
const byte ENABLE_PIN = 4;
int channel = 0;
const int NUMBER_OF_FIELDS = 4; // t_west, t_back, t_up, t_down
int fieldIndex = 0;
int values[NUMBER_OF_FIELDS]; // temp * 10
int deviceID=0;
int function =2;
int data=0;
int RXdata=0;
int data2=0;
const byte LED_PIN = 13;
int incomingByte=0; // for incoming serial data
int thousands=0; int hundreds =0; int tens =0; int ones=0;
int inByte=0;
byte Cmd = 2;
byte old_level = 0;
// callback routines
void fWrite (const byte what)
{
rs485.print (what);
}
int fAvailable ()
{
return rs485.available ();
}
int fRead ()
{
return rs485.read ();
}
void setup()
{
rs485.begin (28800);
Serial.begin(9600);
pinMode (ENABLE_PIN, OUTPUT); // driver output enable
pinMode (LED_PIN, OUTPUT); // built-in LED
} // end of setup
void loop()
{
byte level = (data);
if (Serial.available() > 0) { //read value from host PC
hostprotocol();
}
// no change? forget it
if (data == old_level)
return;
// assemble message
byte msg [] = {
deviceID, // device 1
function, // turn light on
data // to what level
};
// send to slave
digitalWrite (ENABLE_PIN, HIGH); // enable sending
sendMsg (fWrite, msg, sizeof msg);
delayMicroseconds (660);
digitalWrite (ENABLE_PIN, LOW); // disable sending
// receive response
byte buf [20];
byte received = recvMsg (fAvailable, fRead, buf, sizeof buf);
digitalWrite (LED_PIN, received == 0); // turn on LED if error
// only send once per successful change
if (received)
{
if (buf [0] != channel)
return; // not my device
if (buf [1] != Cmd)
return; // unknown command
byte msg [] = {
0, // device 0 (master)
RXdata,
};
data2 = buf [2];
//delay (5); // give the master a moment to prepare to receive
//Serial.print (data2);
old_level = data;
}
} // end of loop
void hostprotocol() //Serial commands received from host
{
if (Serial.available()) { // Read message
delay(100);
while (Serial.available()) {
char ch = Serial.read();
if (ch >= '0' && ch <= '9') {
values[fieldIndex] = (values[fieldIndex] * 10) + (ch - '0');
} else if (ch == ',') {
if (fieldIndex < NUMBER_OF_FIELDS - 1) {
fieldIndex++;
}
} else if (ch == '-') {
values[fieldIndex] = values[fieldIndex] * -1;
} else {
deviceID=(values[0]);
values[0] = 0;
function=(values[1]);
values[1] = 0;
data=(values[2]);
values[2] = 0;
data2=(values[3]);
values[3] = 0;
fieldIndex = 0;
}
}
}
}
and slave
#include "WConstants.h"
#include <NewSoftSerial.h>
#include "RS485_protocol.h"
NewSoftSerial rs485 (2, 3); // receive pin, transmit pin
const byte ENABLE_PIN = 4;
int channel = 1;// Device ID
int Inputvalue =0; // Input value from Master
int ledPin = 12;// digital bit weighted outputs
int ledPin1 = 11;
int ledPin2 = 10;
int ledPin3 = 9;
int ledPin4 = 8;
int ledPin5 = 7;
int ledPin6 = 6;
int ledPin7 = 5;
void fWrite (const byte what)
{
rs485.print (what);
}
int fAvailable ()
{
return rs485.available ();
}
int fRead ()
{
return rs485.read ();
}
void setup()
{
rs485.begin (28800);
pinMode (ENABLE_PIN, OUTPUT); // driver output enable
//Bit weighted gigital outputs
pinMode(ledPin, OUTPUT); // initialize the LED pin as an output:
pinMode(ledPin1, OUTPUT); // initialize the LED pin as an output:
pinMode(ledPin2, OUTPUT); // initialize the LED pin as an output:
pinMode(ledPin3, OUTPUT); // initialize the LED pin as an output:
pinMode(ledPin4, OUTPUT); // initialize the LED pin as an output:
pinMode(ledPin5, OUTPUT); // initialize the LED pin as an output:
pinMode(ledPin6, OUTPUT); // initialize the LED pin as an output:
pinMode(ledPin7, OUTPUT); // initialize the LED pin as an output:
}
void loop()
{
byte buf [20];
byte received = recvMsg (fAvailable, fRead, buf, sizeof (buf) - 1);
if (received)
{
if (buf [0] != channel)
return; // not my device
if (buf [1] != 2)
return; // unknown command
byte msg [] = {
0, // device 0 (master)
3, // turn light on command received
};
delay (5); // give the master a moment to prepare to receive
digitalWrite (ENABLE_PIN, HIGH); // enable sending
sendMsg (fWrite, msg, sizeof msg);
digitalWrite (ENABLE_PIN, LOW); // disable sending
//analogWrite (11, buf [2]); // set light level AS WAS JT
Inputvalue =buf [2];// write coil value to a variable for use later JT
// digital bit weighted outputs
digitalWrite(ledPin, (Inputvalue >> 0 )% 2);// LSB
digitalWrite(ledPin1, (Inputvalue >> 1)% 2);
digitalWrite(ledPin2, (Inputvalue >> 2)% 2);
digitalWrite(ledPin3, (Inputvalue >> 3)% 2);
digitalWrite(ledPin4, (Inputvalue >> 4) % 2);
digitalWrite(ledPin5, (Inputvalue >> 5) % 2);
digitalWrite(ledPin6, (Inputvalue >> 6) % 2);
digitalWrite(ledPin7, (Inputvalue >> 7) % 2); // MSB
} // end if something received
} // end of loop