Sending multiple analog signals over xbees to control relays. HELP

HI Everyone

Can anyone please help I'm fairly new to arduinos i'm trying to send multiple analog signals between arduinos via xbees, i have the xbees communicating, i can send char values between xbees and see it working in X-CTU. Does anyone know of any examples that could help write the code for multiple analog signals to turn on relays or of any good books that explain in detail each individual would help. I'm just unsure of how to send multiple signals with some sort of identifier or identify which signal is which on the receiving arduino. I've tried looking through the references but im stuck as the information is vague.

THANK YOU.

sketch_111.ino (183 Bytes)

sketch_222.ino (133 Bytes)

Post your code.
Use code tags.

SEND

int val1, val2;

void setup(){

Serial.begin(9600);
}

void loop(){

Val1 = analogRead(A1);
Val2 = analogRead(A2);

Serial.write(val1, BYTE);
Serial.write(val2, BYTE);
delay(150);
}

RECEIVE

int relay = 13;
void setup() {

Serial.begin(9600);
pinMode (13, OUTPUT);

delay(1000);
}

void loop() {
if (Serial.available() > O)

Im stuck after what ive got here :frowning:

What part of "use code tabs" was the difficult part?

The receive bit is looking a bit incomplete.
At the transmit end, an "int" is two bytes long.
What does Serial.write(val1, BYTE); do?

sorry don't know what a code tag is so that would probably make it a little difficult :slight_smile: and though it would declare it as a byte. I'm very new to programming and just after some good sources of information on arduino code and how to structure code and what data types to use for what ever im trying to send. I've been searching for a few days and just cant seam to find any info on sending and identifying which signals are which or how to send analog correctly. thanks

Imagine you asked me to communicate to you two streams of numbers.
Your scheme set out above involves me just reading out a stream of digits.
Imagine how hard it's going to be for you to decide which digit belongs to which data set.

Now imagine me saying something like "channel A" then a stream of digits, then "channel B" and another stream of digits.

i understand what you mean but how do i put on the tag saying x axis is channel A and y axis is channel b. then once ive done that on the receiving end how i take channel a and store that value ready to use. eg say when value is above a certain level do this thanks

sorry don't know what a code tag is so that would probably make it a little difficult

You failed to read #7 below:

http://forum.arduino.cc/index.php/topic,148850.0.html

Test code that minimizes transmitting unneeded data. This is for servo control, but may be applicable to your setup.

TX

//zoomkat multi pot/servo test 3-23-13
//includes dead band for testing and limit servo hunting
//view output using the serial monitor

#include <Servo.h> 
Servo myservo1;  //declare servos
Servo myservo2;
Servo myservo3;
Servo myservo4;
Servo myservo5;

int potpin1 = 0;  //analog input pin A0
int potpin2 = 1;
int potpin3 = 2;
int potpin4 = 3;
int potpin5 = 4;

int newval1, oldval1;  //pot input values
int newval2, oldval2;
int newval3, oldval3;
int newval4, oldval4;
int newval5, oldval5;

void setup() 
{
  Serial.begin(9600);  
  myservo1.attach(2);  
  myservo2.attach(3);
  myservo3.attach(4);
  myservo4.attach(5);
  myservo5.attach(6);
  Serial.println("testing multi pot servo");  
}

void loop()
{ 
  newval1 = analogRead(potpin1);           
  newval1 = map(newval1, 0, 1023, 0, 179); 
  if (newval1 < (oldval1-2) || newval1 > (oldval1+2)){ //dead band 
    myservo1.write(newval1); //position the servo
    Serial.print(newval1); //print the new value for testing 
    Serial.print("a,");
    oldval1=newval1; //set the current old value
  }

  newval2 = analogRead(potpin2);
  newval2 = map(newval2, 0, 1023, 0, 179);
  if (newval2 < (oldval2-2) || newval2 > (oldval2+2)){  
    myservo2.write(newval2);
    Serial.print(newval2);
    Serial.print("b,");
    oldval2=newval2;
  }

  newval3 = analogRead(potpin3);           
  newval3 = map(newval3, 0, 1023, 0, 179); 
  if (newval1 < (oldval1-2) || newval3 > (oldval3+2)){  
    myservo1.write(newval3);
    Serial.print(newval3);
    Serial.print("c,");
    oldval3=newval3;
  }

  newval4 = analogRead(potpin4);           
  newval4 = map(newval4, 0, 1023, 0, 179); 
  if (newval1 < (oldval1-2) || newval4 > (oldval4+2)){  
    myservo1.write(newval4);
    Serial.print(newval4);
    Serial.print("d,");
    oldval4=newval4;
  }

  newval5 = analogRead(potpin5);           
  newval5 = map(newval5, 0, 1023, 0, 179); 
  if (newval1 < (oldval5-2) || newval5 > (oldval5+2)){  
    myservo1.write(newval5);
    Serial.print(newval5);
    Serial.print("e,");
    oldval5=newval5;
  } 
  delay(50);  //to slow loop for testing, adjust as needed
}

RX

//zoomkat 11-22-12 simple delimited ',' string parse 
//from serial port input (via serial monitor)
//and print result out serial port
//multi servos added 

String readString;
#include <Servo.h> 
Servo myservoa, myservob, myservoc, myservod, myservoe;  // create servo object to control a servo 

void setup() {
  Serial.begin(9600);

  //myservoa.writeMicroseconds(1500); //set initial servo position if desired

  myservoa.attach(6);  //the pin for the servoa control
  myservob.attach(7);  //the pin for the servob control
  myservoc.attach(8);  //the pin for the servoc control
  myservod.attach(9);  //the pin for the servod control 
  myservod.attach(10);  //the pin for the servoe control 
  Serial.println("multi-servo-delimit-test-dual-input-11-22-12"); // so I can keep track of what is loaded
}

void loop() {

  //expect single strings like 700a, or 1500c, or 2000d,
  //or like 30c, or 90a, or 180d,
  //or combined like 30c,180b,70a,120d,

  if (Serial.available())  {
    char c = Serial.read();  //gets one byte from serial buffer
    if (c == ',') {
      if (readString.length() >1) {
        Serial.println(readString); //prints string to serial port out

        int n = readString.toInt();  //convert readString into a number

        // auto select appropriate value, copied from someone elses code.
        if(n >= 500)
        {
          Serial.print("writing Microseconds: ");
          Serial.println(n);
          if(readString.indexOf('a') >0) myservoa.writeMicroseconds(n);
          if(readString.indexOf('b') >0) myservob.writeMicroseconds(n);
          if(readString.indexOf('c') >0) myservoc.writeMicroseconds(n);
          if(readString.indexOf('d') >0) myservod.writeMicroseconds(n);
          if(readString.indexOf('e') >0) myservoe.writeMicroseconds(n);
        }
        else
        {   
          Serial.print("writing Angle: ");
          Serial.println(n);
          if(readString.indexOf('a') >0) myservoa.write(n);
          if(readString.indexOf('b') >0) myservob.write(n);
          if(readString.indexOf('c') >0) myservoc.write(n);
          if(readString.indexOf('d') >0) myservod.write(n);
          if(readString.indexOf('e') >0) myservoe.write(n);
        }
         readString=""; //clears variable for new input
      }
    }  
    else {     
      readString += c; //makes the string readString
    }
  }
}