Wifly arduino shield RSSI Vout (signal strength)

Hi,

I have bought a Wifly shield for Arduino (http://www.sparkfun.com/products/9954). I want to read the strength of any Wifi signal in the area to control some LEDs, I noticed that the module incorporates a function called "show RSSI" as it says in the data sheet: http://www.sparkfun.com/datasheets/Wireless/WiFi/WiFlyGSX-um2.pdf.

I can't figure out how to successfully read a value for RSSI (signal strength). Would somebody be able to help me get started with this code?

Most recent library for Wifly: WiFly Shield code library alpha 2 release - SparkFun Electronics Forum.

This library includes three example codes.

Please help!!

Thanks, Darren.

Do you have a serial port connected to the WiFly UART port?

You switch to command mode by sending "$$$". I think you have to send nothing else within one seconds before and one second after.

delay(1000);
WiFly.write("$$");
delay(1000);

If the first thing you get back is not "CMD" then something is wrong.

I voted for the second option, although I'm still not sure if I was right.

Hope that helps.

I voted for the first option, just to be contrary.

Hope that helps.

I was going to vote for the underdog but they are tied at 1 and 1 so I'm going to boycott this poll instead.

Thank you for that.

Using: WiFly.write("$$$"); came up with an error: 'class WiFlyDevice' has no member named write. I replaced it with Serial.write("$$$");.

It returns: <2.23>

My code is attached to this post.

Darren

WiFly_trying_to_read_rssi.pde (646 Bytes)

Actually the code wasn't attached. Here it is:

#include "WiFly.h"
#include "Credentials.h"

void setup()
{
Serial.begin(9600); //initialise serial comms

WiFly.begin(); //initialise WiFly comms

delay(1000);
Serial.write("$$$"); //initialise command mode
delay(1000);
}

void loop(){

delay(100);

Serial.write("show rssi"); //request RSSI value

while(SpiSerial.available()) {
Serial.print(SpiSerial.read(), BYTE);

/* if (WiFly.join(ssid, passphrase)) {
int ch = WiFly.read();
Serial.println(ch);

}
*/
if(Serial.available()) { // Outgoing data
SpiSerial.println(Serial.read(), BYTE);
}
}
}

WiFly_trying_to_read_rssi.pde (646 Bytes)

Serial.write("show rssi");      //request RSSI value

Serial.write() is for binary data. Serial.print() is for strings and for converting numeric types to strings. Why are you using Serial.write() this way?

Using: WiFly.write("$$$"); came up with an error: 'class WiFlyDevice' has no member named write. I replaced it with Serial.write("$$$");.

What is connected to the Serial port? Why didn't you try LCD.write()?

I was using Serial.wite() because I saw someone using it in another post. I'm now using SpiSerial.print() and the comms works with that.

This is a page about troubleshooting using the WiFly shield:

http://forum.sparkfun.com/viewtopic.php?f=32&t=25129

My code is able now to write a series of commands to the WiFly shield in the following order:

  • $$$ (with no carrige return)(this command enters command mode)
  • set wlan ssid BTHub3-Q9Z8
  • set wlan phrase df2387da92
  • join BTHub3-Q9Z8
  • show rssi

It seams to bring back a number for the signal strength (RSSI) but it isn't very consistent and its very slow to respond when I move the shield relative to my wifi router. My code:

#include "WiFly.h" // We use this for the preinstantiated SpiSerial object.
//#include "WiFlySerial.h"

int pos = 0;
int crap = 0;
int rssi_read = 0;
int rssi_val = 0;
long i = 0;

void setup() {

Serial.begin(9600);
Serial.println("SPI UART on WiFly Shield terminal tool");
Serial.println("--------------------------------------");
Serial.println();
Serial.println("This is a tool to help you troubleshoot problems with the WiFly shield.");
Serial.println("For consistent results unplug & replug power to your Arduino and WiFly shield.");
Serial.println("(Ensure the serial monitor is not open when you remove power.)");
Serial.println();

Serial.println("Attempting to connect to SPI UART...");
SpiSerial.begin();
Serial.println("Connected to SPI UART.");
Serial.println();

Serial.println(" * Use $$$ (with no line ending) to enter WiFly command mode. ("CMD")");
Serial.println(" * Then send each command followed by a carriage return.");
Serial.println();

Serial.println("Waiting for input.");
Serial.println();
}

void loop(){
Serial.println("loop");

//void command(){
delay (1000);
SpiSerial.print("$$$"); //enters WiFly's command mode, should return CMD
delay (1000);
Serial.print(SpiSerial.read(), BYTE);

SpiSerial.println("set wlan ssid BTHub3-Q9Z8");
//delay (2000);
Serial.print(SpiSerial.read(), BYTE);

SpiSerial.println("set wlan phrase df2387da92");
//delay (200);
Serial.print(SpiSerial.read(), BYTE);

SpiSerial.println("join BTHub3-Q9Z8");
delay(2000);
Serial.print(SpiSerial.read(), BYTE);
delay(2000);
Serial.print(SpiSerial.read(), BYTE);
delay(2000);

SpiSerial.println("show rssi");
Serial.print(SpiSerial.read(), BYTE);

for(;;){
SpiSerial.println("show rssi");
Serial.print(SpiSerial.read(), BYTE);
}

I based my code on the sample code: SpiUartTerminal.pde

This code gives me a good predictable RSSI reading that dynamically updates when I move the shield relative to my router.

This code can be found here: Troubleshooting the WiFly shield for Arduino - SparkFun Electronics Forum

And here:

/*

SpiUartTerminal - tool to help troubleshoot problems with WiFly shield

This code will initialize and test the SC16IS750 UART-SPI bridge then enable you
to send commands to the WiFly module.

Copyright (c) 2010 SparkFun Electronics. http://sparkfun.com LGPL 3.0

*/

#include "WiFly.h" // We use this for the preinstantiated SpiSerial object.

void setup() {

Serial.begin(9600);
Serial.println("SPI UART on WiFly Shield terminal tool");
Serial.println("--------------------------------------");
Serial.println();
Serial.println("This is a tool to help you troubleshoot problems with the WiFly shield.");
Serial.println("For consistent results unplug & replug power to your Arduino and WiFly shield.");
Serial.println("(Ensure the serial monitor is not open when you remove power.)");
Serial.println();

Serial.println("Attempting to connect to SPI UART...");
SpiSerial.begin();
Serial.println("Connected to SPI UART.");
Serial.println();

Serial.println(" * Use $$$ (with no line ending) to enter WiFly command mode. ("CMD")");
Serial.println(" * Then send each command followed by a carriage return.");
Serial.println();

Serial.println("Waiting for input.");
Serial.println();

}

void loop() {
// Terminal routine

// Always display a response uninterrupted by typing
// but note that this makes the terminal unresponsive
// while a response is being received.
while(SpiSerial.available() > 0) {
Serial.print(SpiSerial.read(), BYTE);
}

if(Serial.available()) { // Outgoing data
SpiSerial.print(Serial.read(), BYTE);
}
}