Some problems with WiFly

Hi all
The other day I found out I wanted to finaly use the WiFly I bought a couple of months ago. I wanted to use it to turn on and off a LED from a web browser. After digging around for some time and testing out different things I finaly found this page: http://arduino.cc/forum/index.php/topic,6595.0.html
It was perfect for what I wanted to achieve so I copied the sketch and modifyed it to work with my WiFly. The problem I run in to is that I cant get it to send response back to the browser. I had to change every server.print line with Serial.println to even manage to compile it but when I did that it works but only sends info to serial monitor. Here are the the modified code I use

/*
 Arduino Data Web Server

 Performs actions on Arduino and/or returns data from Arduino to a webbrowser request URL:
  - To turn on LED on pin 8, use web browser to visit your Arduino via: http://x.x.x.x/digitalWrite/7/1
  - To turn it off send: http://x.x.x.x/digitalWrite/7/0
  - To read analog0 value, send: http://x.x.x.x/analogRead/0

 IMPORTANT:
 Commands are case sensitive, but I wrote this as simple as possible so it can be easily adapted to your needs.  
 Have fun!

 created Sept 17, 2010
 by Hari Wiguna, g33k.blogspot.com
*/

//#include "Streaming"
#include <SPI.h>
//#include <Ethernet.h>
#include <string.h>
#include "WiFly.h"
#include "Credentials.h"
#include <SoftwareSerial.h>
SoftwareSerial SerialRNXV(2, 3);

// MAC address can be anything that is unique within your network.
// IP is the address the Arduino Ethernet Card would respond to.  It needs to be an unused address within your network.
//byte mac[] = {0x00, 0x1E, 0x2A, 0x77, 0x24, 0x02 };
//byte ip[] = {192,168,7,12 }; // This is typically 10.0.0.x

WiFlyServer server(882); // Port 80 is http.

//-- Commands and parameters (sent by browser) --
char cmd[15];    // Nothing magical about 15, increase these if you need longer commands/parameters
char param1[15];
char param2[15];

//-- Sample Ports ---
void SetupSamplePorts()
{
  // To illustrate how to use this, I have an LED and a Potentiometer.
  // The 10K potentiometer left lead is connected to GND, right lead to +5V, and middle lead to Analog 0.
  // The LED cathode is on digital pin 7 and anode is on pin 8.
  pinMode(7,OUTPUT); digitalWrite(7,LOW);  // I use this pin as GND for the LED.
  pinMode(8,OUTPUT); // Sample output, unable to use built-in LED at pin 13 because Ethernet Shield uses pins 10,11,12,13.
}

void setup()
{
  //Ethernet.begin(mac, ip);
  //server.begin();

  //Serial.begin(57600);
    Serial.begin(9600);
    SerialRNXV.begin(9600);
  
    WiFly.setUart(&SerialRNXV);
    Serial.println("begin"); 
  
   WiFly.begin();
   Serial.println("began");
 
   if (!WiFly.join(ssid, passphrase)) {
   Serial.println("Association failed.");
   while (1) {
   // Hang on failure.
   }
 }
 
    //Serial.println("IP: ");
    //Serial.println(WiFly.ip());
 
 //pinMode(ledPin,OUTPUT);
 server.begin(); // begin the server
 
 //Serial.begin(9600);
 Serial.println(" ** Beginning Server ** ");
 Serial.print("IP: ");
 Serial.println(WiFly.ip());
 
 server.begin();
 
 Serial.println("Ready for commands");
 //digitalWrite(ledPin, HIGH);
  
  
  
  SetupSamplePorts();
}

#define bufferMax 128
int bufferSize;
char buffer[bufferMax];

void loop()
{
  WiFlyClient client = server.available();
  if (client)
  {
    WaitForRequest(client);
    ParseReceivedRequest();
    PerformRequestedCommands();
    
    client.stop();
  }
}

void WaitForRequest(WiFlyClient client) // Sets buffer[] and bufferSize
{
  bufferSize = 0;
 
  while (client.connected()) {
    if (client.available()) {
      char c = client.read();
      if (c == '\n')
        break;
      else
        if (bufferSize < bufferMax)
          buffer[bufferSize++] = c;
        else
          break;
    }
  }
  
  PrintNumber("bufferSize", bufferSize);
}

void ParseReceivedRequest()
{
  Serial.println("in ParseReceivedRequest");
  Serial.println(buffer);
  
  //Received buffer contains "GET /cmd/param1/param2 HTTP/1.1".  Break it up.
  char* slash1;
  char* slash2;
  char* slash3;
  char* space2;
  
  slash1 = strstr(buffer, "/") + 1; // Look for first slash
  slash2 = strstr(slash1, "/") + 1; // second slash
  slash3 = strstr(slash2, "/") + 1; // third slash
  space2 = strstr(slash2, " ") + 1; // space after second slash (in case there is no third slash)
  if (slash3 > space2) slash3=slash2;

  PrintString("slash1",slash1);
  PrintString("slash2",slash2);
  PrintString("slash3",slash3);
  PrintString("space2",space2);
  
  // strncpy does not automatically add terminating zero, but strncat does! So start with blank string and concatenate.
  cmd[0] = 0;
  param1[0] = 0;
  param2[0] = 0;
  strncat(cmd, slash1, slash2-slash1-1);
  strncat(param1, slash2, slash3-slash2-1);
  strncat(param2, slash3, space2-slash3-1);
  
  PrintString("cmd",cmd);
  PrintString("param1",param1);
  PrintString("param2",param2);
}

void PerformRequestedCommands()
{
  if ( strcmp(cmd,"digitalWrite") == 0 ) RemoteDigitalWrite();
  if ( strcmp(cmd,"analogRead") == 0 ) RemoteAnalogRead();
}

void RemoteDigitalWrite()
{
  int ledPin = param1[0] - '0'; // Param1 should be one digit port
  int ledState = param2[0] - '0'; // Param2 should be either 1 or 0
  digitalWrite(ledPin, ledState);
 
  //-- Send response back to browser --
  Serial.println("D");
  Serial.println(ledPin, DEC);
  Serial.println(" is ");
  Serial.println( (ledState==1) ? "ON" : "off" );

  //-- Send debug message to serial port --
  Serial.println("RemoteDigitalWrite");
  PrintNumber("ledPin", ledPin);
  PrintNumber("ledState", ledState);
}

void RemoteAnalogRead()
{
  // If desired, use more server.print() to send http header instead of just sending the analog value.
  int analogPin = param1[0] - '0'; // Param1 should be one digit analog port
  int analogValue = analogRead(analogPin);
  
  //-- Send response back to browser --
  Serial.print("A");
  Serial.println(analogPin, DEC);
  Serial.println(" is ");
  Serial.println(analogValue,DEC);
  
  //-- Send debug message to serial port --
  Serial.println("RemoteAnalogRead");
  PrintNumber("analogPin", analogPin);
  PrintNumber("analogValue", analogValue);
}

void PrintString(char* label, char* str)
{
  Serial.print(label);
  Serial.print("=");
  Serial.println(str);
}

void PrintNumber(char* label, int number)
{
  Serial.print(label);
  Serial.print("=");
  Serial.println(number, DEC);
}

Anybody know what I'm doing wrong?

Trond

Anybody know what I'm doing wrong?

Here's a clue:

I had to change every server.print line with Serial.println to even manage to compile it but when I did that it works but only sends info to serial monitor.

Why did you do that?

I did that because when I had server.print I wasnt able to upload the sketch. When I changed it to serial.println I could at least upload it and turn the LED on and of from the browser.

Trond

BTW, here are the error I get

WEBLEDTEST.ino: In function 'void RemoteDigitalWrite()':
WEBLEDTEST:176: error: 'class WiFlyServer' has no member named 'print'

I'm pretty new to this so for the most part I just copy and past and are happy when somethigs works :slight_smile:

Trond

I'm pretty new to this so for the most part I just copy and past and are happy when somethigs works

It's far more important to learn why something doesn't work, though.

The link you posted was to code running on the Arduino with Ethernet shield, not a WiFly shield.

Where did you get the WiFly library? Did it not come with examples?

It's far more important to learn why something doesn't work, though.

I know. But its more fun to try to learn when I can du something useful.

I know it was running on arduino with Ethernet shield but I dont have an Ethernet shield. All I have is a WiFly. Maby I should just get the ethernet shield and save me the trouble with the WiFly.

Trond