Pages: [1]   Go Down
Author Topic: Reading a txt file from a server  (Read 742 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Warning I am a beginner programmer and this is my first real arduino project smiley
I have uploaded a txt file containing only an epoch time on a server.
The idea behind my project is that the time is revived by the arduino as a variable and then manipulated to give a countdown from the time downloaded to the current time.

I have used the following code to retrieve the epoch time

Code:
  if (client.connect(server, 80)) {
    // Make a HTTP request:
    client.println("GET /u/9243715/arduino.txt HTTP/1.0") ;
    client.println();

and on the void loop

Code:
  if (client.available()) {
    char k = client.read();
    Serial.print(k);

the problem is that k holds not only the time but also the server header ,
Code:
HTTP/1.1 200 OK
Server: nginx/1.0.14
Date: Sun, 01 Jul 2012 11:22:56 GMT
Content-Type: text/plain; charset=ascii
Connection: close
content-length: 10
x-robots-tag: noindex,nofollow
accept-ranges: bytes
etag: 19n
pragma: public
cache-control: max-age=0

1338646800

Is there a way to remove the header from the variable or transfer only the time to another variable?

Thank you
Yiangos
Logged

Miramar Beach, Florida
Offline Offline
Faraday Member
**
Karma: 147
Posts: 6038
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

You must parse the return from the server at the double cr-lf (blank line). That denotes the end of the header.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

could you help with some code plz?
Logged

Miramar Beach, Florida
Offline Offline
Faraday Member
**
Karma: 147
Posts: 6038
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

The web server code in the IDE examples shows how to read a client request until the blank line. The client puts any POST form data there in a client request to the server.

The server responds with a header separated from the body by a blank line. You can modify that routine to parse the server response. Disregard anything before the blank line.
Logged

0
Offline Offline
Tesla Member
***
Karma: 145
Posts: 9634
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I've used the below to capture a single line by counting the line feeds from the start of the header to the desired line. There is also a "textfinder" library available that waits for a specific string of characters to be encountered to start capturing (good for RSS and large web pages).

Code:
{
  if (client.available()) {
    char c = client.read();
    //Serial.print(c);  // uncomment to see raw feed
    if (c==lf) x=(x+1);
    if (x==14) readString += c;
    //readString += c;
  }
Logged

Consider the daffodil. And while you're doing that, I'll be over here, looking through your stuff.   smiley-cool

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

thank you guys, I tried something different, I used http://bildr.org/2011/06/arduino-ethernet-client/ and added my time between <>

however if i try to display it on my lcd, either by lcd.print(inString);

or
Code:
long k;
k = atol(inString);
lcd.print(k);

The value outputs on serial but not on the lcd. here is my complete code
Code:
//ARDUINO 1.0+ ONLY
//ARDUINO 1.0+ ONLY
#include <Ethernet.h>
#include <SPI.h>
#include <LiquidCrystal.h>
////////////////////////////////////////////////////////////////////////
//CONFIGURE
////////////////////////////////////////////////////////////////////////
byte server[] = { 204,236,227,215 }; //ip Address of the server you will connect to

//The location to go to on the server
//make sure to keep HTTP/1.0 at the end, this is telling it what type of file it is
String location = "/u/9243715/arduino.html HTTP/1.0";
LiquidCrystal lcd(12, 11, 6, 5, 3, 2);
// if need to change the MAC address (Very Rare)
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x14, 0xEC };
////////////////////////////////////////////////////////////////////////
long k;
EthernetClient client;

char inString[32]; // string for incoming serial data
int stringPos = 0; // string index counter
boolean startRead = false; // is reading?

void setup(){
 lcd.begin(20, 4);
  Ethernet.begin(mac);
  Serial.begin(9600);
 
}

void loop(){

  String pageValue = connectAndRead(); //connect to the server and read the output

  Serial.println(pageValue); //print out the findings.

  k = atol (inString);
  lcd.setCursor(1,0);
  lcd.print(k);
  Serial.println(k);
  delay(5000); //wait 5 seconds before connecting again
}

String connectAndRead(){
  //connect to the server

  Serial.println("connecting...");

  //port 80 is typical of a www page
  if (client.connect(server, 80)) {
    Serial.println("connected");
    client.print("GET ");
    client.println(location);
    client.println();

    //Connected - Read the page
    return readPage(); //go and read the output

  }else{
    return "connection failed";
  }

}

String readPage(){
  //read the page, and capture & return everything between '<' and '>'

  stringPos = 0;
  memset( &inString, 0, 32 ); //clear inString memory

  while(true){

    if (client.available()) {
      char c = client.read();

      if (c == '<' ) { //'<' is our begining character
        startRead = true; //Ready to start reading the part
      }else if(startRead){

        if(c != '>'){ //'>' is our ending character
          inString[stringPos] = c;
          stringPos ++;
        }else{
          //got what we need here! We can disconnect now
          startRead = false;
          client.stop();
          client.flush();
          Serial.println("disconnecting.");
          return inString;
         

        }

      }
    }

  }

}

Logged

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

Code:
  Serial.println(pageValue); //print out the findings.
  Serial.println(k);
So, how do you know which value is which?  All you see is two collections of digits appear in the serial monitor.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

that was just a debug to be sure that the inString value has been transferred to the k variable
my problem now is that neither inString or k is displaying on the lcd even though am sure thay are not empty
Logged

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

What I like to do is:
Code:
  Serial.print("pageValue = [");
  Serial.print(pageValue);
  Serial.println("]");
This way, the value is in delimiters, so I can see where it actually starts and ends, and is preceded by an identifier that defines what variable contains the value. No ambiguity at all.

Can you get ANYTHING to display on the LCD?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

if i place in the void setup() lcd.print("helloworld") it displaces but if i place it anywhere in the void loop() it does not
Logged

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

Code:
LiquidCrystal lcd(12, 11, 6, 5, 3, 2);
You don't seem to be aware that the ethernet shield uses pins 11, 12, and 13 to communicate with the Arduino. No wonder the LCD doesn't work after you initialize the Ethernet connection.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

thank you Paul , clearly I wasn't aware of that, the display works perfectly now smiley
Logged

Pages: [1]   Go Up
Jump to: