|
Main Links:
Final Projects
|
Main /
XbeeCodeFromClass
#define sensorPin 0 // input sensor
#define txLed 4 // LED to indicate outgoing data
#define rxLed 3 // LED to indicate incoming data
#define analogLed 9 // LED that will change brightness with incoming value
#define guardTime 1100 // number of ms for the xbee module to switch to
// command mode
#define threshold 10 // how much change you need to see on the sensor
// before sending
int lastSensorReading = 0; // previous state of the sensor
int inByte= -1; // incoming byte from serial RX
char inString[6]; // string for incoming serial data
int stringPos = 0; // string index counter
void setup() {
// configure serial communications:
Serial.begin(9600);
// configure output pins:
pinMode(txLed, OUTPUT);
pinMode(rxLed, OUTPUT);
pinMode (analogLed, OUTPUT);
// set Xbee's destination address:
setDestination();
// blink the TX LED indicating that the main program's about to start:
blink(3);
}
void setDestination() {
// put the radio in command mode:
Serial.print("+++");
// wait for the radio to respond with "OK\r"
char thisByte = 0;
while (thisByte != '\r') {
if (Serial.available() > 0) {
thisByte = Serial.read();
}
}
// set the destination address:
// I was working with two radios when I wrote this,
// so I puit both addresses in and commented one out,
// to make re-programming both modules easier:
// Serial.print("ATDH13A200, DL4008559A, SM0, WR\r"); // <--------------
Serial.print("ATDH13A200, DL4004341B, SM0, WR\r"); // <--------------
// set the command mode timeout to 1 second:
Serial.print("ATCT000A\r");
// get out of command mode:
Serial.print("ATCN\r");
}
// Blink an LED:
void blink(int howManyTimes) {
for (int i=0; i< howManyTimes; i++) {
digitalWrite(txLed, HIGH);
delay(200);
digitalWrite(txLed, LOW);
delay(200);
}
}
void loop() {
// listen for incoming serial data:
if (Serial.available() > 0) {
// turn on the RX LED whenever you're reading data:
digitalWrite(rxLed, HIGH);
handleSerial();
}
else {
// turn off the receive LED when there's no incoming data:
digitalWrite(rxLed, LOW);
}
// listen to the potentiometer:
char sensorValue = readSensor();
// if there's something to send, send it:
if (sensorValue > 0) {
//light the tx LED to say you're sending:
digitalWrite(txLed, HIGH);
Serial.print(sensorValue, DEC );
Serial.print("\r");
// turn off the tx LED:
digitalWrite(txLed, LOW);
}
}
void handleSerial() {
inByte = Serial.read();
// save only ASCII numeric characters (ASCII 0 - 9):
if ((inByte >= '0') && (inByte <= '9')){
inString[stringPos] = inByte;
stringPos++;
}
// if you get an ASCII carriage return:
if (inByte == '\r') {
// convert the string to a number:
int brightness = atoi(inString);
// set the analog output LED:
analogWrite(analogLed, brightness);
// put zeroes in the array
for (int c = 0; c < stringPos; c++) {
inString[c] = 0;
}
// reset the string pointer:
stringPos = 0;
}
}
char readSensor() {
char message = 0;
// read the sensor:
int sensorReading = analogRead(sensorPin);
// look for a change from the last reading
// that's greater than the threshold:
if (abs(sensorReading - lastSensorReading) > threshold) {
message = sensorReading/4;
lastSensorReading = sensorReading;
}
return message;
}
|