Hello there i am trying to make a DMX controller which has to be in rs485 connection because of the long distance that i need to send data .. and then the arduino slave is connected to the relay for now i am suing 8 channels.
The relay has to anknowlage the vixen comand so for each part i comand in Vixen one relay must go ative and procede to execute the order.
thanks
Heres my code
//Master
#include <A2a.h>
#include <SoftwareSerial.h>
#include "Arduino.h"
// DEFINIÇÕES DE PINOS
#define pinLED 2 //aqui coloca-se o primeiro pin do primeiro Relé
#define n_arduinos 1
#define n_canais_por_arduino 8
#define N_canais_total (n_arduinos*n_canais_por_arduino)
#define end_inicial 0x08 // aqui coloca-se o endereço do primeiro slave , pode ser alterado, apenas tem de coincidir com o que está no programa do slave 1
//variaveis novas que poderam faltar
#define RS485Transmit HIGH
#define RS485Receive LOW
// INSTANCIANDO OBJETOS
A2a arduinoSlave;
#define SSerialRX 10 //Serial Receive pin
#define SSerialTX 11 //Serial Transmit pin
//Pino de controle transmissao/recepcao
#define SSerialTxControl 3
//SoftwareSerial mySerial(11,12); // RX, TX
#define NOT_INVERTED 0
#define INVERTED 1
#define MODE NOT_INVERTED
// DECLARAÇÃO DE VARIÁVEIS
//declaracao dos canais rele
int channels[] = {n_canais_por_arduino,n_canais_por_arduino,n_canais_por_arduino,n_canais_por_arduino,n_canais_por_arduino ,n_canais_por_arduino,n_canais_por_arduino,n_canais_por_arduino};
byte endereco[n_arduinos];
int byteReceived;
int byteSend;
int a = 'a';
byte incomingByte[N_canais_total];
int i=0;
int counter = 0;
void setup() {
Serial.begin(9600);
Serial3.begin(4800);
Serial.println("ira comecar a enviar dados");
Serial.println("A enviar dados");
pinMode(pinLED, OUTPUT);
pinMode(SSerialTxControl, OUTPUT);
digitalWrite(SSerialTxControl, RS485Receive); //
{
for (int i=0;i<n_arduinos;i++){
endereco[i]=(end_inicial)+i;
}
}
arduinoSlave.begin();{
for (byte nS = 0 ; nS < n_arduinos ; nS++) {
for(byte i=0;i<n_canais_por_arduino;i++){
arduinoSlave.pinWireMode(endereco[nS], pinLED+i, OUTPUT);
delay(100);
arduinoSlave.digitalWireWrite(endereco[nS], pinLED+i, LOW);
}
}
}
if (MODE == NOT_INVERTED){
for (byte nS = 0 ; nS < n_arduinos ; nS++) {
for(byte i=0;i<n_canais_por_arduino;i++){
arduinoSlave.digitalWireWrite(endereco[nS], pinLED+i, HIGH);
delay(500);
arduinoSlave.digitalWireWrite(endereco[nS], pinLED+i, LOW);
}
}
}
}
void loop(){
a=a+1;
{
Serial.println("Novo dado");
digitalWrite(pinLED , HIGH);
Serial.println("Valor lido");
Serial.println(a);
delay(100);
digitalWrite(SSerialTxControl, RS485Transmit);
Serial3.write(a); // Send byte to Remote Arduino
Serial3.flush();
Serial.println("Valor enviado");
Serial.println(a);
digitalWrite(pinLED , LOW); // Show activity
digitalWrite(SSerialTxControl, RS485Receive);
delay(100);
if(Serial3.available()){
byteReceived = Serial3.read();
Serial.println("resposta enviada");
Serial.println(byteReceived);
while(Serial3.available()){
Serial3.read();
}
{
for (int i=0; i<8;i++)
{
incomingByte[i] = Serial.read();
// incomingByte[i] = 255 - Serial.read();
}
int arduino=n_arduinos;
int N_canais_arduino=n_canais_por_arduino;
int n_canais_total=N_canais_total;
for(;;){
if(Serial.available() >= n_canais_total){
for(int i=0;i<n_canais_total;i++){
incomingByte[i]=Serial.read();
}
if (MODE == NOT_INVERTED) {
for(int nS=0;nS<arduino;nS++){
for(int i=0;i<N_canais_arduino;i++){
int j=nS*N_canais_arduino,p=i+j;
if(incomingByte[p]==0){arduinoSlave.digitalWireWrite(endereco[nS], pinLED+i, LOW);
}else{arduinoSlave.digitalWireWrite(endereco[nS], pinLED+i, HIGH);
}
}
}
}
}
}
}
}
}
}
Slave code
#include <A2a.h>
#include <SoftwareSerial.h>
#include "Arduino.h"
#define pinLED 2//primeiro pin do rele
//---------------------- endereço do slave
#define endereco 0x08 // MODIFICAR O ENDEREÇO PARA CADA SLAVE
A2a arduinoMaster;
#define SSerialRX 10 //Serial Receive pin
#define SSerialTX 11 //Serial Transmit pin
//Pino de controle transmissao/recepcao
#define SSerialTxControl 3
#define RS485Transmit LOW
#define RS485Receive HIGH
SoftwareSerial RS485Serial(SSerialRX, SSerialTX);
int byteReceived;
int byteSend;
void setup() {
Serial.begin(9600);
Serial.println("recebido...");
pinMode(pinLED, OUTPUT);
pinMode(SSerialTxControl, OUTPUT);
digitalWrite(SSerialTxControl, RS485Receive); // transmitor
RS485Serial.begin(9600);
arduinoMaster.begin(endereco);
}
void loop() {
if(RS485Serial.available())
{
Serial.println("Resposta chegada");
byteSend = RS485Serial.read();
Serial.println(byteSend);
delay(100);
digitalWrite(SSerialTxControl, RS485Transmit);
RS485Serial.write(byteSend);
RS485Serial.flush();
delay(100);
digitalWrite(SSerialTxControl, RS485Receive);
Serial.println("resposta chegada");
Serial.println(byteSend);
}
}
void receberDados() {
arduinoMaster.receiveData();
}
void enviarDados() {
arduinoMaster.sendData();
}


