Pages: [1]   Go Down
Author Topic: multiple variables to processing  (Read 731 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 10
student/human
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi, I have an array of data from 6 PIR sensors and I want to use their states (HIGH/LOW) in a processing sketch.  Can someone point me in the direction of a forum topic or tutorial for a simplistic method of sending multiple variables to processing from sensors that are giving all similar values (I dont know how to differentiate between each of the 6 sensors).
Thanks

code on the arduino end is
Code:
#define SIZE 6

int relay[SIZE] = { 
  8, 9, 10, 11, 12, 13 };                                    // output digital pins to solid state relays  (120VAC LIGHTS)
int pir[SIZE] = { 
  2, 3, 4, 5, 6, 7 };                                           // input digital pins from Parallax PIR sensor
int time= 20000;                                               //length to stay on after sensor is triggered

unsigned long startTime[SIZE ] = { 
  0,0,0,0,0,0 };                                                // time relay switched ON
unsigned long duration[SIZE ] = {
  time, time, time, time, time, 20000  };               // for how long in milli-seconds (note this is minimum time)

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

  for (int i=0; i < SIZE; i++)
  {
    pinMode(relay[i], OUTPUT);       //set digital pins for relays as output
    pinMode(pir[i], INPUT);              //set digital pins for PIRs as input
  }
}

void loop()
{
  for (int i =0; i<SIZE; i++)
  {

    if (digitalRead(pir[i]) == HIGH)               // check PIR state
    {
      digitalWrite(relay[i], HIGH);                // switch relay ON if HIGH state
      startTime[i] = millis();
      Serial.print(digitalRead(pir[i]));      // SOMETHING IN HERE TO PROCESSING....?
      Serial.print(",");
    }

    if((millis() - startTime[i]) >= duration[i])

    {
      digitalWrite(relay[i], LOW); // switch relay OFF after x
    }
  }

}


Logged

km
leelanau lab

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 653
Posts: 50888
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

If you sent a start and/or end marker (or both) to delineate the start and end of each packet, you would have no trouble telling that the first value after the start of packet marker was for the first sensor, etc.

You could even count values received between the start and end of packet markers was correct before using any values.

Finally, since you are only sending 6 bits of information (a sensor is either HIGH or LOW), you could pack them all into one byte (using bitSet() or bitWrite()), and send just one byte containing all 6 values. No need parse anything then. Use bit-shifting and/or bit masking on the Processing side to extract the individual values.
Logged

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 360
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

If you just want to use the high/low value, you could do something like this:

Code:
// assuming your high/low state is saved in an array of booleans, and is updated regularly:
bool data[6];

void sendData() {
  uint8_t toSend = 0;
  for (uint8_t i = 0; i < 6; i++) {
    toSend |= data[i] << i;
  }
  Serial.write(toSend);
}

and receive as a single unsigned char:

Code:
unsigned char recv = Serial.read();
boolean data[6];
for (int i = 0; i < data.length; i++) {
  data[i] = recv & (1 << i);
}

That way you don't need start/end markers, since it all fits into a single byte.
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 83
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I just got done writing a library that reads and writes messages encapsulated in envelopes.

It uses messages of the format (C) or (C,123,123,...) where C is a message type identifier.

I think you can apply this to your code, maybe. Disclaimer, I used the Serial class from Processing.

I've uploaded the code to my website where I'll keep it for probably a year or so until I figure nobody else is going to find it.

The pertinent code to your project is:
+ in the Arduino folder, where I have the library plus a library it relies on, and an example
+ in the Java folder, in the comms package. The Dashboard class in the uwheel package implements the MessageHandler interface, and responds to both a single-item command plus a command with parameters and therefore is a good example of how to use this.

It should be pretty easy to use this code in your Processing project since Processing is in Java. You'll just have to figure out how to install the comms package as a library in Processing (maybe remove the package declarations), then implement MessageHandler.

In case you are a beginner: Start with Dashboard.java and the Arduino example. You shouldn't need to touch much else, since I have tested both sides.

http://johnmchilton.com/media/uwheel_src.zip
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 83
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Upon inspection, it appears this is probably overkill for whatever you're doing, but there it is anyway.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 10
student/human
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Thanks Everyone!  That's great, I'll try it out. I really appreciate the help.

Keenan
Logged

km
leelanau lab

Pages: [1]   Go Up
Jump to: