Hi,
I have a master-slave system. See below.
The master sends "commands" through the SDA-SCL connection to the slave and it returns a given value. The system works when I feed both Arduino boards through USB to a laptop and, I open the Serial Monitor of both boards.
The system includes an LCD display, three pushbuttons, one 8 relay module and three LEDs. Another scheme is shown below. The serial monitor from the master must be activated to collect data via USB, however, I want to avoid to connect a USB cable to the slave and open the serial monitor. The slave communicates to a device through serial (Serial2).
The code of the slave is (I've removed some lines because of the limit of lines):
const int PR21_NO = 43; const int PR21_NC = 42;
.....
int x, flag = 0, y, delay_ = 700, pin = 0, count=0, once=0, idx, ar[8] = {13, 20, 27, 33, 40, 47, 53, 60};
const byte MY_ADDRESS = 42, MASTER_ADDRESS = 25 ;
uint8_t Buffer[15];
byte BufferMT[11], dat=0;
char ini;
char Model;
uint8_t Channel, MayorRelease, MayorReleaseDec, Release,Address1,Address2,Address3,rssi,AFC,Band;
#define ArrayElementCount(x) (sizeof(x) / sizeof(x[0]))
#include <Wire.h>
void setup() {
Wire.begin (MY_ADDRESS);
Serial2.begin (9600);
Wire.onReceive(receiveEvent);
.....
pinMode(A_TEST, OUTPUT); digitalWrite(A_TEST, HIGH);
}
void loop() {
if (flag == 1)
{
if (y == 36) {
pin = 0; check(pin);
}
else if (y == 37) {
pin = 1; check(pin);
}
else if (y == 35) {
pin = 2; check(pin);
}
else if (y == 34) {
pin = 3; check(pin);
}
else if (y == 33) {
pin = 4; check(pin);
}
else if (y == 38) {
pin = 5; check(pin);
}
else if (y == 26) {
pin = 6; check(pin);
}
else if (y == 24) {
pin = 7; check(pin);
}
else if (y == 22) {
pin = 8; check(pin);
}
else if (y == 41) {
pin = 9; check(pin);
}
else if (y == 40) {
pin = 10; check(pin);
}
else if (y == 39) {
pin = 11; check(pin);
}
else if (y == 31) {
pin = 12; check(pin);
}
else if (y == 30) {
pin = 13; check(pin);
}
else if (y == 28) {
pin = 14; check(pin);
}
else if (y == 100) {
pin = 100;
initial(pin);
}
else if (y == 200) {
pin = 200; start(pin);
}
else if (y == 210) {
pin = 210; start(pin);
}
else if (y == 220) {
pin = 220; start(pin);
}
else if (y == 230)
{
digitalWrite(A_TEST, LOW);
delay (500);
pin = 230; monitor_test();
}
}
}
void receiveEvent(int howMany) {
y = Wire.read();
flag = 1;
}
void check (int pin)
{
...
}
void initial (int pin)
{
static const uint8_t arraypin_NO[] = {PR5_NO, PR6_NO, PR9_NO, PR10_NO, PR11_NO, PR14_NO, PR15_NO, PR16_NO, PR17_NO, PR21_NO, PR22_NO, PR23_NO, PR25_NO, PR26_NO, PR27_NO};
static const uint8_t arraypin_NC[] = {PR5_NC, PR6_NC, PR9_NC, PR10_NC, PR11_NC, PR14_NC, PR15_NC, PR16_NC, PR17_NC, PR21_NC, PR22_NC, PR23_NC, PR25_NC, PR26_NC, PR27_NC};
int z = 15;
if (pin == 100)
{
ini = 'O';
Wire.beginTransmission (25);
Wire.write (ini);
Wire.endTransmission ();
flag = 0;
}
else
{
ini = 'K';
Wire.beginTransmission (25);
Wire.write (ini);
Wire.endTransmission ();
flag = 0;
}
}
}
void start (int pin)
{
if (pin == 200)// Check START, CLAX, STOP and LAMP when MARCIA -> LOW
{
if (digitalRead(LAMP) == 0 && digitalRead(START) == 0 && digitalRead(CLAX) == 0 && digitalRead(STOP) == 0)
{
ini = 'O';
Wire.beginTransmission (25);
Wire.write (ini);
Wire.endTransmission ();
flag = 0;
}
else
{
ini = 'K';
Wire.beginTransmission (25);
Wire.write (ini);
Wire.endTransmission ();
flag = 0;
}
}
else if (pin == 210)// Check START, CLAX, STOP and LAMP when MARCIA -> HIGH
{
....
Wire.beginTransmission (25);
Wire.write (ini);
Wire.endTransmission ();
ini = 'Z';
flag = 0;
}
else if (pin == 220)
{
if (digitalRead(LAMP) == 1 && digitalRead(START) == 1 && digitalRead(CLAX) == 1 && digitalRead(STOP) == 1)
{
ini = 'O'; // FAIL ALL
}
else
{
ini = 'K';
}
Wire.beginTransmission (25);
Wire.write (ini);
Wire.endTransmission ();
}
}
void monitor_test()
{
if (once == 0)
{
Serial2.write(0x03);
Serial2.write(0x02);
Serial2.write(0x01);
Serial2.write(0x05);
Serial2.write(0xF8);
Serial2.write(0x03);
Serial2.write(0x03);
once = 1;
}
if (once == 1)
{
if (Serial2.available() > 0)
{
dat = Serial2.read();
if (dat == 5)
{
count = 10;
}
if (dat == 255)
{
count = 30;
}
if (count == 11)
{
Model = dat;
BufferMT[0] = Model;
}
if (count == 12)
{
MayorRelease = dat;
BufferMT[1] = MayorRelease;
}
if (count == 13)
{
Release = dat;
}
if (count == 14)
{
MayorReleaseDec = dat;
BufferMT[2] = MayorReleaseDec;
Serial.println(MayorReleaseDec);
}
if (count == 15)
{
Address1 = dat;
BufferMT[3] = Address1;
}
if (count == 16)
{
Address2 = dat;
BufferMT[4] = Address2;
}
if (count == 17)
{
Address3 = dat;
BufferMT[5] = Address3;
}
if (count == 31)
{
Band = dat;
BufferMT[6] = Band;
}
if (count == 32)
{
Channel = dat + 1;
BufferMT[7] = Channel;
//once = 2;
}
if (count == 35)
{
once = 2;
}
}
count = count + 1;
}
if (once == 2)
{
Serial2.write(5);
Serial2.write(2);
Serial2.write(1);
Serial2.write(1);
Serial2.write(252);
Serial2.write(3);
Serial2.write(3);
once = 3;
count = 0;
}
if (once == 3)
{
if (Serial2.available() > 0)
{
dat = Serial2.read();
if (dat == 1)
{
count = 10;
}
if (count == 11)
{
rssi = dat;
BufferMT[8] = rssi;
idx = nearest(rssi, ar, ArrayElementCount(ar));
BufferMT[9] = idx;
}
if (count == 12)
{
AFC = dat;
BufferMT[10] = AFC;
Wire.beginTransmission (25);
Wire.write((byte*)&BufferMT, sizeof(BufferMT));
Wire.endTransmission ();
once = 4;
}
count = count + 1;
}
}
if (once == 4)
{
digitalWrite(A_TEST, HIGH);
delay (500);
}
}
int nearest(int x, int myArray[], int elements)
{
int idx = 0; // by default near first element
int distance = abs(myArray[idx] - x);
for (int i = 1; i < elements; i++)
{
int d = abs(myArray[i] - x);
if (d < distance)
{
idx = i;
distance = d;
}
}
return idx;
}
I have two questions:
- Which is the proper way to power my system using a 9V power supplier and one USB cable (using pins from both Arduinos)?
- How can I make my system work without connecting the slave to the USB of the laptop and without opening the serial monitor?
Thanks