thomasz_05
Published

web_server_IO_Sd_fliip_Swich

This project allows you to control 6 digital pins of Arduino Uno with a simple HTTP web interface

AdvancedWork in progress246
web_server_IO_Sd_fliip_Swich

Things used in this project

Story

Read more

Code

CODE Arduino

Arduino
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
//dimensione del buffer utilizzato per acquisire le richieste HTTP
#define REQ_BUF_SZ   60

// Indirizzo MAC per lo Ethernet shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 59); // indirizzo IP dell'arduino
EthernetServer server(80);  // creare un server sulla porta 80
File webFile;               // il file della pagina web sulla scheda SD
char HTTP_req[REQ_BUF_SZ] = {0}; //richiesta HTTP memorizzata nel buffer come stringa terminata da null
char req_index = 0;              // index nel buffer HTTP_req
boolean LED_state[6] = {0};      // memorizza gli stati dei LED

void setup()
{
     // disabilitare il chip Ethernet
    pinMode(10, OUTPUT);
    digitalWrite(10, HIGH);
    
    Serial.begin(9600);       // per il debug
    
    // inizializza la scheda SD
    Serial.println("Inizializzazione della scheda SD...");
    if (!SD.begin(4)) {
        Serial.println("ERRORE - Inizializzazione della scheda SD non riuscita!");
        return;    // init fallito
    }
    Serial.println("SUCCESSO - Scheda SD inizializzata.");
    // check for index.htm file
    if (!SD.exists("index.htm")) {
        Serial.println("ERRORE - Impossibile trovare il file index.htm!");
        return;  // non riesco a trovare il file index
    }
    Serial.println("SUCCESS - Found index.htm file.");
    
    pinMode(3, OUTPUT);// LED1 
    pinMode(5, OUTPUT);// LED2
    pinMode(6, OUTPUT);// LED3
    pinMode(7, OUTPUT);// LED4
    pinMode(8, OUTPUT);// LED5
    pinMode(9, OUTPUT);// LED6
    
    Ethernet.begin(mac, ip);  //  inizializza il dispositivo Ethernet
    server.begin();           // inizia ad ascoltare i client
    Serial.print("il server è sul ip:   "); //da la ip su cui è il server
    Serial.println(Ethernet.localIP());
}

void loop()
{
    EthernetClient client = server.available();  // prova a ottenere il client
    if (client) {  // got client?
        boolean currentLineIsBlank = true;
        while (client.connected()) {
            if (client.available()) {   // dati del client disponibili per la lettura
                char c = client.read(); // legge 1 byte (carattere) dal client
                // limitare la dimensione della richiesta HTTP ricevuta memorizzata
                // buffer della prima parte della richiesta HTTP nell'array HTTP_req (stringa)
                // lasciare l'ultimo elemento nell'array come 0 su null terminate string (REQ_BUF_SZ - 1)
                
                if (req_index < (REQ_BUF_SZ - 1)) {
                    HTTP_req[req_index] = c;          // salva il carattere di richiesta HTTP
                    req_index++;
                }
                // l'ultima riga della richiesta del client è vuota e termina con \ n
                // risponde al client solo dopo l'ultima riga ricevuta
                if (c == '\n' && currentLineIsBlank) {
                    // invia un'intestazione di risposta http standar
                    client.println("HTTP/1.1 200 OK");
                    // il resto dell'intestazione segue di seguito, a seconda di if
                    // è richiesta la pagina web o la pagina XML
                    // Richiesta Ajax - invia file XML
                    if (StrContains(HTTP_req, "ajax_inputs")) {
                        // invia il resto dell'intestazione HTTP
                        client.println("Content-Type: text/xml");
                        client.println("Connection: keep-alive");
                        client.println();
                        SetLEDs();
                        // invia file XML contenente gli stati di LEDs
                        XML_response(client);
                    }
                    else {  // richiesta della pagina web
                        // invia il resto dell'intestazione HTTP
                        client.println("Content-Type: text/html");
                        client.println("Connection: keep-alive");
                        client.println();
                        // invia pagina web
                        webFile = SD.open("index.htm");        // apri il file su Sd della pagina web
                        if (webFile) {
                            while(webFile.available()) {
                                client.write(webFile.read()); // invia la pagina web al client
                            }
                            webFile.close();
                        }
                    }
                    // visualizza la richiesta HTTP ricevuta sulla porta seriale
                    Serial.print(HTTP_req);
                    // reimposta l'indice del buffer e tutti gli elementi del buffer a 0
                    req_index = 0;
                    StrClear(HTTP_req, REQ_BUF_SZ);
                    break;
                }
                // ogni riga di testo ricevuta dal client termina con \ r \ n
                if (c == '\n') {
                    // ultimo carattere sulla riga del testo ricevuto
                    // inizia una nuova riga con il carattere successivo letto
                    currentLineIsBlank = true;
                } 
                else if (c != '\r') {
                    // è stato ricevuto un carattere di testo dal client
                    currentLineIsBlank = false;
                }
            } // finine if (client.available())
        } // finine while (client.connected())
        delay(1);      // dare al browser web il tempo di ricevere i dati
        client.stop(); // chiudere la connessione
    } // fine if (client)
}

// controlla se la richiesta HTTP ricevuta sta accendendo / spegnendo i LED
// salva anche lo stato dei LED
void SetLEDs(void)
{
  // LED 1 (pin 3)
    if (StrContains(HTTP_req, "LED1=1")) {
        LED_state[0] = 1;  //salva lo stato del LED1
        digitalWrite(3, HIGH);
    }
    else if (StrContains(HTTP_req, "LED1=0")) {
        LED_state[0] = 0;  //salva lo stato del LED1
        digitalWrite(3, LOW);
    }
    // LED 2 (pin 5)
    if (StrContains(HTTP_req, "LED2=1")) {
        LED_state[1] = 1;  //salva lo stato del LED2
        digitalWrite(5, HIGH);
    }
    else if (StrContains(HTTP_req, "LED2=0")) {
        LED_state[1] = 0;  //salva lo stato del LED2
        digitalWrite(5, LOW);
    }
    // LED 3 (pin 6)
    if (StrContains(HTTP_req, "LED3=1")) {
        LED_state[2] = 1;  //salva lo stato del LED3
        digitalWrite(6, HIGH);
    }
    else if (StrContains(HTTP_req, "LED3=0")) {
        LED_state[2] = 0;  //salva lo stato del LED3
        digitalWrite(6, LOW);
    }
    // LED 4 (pin 7)
    if (StrContains(HTTP_req, "LED4=1")) {
        LED_state[3] = 1;  //salva lo stato del LED4
        digitalWrite(7, HIGH);
    }
    else if (StrContains(HTTP_req, "LED4=0")) {
        LED_state[3] = 0;  //salva lo stato del LED4
        digitalWrite(7, LOW);
    }
    // LED 5 (pin 8)
    if (StrContains(HTTP_req, "LED5=1")) {
        LED_state[4] = 1;  //salva lo stato del LED5
        digitalWrite(8, HIGH);
    }
    else if (StrContains(HTTP_req, "LED5=0")) {
        LED_state[4] = 0;  //salva lo stato del LED5
        digitalWrite(8, LOW);
    }
    // LED 6 (pin 9)
    if (StrContains(HTTP_req, "LED6=1")) {
        LED_state[5] = 1;  //salva lo stato del LED6
        digitalWrite(9, HIGH);
    }
    else if (StrContains(HTTP_req, "LED6=0")) {
        LED_state[5] = 0;  // salva lo stato del LED6
        digitalWrite(9, LOW);
    }
}

// inviare il file XML con lo stato del LED
void XML_response(EthernetClient cl)
{
    int count;                 //usato dai cicli "for"
    
    cl.print("<?xml version = \"1.0\" ?>");
    cl.print("<inputs>");
     // LED1
    cl.print("<LED>");
    if (LED_state[0]) {
        cl.print("checked");
    }
    else {
        cl.print("unchecked");
    }
    cl.println("</LED>");
    
    // LED2
    cl.print("<LED>");
    if (LED_state[1]) {
        cl.print("checked");
    }
    else {
        cl.print("unchecked");
    }
     cl.println("</LED>");
    
    // LED3
    cl.print("<LED>");
    if (LED_state[2]) {
        cl.print("checked");
    }
    else {
        cl.print("unchecked");
    }
    cl.println("</LED>");
    
    // LED4
    cl.print("<LED>");
    if (LED_state[3]) {
        cl.print("checked");
    }
    else {
        cl.print("unchecked");
    }
    cl.println("</LED>");
    
    // LED5
    cl.print("<LED>");
    if (LED_state[4]) {
        cl.print("checked");
    }
    else {
        cl.print("unchecked");
    }
    cl.println("</LED>");
    
    // LED6
    cl.print("<LED>");
    if (LED_state[5]) {
        cl.print("checked");
    }
    else {
        cl.print("unchecked");
    }
    cl.println("</LED>");
    cl.print("</inputs>");
}

// imposta ogni elemento di str a 0 (cancella l'array)
void StrClear(char *str, char length)
{
    for (int i = 0; i < length; i++) {
        str[i] = 0;
    }
}

// cerca la stringa sfind nella stringa str
// restituisce 1 se viene trovata una stringa
// restituisce 0 se la stringa non viene trovata
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;
}

CODE!

Credits

thomasz_05
1 project • 0 followers

Comments