Go Down

Topic: Convertire sub string in intero (Read 4592 times) previous topic - next topic

Rinpe

Ho provato a ragionarci di più e questo è il mio sketch ma NON mi funziona ugualmente. Come dicevo prima avrei intenzione di dare un comando tipo
Http://192.168.1.100/11#1
dove
11 è l'indirizzo (da 00 a ipotetico 99)
1 è il comando (0 spento e 1 acceso)

Qualcuno sa dove sto sbagliando?
Quote

#include <Shifter.h>
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x3A, 0x06 };
byte ip[] = { 192,168,1,100 };
EthernetServer server(80);
String query;
//Pin connected to latch pin (ST_CP) of 74HC595
const int latchPin = 8;
//Pin connected to clock pin (SH_CP) of 74HC595
const int clockPin = 6;
////Pin connected to Data in (DS) of 74HC595
const int dataPin = 7;

#define NUM_REGISTERS 2

Shifter shifter(dataPin, latchPin, clockPin, NUM_REGISTERS);

void setup()
{
  query = String("");
  Ethernet.begin(mac, ip);
  server.begin();
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT); 
  pinMode(clockPin, OUTPUT);
}
void loop()
{

  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
    if (client.available()) {
     char c = client.read();
     query.concat(c);
     if (c == '\n') {
       client.println("HTTP/1.1 200 OK");
       client.println("Content-Type: text/html");
       client.println();
 

byte I = query.indexOf("#");
int Indirizzo = query.substring(I - 2).toInt();
int Comando = query.substring(I + 1).toInt();

  if (query.indexOf("#") > 0) {
      shifter.setPin(Indirizzo, Comando);
      shifter.write();      
      delay(3000);
      shifter.clear();
      shifter.write();
}

       client.print("<pre>");//DEBUG
       client.print(query);// DEBUG
       client.print("</pre>");//DEBUG
       break;//fermo il ciclo
     }
          }
}
    delay(1);
    client.stop();
    query = String("");
  }
}


pablos

Però sei testina ehh ... ti avevo postato qui lo sketch che ti serviva http://arduino.cc/forum/index.php/topic,102505.15.html, ma evidentemente non hai guardato.
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

pablos

#17
Oct 24, 2012, 11:37 am Last Edit: Oct 24, 2012, 12:02 pm by pablos Reason: 1
Esempio

porte da 10 a 99
http://192.168.2.177/110  >> on porta 10
http://192.168.2.177/010  >> off porta 10
...
http://192.168.2.177/199  >> on porta 99
http://192.168.2.177/099  >> off porta 99

porte da 0 a 9
http://192.168.2.177/100  >> on porta 0
http://192.168.2.177/000  >> off porta 0
...
http://192.168.2.177/109  >> on porta 9
http://192.168.2.177/009  >> off porta 9

Non ho lo shifter quindi dovrai sostituire i digitalWrite(port,0); con le tue righe, l'ip e company, ma il principio è lo stesso

     shifter.setPin(Indirizzo, Comando);
     shifter.write();      
     delay(3000);
     shifter.clear();
     shifter.write();

Code: [Select]

       
#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 2, 177 };
EthernetServer server(80);
String query;
byte out_1 = 40;
byte out_2 = 41;
byte out_3 = 42;
byte out_4 = 43;

void setup(){
 Ethernet.begin(mac, ip);
 pinMode(out_1, OUTPUT);
 pinMode(out_2, OUTPUT);
 pinMode(out_3, OUTPUT);
 pinMode(out_4, OUTPUT);
}

void loop()
{
EthernetClient  client = server.available();

 if (client)
 {
   boolean currentLineIsBlank = true;
 
   while (client.connected())
   {
     if (client.available())
     {
       char c = client.read();
       query.concat(c);  
       if (c == '\n' && currentLineIsBlank)
       {
               String Digi_port = query.substring(6,8) + "0";
               char thisChar[Digi_port.length()];
               Digi_port.toCharArray(thisChar, Digi_port.length());
               int port = atoi(thisChar);                                
               String on_off = query.substring(5,6);
                                                     
       client.println("HTTP/1.1 200 OK");
       client.println("Content-Type: text/html");
       client.println();
       client.print("<html><head><title>ARDUINO WEB</title></head><body>");
               
       if (on_off != "0" && on_off != "1")
       {
         client.println("ERRORE IMMISSIONE DATO !! <BR>");// DEBUG
       }
       else
       {
         client.println("Stringa inviata ad Arduino >> " + query +  "<BR>");// DEBUG
         client.println("Stringa ricevuta da Arduino parse  >> " + (String)port +  "<BR>");// DEBUG
         client.println("Comando da eseguire sulla porta " + (String)port + " >> "+ on_off +  "<BR>");// DEBUG
           if(on_off == "0") digitalWrite(port,0);
           if(on_off == "1") digitalWrite(port,1);
       }
       
       client.println("</body></html>");

       query="";
       
       delay(1);
       client.flush();
       client.stop();
       }
    }
  }
 }
}



L'ho fatto sul mio quindi deve andare anche sul tuo, fammi sapere ciao
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

Rinpe

Ciao Pablos, grazie delle info...stasera guarderò...comunque non vedo più il tuo post dall'altra parte...
Cmq grazie ancora poi ci guardo e studio bene :-)
Ciao

pablos

#19
Oct 24, 2012, 09:42 pm Last Edit: Oct 24, 2012, 09:45 pm by pablos Reason: 1
visto che qualcuno giustamente fa notare l'uso del toInt() l'ho applicato modificando il precedente programma con lo stesso risultato

Code: [Select]
#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 2, 177 };
EthernetServer server(80);
String query;
byte out_1 = 40;
byte out_2 = 41;
byte out_3 = 42;
byte out_4 = 43;

void setup(){
 Ethernet.begin(mac, ip);
 pinMode(out_1, OUTPUT);
 pinMode(out_2, OUTPUT);
 pinMode(out_3, OUTPUT);
 pinMode(out_4, OUTPUT);
}

void loop(){
EthernetClient  client = server.available();

 if (client) {
   boolean currentLineIsBlank = true;
 
   while (client.connected())
   {
     if (client.available())
     {
       char c = client.read();
       query.concat(c);  
       if (c == '\n' && currentLineIsBlank)
       {                            
       digitalWrite(byte(query.substring(6,8).toInt()), byte(query.substring(5,6).toInt()));  
         
       client.println("HTTP/1.1 200 OK");
       client.println("Content-Type: text/html");
       client.println();
       client.print("<html><head><title>ARDUINO WEB</title></head><body>");
       client.println("Stringa inviata ad Arduino >> " + query +  "<BR>");// DEBUG        
       client.println("</body></html>");

       query="";
       
       delay(1);
       client.flush();
       client.stop();
       }
    }
  }
 }
}
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

Rinpe

Grazie mille Pablos, funzionano entrambi.
Unica cosa che non riesco a capire (e che ammetto non è poco  :P) è come hai deciso che la posizione del substring è (6,8) e (5,6).
Forse per questo che non riuscivo pirma a ragionare. La stringa totale quindi quale sarebbe?
Grazie ancora
Ciao

pablos

#21
Oct 25, 2012, 11:50 pm Last Edit: Oct 26, 2012, 12:02 am by pablos Reason: 1
stampa la stringa  query che arriva ad arduino sarà per esempio: GET /140 HTTP/1.1
a noi serve il 140 ... quindi poi suddiviso 1 e 40
conta a partire dalla G fino ad arrivare al carattere 1  ...posizione  5
per il 40 le posizioni 6-8 ... per verificare se prendi i caratteri giusti ti fai dei serial.print e stampi le variabili e controlli se fai errori

la tua idea era di mettere il # che va bene lo stesso come separatore, in tal caso una volta prelevata la posizione del separatore con indexof prendi i caratteri con posiz.#-2 e posiz. #+1 ecc ecc dipende da come costruisci la stringa

ciao
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

Rinpe

Chiarissimo grazie mille...potevo infatti come dicevi tu stamparmi la stringa così capivo :-)
Thanks ancora
Ciao

Rinpe

Mi potete spiegare il perchè utilizzando questo sketch una volta che digito il comando sulla barra indirizzi ci mette circa 5 sec ad eseguire il comando? Mentre se facevo con una serie di "if" mi sembrava fosse più veloce e abbastanza immediato.
E sapete dirmi perchè all'interno dell'array se inserisco 08 e 09 mi da errore?

Quote

#include <Shifter.h>
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x3A, 0x06 };
byte ip[] = { 192,168,1,100 };
EthernetServer server(80);
String query;
//Pin connected to latch pin (ST_CP) of 74HC595
const int latchPin = 8;
//Pin connected to clock pin (SH_CP) of 74HC595
const int clockPin = 6;
////Pin connected to Data in (DS) of 74HC595
const int dataPin = 7;

#define NUM_REGISTERS 2

Shifter shifter(dataPin, latchPin, clockPin, NUM_REGISTERS);

void setup()
{
  query = String("");
  Ethernet.begin(mac, ip);
  server.begin();
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT); 
  pinMode(clockPin, OUTPUT);
}

void loop()

 EthernetClient  client = server.available();
 
  if (client)
  {
    boolean currentLineIsBlank = true;
   
    while (client.connected())
    {
      if (client.available())
      { 
        char c = client.read();
        query.concat(c);   
        if (c == '\n' && currentLineIsBlank)
        {

                 
                 
        client.println("HTTP/1.1 200 OK");
        client.println("Content-Type: text/html");
        client.println();
        client.print("<html><head><title>ARDUINO WEB</title></head><body>");
        
                String Digi_port = query.substring(6,8) + "0";
                char thisChar[Digi_port.length()];
                Digi_port.toCharArray(thisChar, Digi_port.length());
                int port = atoi(thisChar);                               
                String on_off = query.substring(5,6);
                 
                 int myPins[] = {00, 01, 02, 03, 04, 05, 06, 07, 10, 11, 12, 13, 14, 15};
                 int i;
                 
          if(on_off == "1")
          shifter.setPin(port, HIGH);
          shifter.write();      
          delay(3000);
          shifter.clear();
          shifter.write();
          
          if(on_off == "0")
          shifter.setPin(port, LOW);
          shifter.write();      
          delay(3000);
          shifter.clear();
          shifter.write();
         
         if (query.indexOf("all") > 0){
          for (i = 0; i < 15; i = i++){
          shifter.setPin(myPins,HIGH);
          shifter.write();      
          delay(5);
        }
        delay(3000);
          shifter.clear();
          shifter.write();
          }
        client.println("</body></html>");
          break;//fermo il ciclo
        }
     } 
   }
        
        delay(1);

        client.stop();
         query = String("");

  }
}




Grazie mille.
Ciao

Go Up