Aiuto per capire uno sketch e compilarne uno nuovo

Ciao a tutti volevo un aiuto per capire uno sketch e sempre con un aiuto compilarne uno nuovo per arrivare ad un risultato.

Il codice è questo…

#include <SPI.h>
#include <Ethernet.h>
#include <Flash.h>
#include <SD.h>
#include <SdFatUtil.h>
#include <WebServerSD.h>

// 0 = no debug su seriale
// 1 = memoria RAM libera
// 2 = debug su seriale 
#ifndef DEBUG_SERIAL
#define DEBUG_SERIAL 0
#endif

//-------------------------------------------------------------------------
// markers MAP 
// associazione tra indice dell'array e valore da leggere/rappresentare
// @A è associato alla stringa puntata dalle'elemento di indice 0 dell'array replacements[]
// @B è associato alla stringa puntata dalle'elemento di indice 1 dell'array replacements[]

#define V_IN_D4        0      //marker @A - stato ingresso D4
#define V_OUT_D5       1      //marker @B - stato uscita D5
#define V_OUT_D6       2      //marker @C - stato uscita D6
#define V_AN1          3      //marker @D - valore ingresso analogico AN1
#define S_D8_D9_H      4      //marker @E - Select - id-0 - D8 e D9 alti
#define S_D8_D9_L      5      //marker @F - Select - id-1 - D8 e D9 bassi
#define S_D8_H         6      //marker @G - Select - id-2 - solo D8 alto
#define S_D9_H         7      //marker @H - Select - id-3 - solo D9 alto
#define V_OUT_D8       8      //marker @I - Stato uscita D8
#define V_OUT_D9       9      //marker @J - Stato uscita D9
//-----------------------------------------------------------------------

// pointer to strings that will replace markers found in HTML
// array di puntatori. Ciascun puntatore punta alla stringa che sostituirà
// il marker corrispondente - Es l'elemento di indice 0 punta alla stringa
// che sostituirà   @A nella pagina HTML
char* replacements[10];

// carattere che individua i marcatori - Questo carattere non può essere
// utilizzato nella pagina web poichè non verrà sempre visualizzato ma sostituito
// dalla stringa associata all'eventuale marcatore
char tok[2] = {"@"};

#define FIRST_ASC_NAME 65   // codifica ascii della lettera A = 65


// stringa riservata a contenere il valore dell'ingresso analogico AN1
// da 0 a 1024
char str_AN1[]= {"xxxx"};


byte digital_lines_status[4];     // array che contiene con lo stato delle uscite digitali D5 D6 D8 D9
                                  // elemento 0 -> D5 ...... 
                                  // elemento 3 --> D8

// valore dell'ingresso analogico AN_1
unsigned int Analog_1_val;

// valore dell'ingresso digitale D7
byte D7_input_value;

// stringhe utili per gestire lo stato dei controlli radiobutton 
// checkbox select nella pagina web

char STR_ON[]       = {"ON"};
char STR_OFF[]      = {"OFF"};
char STR_CHECKED[]  = {"CHECKED"};      //  checkboxes
char STR_SELECTED[] = {"SELECTED"};     //  input list
char STR_BLANK[]    = {" "};

Allora intento vorrei capire come funziona questo sketch…
Grazie

//----------------------------------------------------------------------
// Aggiorna l'array dei puntatori alle stringhe da utilizzare
// per la sostituzione di marcatori presenti nella pagina web
// caricata dalla uSD
void set_replacements_array(void) {
   uint8_t j = 1;

   memset(str_AN1,' ', 4);              // riempio la stringa di spazi 
   itoa(Analog_1_val, str_AN1, 10);     // conversione int -> stringa
 
   replacements[V_AN1]=str_AN1;         // l'elemento  indice 2 punta .....
   
   if (D7_input_value)                  // determina lo stato corrente degli ingressi
       replacements[0] = STR_ON;        // digitali e associa le stringhe ON e OFF
   else 
       replacements[0] = STR_OFF;
   
   uint8_t i;
   for (i = V_OUT_D5; i <= V_OUT_D6; i++)   // stato delle uscite digitali
   {                                               // e conversione in stringa.
       if (digital_lines_status[i-1])
          replacements[i] = STR_ON;
       else 
         replacements[i] = STR_OFF;
    }
  
   for (i = S_D8_D9_H ; i <=S_D9_H; i++)
     replacements[i] = STR_BLANK;  
     
   if (digital_lines_status[2] && digital_lines_status[3])
          replacements[S_D8_D9_H] = STR_SELECTED;
   else 
     if (!digital_lines_status[2] && !digital_lines_status[3])
         replacements[S_D8_D9_L] = STR_SELECTED;
     else
       if (digital_lines_status[2])
         replacements[S_D8_H] = STR_SELECTED;
       else
         if (digital_lines_status[3])
             replacements[S_D9_H] = STR_SELECTED;
             
   if (digital_lines_status[2])
     replacements[V_OUT_D8] = STR_ON;
   else
     replacements[V_OUT_D8] = STR_OFF;
   
   if (digital_lines_status[3])
     replacements[V_OUT_D9] = STR_ON;
   else
     replacements[V_OUT_D9] = STR_OFF;
}


//-------- gestione della uSD
boolean has_filesystem = true;

Sd2Card card;
SdVolume volume;
SdFile root;
SdFile file;


//-----------------------------------------------------------
// Ethernet definitions: MAC - IP _ GATEWAY      
static uint8_t mac[] = {0x90, 0xA2, 0xDA, 0x00, 0x20, 0x4C };
byte ip[]  = {192,168,1,177 };



#define PREFIX ""

WebServer webserver(PREFIX, 80);

// commands are functions that get called by the webserver framework
// they can read any posted data from client, and they output to server

void send_file_name(WebServer &server, const char* filename,   char* lista[],   char* token) {
  if (!filename) {
    server.send_error_code(404);
    server << F("Could not parse URL");
  } 
  else {
    WebServer::MimeType mime_type = server.get_mime_type_from_filename(filename);
    server.send_error_code(200);
    server.send_content_type(mime_type);
    server.printCRLF();
    
    #if DEBUG_SERIAL > 1
    Serial.print("Accesso a filename: ");
    Serial.println(filename);
    #endif
    
    if (file.open(&root, filename, O_READ)) {
       server.send_file(file,lista,token);
       file.close();
     } 
    else {
      server << F("Could not find file: ") << filename << "\n";
    }
  }
}

//-------------- Gestore della FORM ----------------------
void formCmd(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
{
  bool repeat;
  char name[16];
  char value[16];
  uint8_t value_as_int;
  do{
    repeat = server.readPOSTparam( name, 16, value, 16);

    #if DEBUG_SERIAL > 1
    Serial.print("Ricevuti dalla FORM: ");
    Serial.print("name ");
    Serial.println(name);
    Serial.print("value ");
    Serial.println(value);
    #endif    
    value_as_int = atoi(value);    
    switch (name[0]) {
    case V_OUT_D5+FIRST_ASC_NAME:     
        digital_lines_status[V_OUT_D5-1]=!digital_lines_status[V_OUT_D5-1];
        digitalWrite(5,digital_lines_status[V_OUT_D5-1]);    
        break;
    case V_OUT_D6+FIRST_ASC_NAME:
         digital_lines_status[V_OUT_D6-1]=!digital_lines_status[V_OUT_D6-1];
         digitalWrite(6,digital_lines_status[V_OUT_D6-1]);    
      break;
    case S_D8_D9_H + FIRST_ASC_NAME:
         if (value_as_int == 0){
               digital_lines_status[2]= 1;
               digital_lines_status[3]= 1;
         } else if  (value_as_int == 1){
                  digital_lines_status[2]= 0;
                  digital_lines_status[3]= 0;
         } else if (value_as_int == 2){
                  digital_lines_status[2]= 1;
                  digital_lines_status[3]= 0;
         } else
         {
                digital_lines_status[2]= 0;
                digital_lines_status[3]= 1;
          }
      break;
    default :
      break;
    } 
  } 
  while (repeat);
  set_replacements_array();
  // dalla pseudopagina FORM torno alla root
  server.httpSeeOther("/");
}

//-------- Gestore di default - INDEX.HTM
void defaultCmd(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
{
    #if DEBUG_SERIAL > 1
    Serial.print("defaultCmd: ");
    Serial.println(url_tail);
    #endif
    send_file_name(server, "INDEX.HTM", replacements, tok);
}

//----- Legge da uSD un file riferito dalla pagina HTML (es immagini, JS ...)
void get_embed_file(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
{
 
    #if DEBUG_SERIAL > 1
    Serial.print("get_embed_file ");
    Serial.println(url_tail);
    #endif
    send_file_name(server, url_tail, 0, tok);
}
void setup()
{
  
   Serial.begin(19200);
  
   #if DEBUG_SERIAL >= 1
   Serial << F("Free RAM: ") << FreeRam() << "\n";
   #endif
   //----------------------
   pinMode(7, INPUT);
   pinMode(5, OUTPUT);
   pinMode(8, OUTPUT);
   pinMode(9, OUTPUT);
   digitalWrite(5,0);
   digital_lines_status[0]=0;
   pinMode(6, OUTPUT);
   digitalWrite(6,1);
   digital_lines_status[1]=1;
   digitalWrite(8,1);
   digital_lines_status[2]=1;
   digitalWrite(9,1);
   digital_lines_status[3]=1;
   Analog_1_val = analogRead(1);
   D7_input_value = digitalRead(7);
  //----------------------
  
  set_replacements_array();
  
  // initialize the SD card
  
  #if DEBUG_SERIAL > 1
  Serial << F("Setting up SD card...\n");
  #endif
  pinMode(10, OUTPUT);                    // set the SS pin as an output (necessary!)
  digitalWrite(10, HIGH);                 // but turn off the W5100 chip!
  if (!card.init(SPI_FULL_SPEED, 4)) {
    #if DEBUG_SERIAL > 1
    Serial << F("card failed\n");
    #endif
    has_filesystem = false;
  }
  // initialize a FAT volume
  if (!volume.init(&card)) {
    #if DEBUG_SERIAL > 1
    Serial << F("vol.init failed!\n");
    #endif
    has_filesystem = false;
  }
  if (!root.openRoot(&volume)) {
    #if DEBUG_SERIAL > 1
    Serial << F("openRoot failed");
    #endif
    has_filesystem = false;
  }
 
  #if DEBUG_SERIAL > 1
  Serial << F("Setting up the Ethernet card...\n");
  #endif
  Ethernet.begin(mac, ip);
  
  // Start the web server.
  #if DEBUG_SERIAL > 1
  Serial << F("Web server starting...\n");
  #endif
  
  webserver.begin();

  webserver.setDefaultCommand(&defaultCmd);
  webserver.setReadEmbeddedFile(&get_embed_file);
  webserver.addCommand("FORM", &formCmd);

}

void loop()
{
  set_replacements_array(); 
  // process incoming connections one at a time forever
  if (has_filesystem) {
     webserver.processConnection();
  }
  if  ( analogRead(1)!= Analog_1_val)
      Analog_1_val = analogRead(1);
  D7_input_value = digitalRead(7);

}

Prima di analizzare (per tuo conto... ;)) uno sketch di qualche centinaio di righe, forse faresti prima a dirci da dove l'hai preso. Magari c'è la spiegazione fatta dall'autore...

ciao questo è proprio lo sketch dell'autore.... è una modifica della WesDuino....

leo72: Prima di analizzare (per tuo conto... ;)) uno sketch di qualche centinaio di righe, forse faresti prima a dirci da dove l'hai preso. Magari c'è la spiegazione fatta dall'autore...

Buon giorno a tutti, riprendo questo topic per approfittare e chiedere info. Lo sketch in questione e realizzato da Gianni C. ed è postato in questa discussione http://forum.arduino.cc/index.php/topic,54797.0.html Io lo avevo provato tempo fa per curiosità, ora l'ho ripreso perchè mi tornerebbe utile, ma mi chiedevo se è possibile modificarlo, comprese le librerie, per la compatibilità IDE 1.0 Premetto che non conosco codici di programmazione, ma spesso riesco a capire il funzionamento di uno sketch precompilato e devo dire che questo di Gianni C. mi è risultato molto difficile da capirne. Attendo vostre gradite esperienze per l'aggiornamento alla IDE 1.0 Grazie