Go Down

Topic: Ethernet + SD + Ajax + IR (Read 735 times) previous topic - next topic

lonG

Hello,

I was tried control my air conditioning by a webserver using Ethernet Shield but I've been with problem relative the infrared (I think).
My webpage is saved in SD card together with data to control the air and used one physical button to trigger the option to turn on and to change the state in webpage I used AJAX (I know that isn't necessary to this case, but I'll the a lamp control)
The page with ajax is OK (fist part) and read the data in SD card and turn on AIR also (second part) but my problem is when I join parties.. When I include the library iRremote, the Ajax stop and I can't change the state of the button (stop all)

Any ideas why?

Code: [Select]
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
#include <IRremote.h> // here the problem!!!

// size of buffer used to capture HTTP requests
#define REQ_BUF_SZ   40

// MAC address from Ethernet shield sticker under board
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 0, 20); // IP address, may need to change depending on network
EthernetServer server(80);  // create a server at port 80
File webFile;
File myFile;
//IRsend irsend;
char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated string
char req_index = 0;              // index into HTTP_req buffer

void setup()
{
    // disable Ethernet chip
    pinMode(10, OUTPUT);
    digitalWrite(10, HIGH);
   
    Serial.begin(9600);       // for debugging
   
    // initialize SD card
    Serial.println("Initializing SD card...");
    if (!SD.begin(4)) {
        Serial.println("ERROR - SD card initialization failed!");
        return;    // init failed
    }
    Serial.println("SUCCESS - SD card initialized.");
    // check for index.htm file
    if (!SD.exists("ajax.htm")) {
        Serial.println("ERROR - Can't find ajax.htm file!");
        return;  // can't find index file
    }
    Serial.println("SUCCESS - Found ajax.htm file.");
    pinMode(7, INPUT);        // switch is attached to Arduino pin 3
   
    Ethernet.begin(mac, ip);  // initialize Ethernet device
    server.begin();           // start to listen for clients
}

void loop()
{
    EthernetClient client = server.available();  // try to get client

    if (client) {  // got client?
        boolean currentLineIsBlank = true;
        while (client.connected()) {
            if (client.available()) {   // client data available to read
                char c = client.read(); // read 1 byte (character) from client
                // buffer first part of HTTP request in HTTP_req array (string)
                // leave last element in array as 0 to null terminate string (REQ_BUF_SZ - 1)
                if (req_index < (REQ_BUF_SZ - 1)) {
                    HTTP_req[req_index] = c;          // save HTTP request character
                    req_index++;
                }
                // last line of client request is blank and ends with \n
                // respond to client only after last line received
                if (c == '\n' && currentLineIsBlank) {
                    // send a standard http response header
                    client.println("HTTP/1.1 200 OK");
                    client.println("Content-Type: text/html");
                     client.println("Connection: keep-alive");
                    client.println();
                    // Ajax request
                    if (StrContains(HTTP_req, "ajax_switch")) {
                        // read switch state and send appropriate paragraph text
                        GetSwitchState(client);
                    }
                    else {  // web page request
                        // send web page
                        webFile = SD.open("ajax.htm");        // open web page file
                        if (webFile) {
                            while(webFile.available()) {
                                client.write(webFile.read()); // send web page to client
                            }
                            webFile.close();
                        }
                    }
                    // display received HTTP request on serial port
                    Serial.println(HTTP_req);
                    // reset buffer index and all buffer elements to 0
                    req_index = 0;
                    StrClear(HTTP_req, REQ_BUF_SZ);
                    break;
                }
                // every line of text received from the client ends with \r\n
                if (c == '\n') {
                    // last character on line of received text
                    // starting new line with next character read
                    currentLineIsBlank = true;
                }
                else if (c != '\r') {
                    // a text character was received from client
                    currentLineIsBlank = false;
                }
            } // end if (client.available())
        } // end while (client.connected())
        delay(1);      // give the web browser time to receive the data
        client.stop(); // close the connection
    } // end if (client)
}

// send the state of the switch to the web browser
void GetSwitchState(EthernetClient cl)
{
    if (digitalRead(7)) {
        cl.println("Switch state: ON");
        readSD();
    }
    else {
        cl.println("Switch state: OFF");
    }
}

// sets every element of str to 0 (clears array)
void StrClear(char *str, char length)
{
    for (int i = 0; i < length; i++) {
        str[i] = 0;
    }
}

// searches for the string sfind in the string str
// returns 1 if string found
// returns 0 if string not found
char StrContains(char *str, char *sfind)
{
    char found = 0;
    char index = 0;
    char len;

    len = strlen(str);
   
    if (strlen(sfind) > len) {
        return 0;
    }
    while (index < len) {
        if (str[index] == sfind[found]) {
            found++;
            if (strlen(sfind) == found) {
                return 1;
            }
        }
        else {
            found = 0;
        }
        index++;
    }

    return 0;
}

void readSD(){
  int linha = 0;
  unsigned long linhaEspec = 851 * linha;
  Serial.println(linhaEspec);
 
  myFile = SD.open("AR3.txt");
 
  if(myFile){
    myFile.seek(linhaEspec);
   
    char caracter;
    unsigned int aux[198];
    String str = "";
    int laco = 0;

    for(int i=0; i <= 848; i++){
      caracter = myFile.read();
      if(caracter != ','){
        str.concat(caracter);
      }
      else{
        aux[laco] = str.toInt();
        laco++;
        str = "";
      }
    }
    myFile.close();
    //irsend.sendRaw(aux,200,38);
  }
}


Code: [Select]
<!DOCTYPE html>
<html>
    <head>
        <title>Arduino SD Card Web Page using Ajax</title>
        <script>
        function GetSwitchState()
        {
            nocache = "&nocache=" + Math.random() * 1000000;
            var request = new XMLHttpRequest();
            request.onreadystatechange = function()
            {
                if (this.readyState == 4) {
                    if (this.status == 200) {
                        if (this.responseText != null) {
                            document.getElementById("switch_txt").innerHTML = this.responseText;
                        }
                    }
                }
            }
            request.open("GET", "ajax_switch" + nocache, true);
            request.send(null);
            setTimeout('GetSwitchState()', 1000);
        }
    </script>
    </head>
    <body onload="GetSwitchState()">
        <h1>Arduino Switch State from SD Card Web Page using Ajax</h1>
        <p id="switch_txt">Switch state: Not requested...</p>
    </body>
</html>

AnalysIR

Do some  (re)searching about timer and pin conflicts between the various libraries.

IRLib may be a better choice for you than IRremote, but you will still need to do the  above & read the documentation provided on how the latest version can circumvent these types of issues.
Visit our Blog about Infrared Remote Control >>>> http://www.AnalysIR.com/blog/  Twitter: @AnalysIR
First Read this PDF=> 10 common pitfalls with Infrared Remote Control >>> http://bit.ly/1cvd0at

PaulS

Code: [Select]
                        if (webFile) {
                            while(webFile.available()) {
                                client.write(webFile.read()); // send web page to client
                            }
                            webFile.close();
                        }

This is crap. This will REALLY slow your page transfer down. Do NOT call client.write() with the ONE character that webFile.read() read.

The read() method is overloaded to fill an array, and return the number of bytes read. The write() method is overloaded to write an array of bytes, given a length. Make us of that to stop sending 512 byte packets containing 1 byte of payload.

Each file that you open requires a 512 byte buffer. You only have 4 times that much SRAM. Between the SD card buffers, all the string literals that are not wrapped in the F() macro, and pissing away resources on the String class, you just might be running out of memory.

lonG

How can I correct lack of memory?

PaulS

Quote
How can I correct lack of memory?

I knew that at one time, but I seem to have forgotten. Lack of memory, I guess.

The only solutions are to quit wasting it or to use an Arduino with more of it.

lonG

I noticed that when I try to use the SD and IRremote libraries ends up giving problem, there is some incompatibility between them (maybe relative to the pins)?

AnalysIR

You may get more help if you:

1. respond to earlier posts/suggestions
2. list the pins used for various libraries or post a circuit
3. Let us know what steps you have taken to test or eliminate the various libraries.

.....
Visit our Blog about Infrared Remote Control >>>> http://www.AnalysIR.com/blog/  Twitter: @AnalysIR
First Read this PDF=> 10 common pitfalls with Infrared Remote Control >>> http://bit.ly/1cvd0at

lonG

I still can't use the IRlib in my project, at least not with a/c. For the project I was only using pin 3 (to send the IR signal), pin 4 (SD) and pin 10 (ethernet)

PaulS

Quote
For the project I was only EXPLICITLY using pin 3 (to send the IR signal), pin 4 (SD) and pin 10 (ethernet)

You may not be aware that you are also using pins 11, 12, and 13 (SPI).

It's time to post your code again, and summarize what problems you are still having.

Go Up