Go Down

Topic: aduino ethernet shield (Read 3 times) previous topic - next topic

fafidio


leo72

E' normale che il programma si blocchi in attesa che tu apra il terminale dato che gli chiedi di scriverci sopra e non viene trovato aperto. Prova a togliere tutti quei Serial.print se non ti servono.

lesto

Facciamo un pò di debug insieme.
COSE DA SAPERE
1. ad ogni apertira del serial mnonitor arduino si resetta (e questo poi ti spiegerà perchè funziona il tuo codice al reset)
2. Ad OGNI richiesta GET(o POST) la connessione viene chiusa (e anche questo fa parte della soluzione)
3. usa i tag [ code] e [ /code], sennè non si capisce una mazza :)

Code: [Select]

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

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,0,108 };// my client (arduino n°1)
byte server[] = { 192,168,0,107 }; // my server (arduino n°2)

// Initialize the Ethernet client library
// with the IP address and port of the server
// that you want to connect to (port 80 is default for HTTP):
Client client(server, 80);
// constants won't change. They're used here to
// set pin numbers:
const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPin =  7;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

vabbè direi che fino a quì dovresti capirci tutto

Code: [Select]

void setup() {

  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);     
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
  Ethernet.begin(mac, ip);
  // start the serial library:
  Serial.begin(9600);
  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.println("connecting...");
// if you get a connection, report back via serial:
  if (client.connect())
    Serial.println("connected");
   
else {
        if (!client.connect())
    // if you didn't get a connection to the server:
    Serial.println("connection failed");
  }
}

Quì inizializzi un pò di roba e fai partire la connessione.. tutto ok
Code: [Select]

void loop()  {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == HIGH) {     
    // turn LED on:   
   
   digitalWrite(ledPin, HIGH); 
  client.println("POST /led=1");
  client.println();

 
}
  else {
    // turn LED off:
    digitalWrite(ledPin, LOW);   
  client.println("POST /led=0");
  client.println();

  }
}

Quì invii la richiesta all'arduino server, che accetta il tuo comando e poi chiude la connessione. Inutile dire che alla prossima richiesta, visto che non fai nessun controllo sullo stato della connessione (che ricordiamo ora è chiusa), i comandi successivi non vengono inviati.

Altro problema: tu vuoi inviare una richiesta get OGNI loop(), quindi migliaia al secondo (se non milioni), capirai bene che questa cosa saturerà la tua banda (niente di grave, il codice funzionerà ma il tuo router non sarà di certo felice)...
la cosa migliore sarebbe inviare una richiesta quando il pulsante cambia di stato (quindi ti salvi da qualche parte il valore dell'ultima richiesta, se è diversa dallo stato attuale del pulsante invii una nuova richiesta etc..)

good luck
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

lesto


E' normale che il programma si blocchi in attesa che tu apra il terminale dato che gli chiedi di scriverci sopra e non viene trovato aperto. Prova a togliere tutti quei Serial.print se non ti servono.


no, arduino scrive i dati, se poi il terminale è chiuso i dati sono persi. L'unico motivo per cui la serial.write o print è lenta è perché lei comunque scrive i dati al baud-rate impostato, ma assolutamente non c'è alcun controllo se qualcuno sta effettivamente ascoltando i dati o se lo stia facendo al giusto baud-rate
Questo è esattamente il problema che si verifica usando la SoftSerial, che non essendo basata su unterrupt (al contrario della NewSoftSerial) se non si è in ascolto con una read() nel momento in cui arrivano i dati, sono persi.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

leo72

Ah, mi era sfuggita la cosa della comunicazione verso la SoftSerial.

fafidio

[Altro problema: tu vuoi inviare una richiesta get OGNI loop(), quindi migliaia al secondo (se non milioni), capirai bene che questa cosa saturerà la tua banda (niente di grave, il codice funzionerà ma il tuo router non sarà di certo felice)...
la cosa migliore sarebbe inviare una richiesta quando il pulsante cambia di stato (quindi ti salvi da qualche parte il valore dell'ultima richiesta, se è diversa dallo stato attuale del pulsante invii una nuova richiesta etc..)

good luck
[/quote]

è proprio questo il problema!!! naturalmente le mie nozioni di C non mi permettono di inventarmi il metodo; se sei così gentile da indirizzarmi verso la luce......(led), so che non manca tanto, poi giuro che non  do più fastidio :)
Dove salvo il valore dell'ultima richiesta? E' proprio qui che non riesco a trovare soluzione.

fafidio

provato con questo....

void loop(){
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);
if (buttonState != buttonStateOld)
    {

           // check if the pushbutton is pressed.
           // if it is, the buttonState is HIGH:
            if (buttonState == HIGH) {     
             // turn LED on:   
   
   digitalWrite(ledPin, HIGH);
  //Serial.println("led acceso"); 
  client.println("POST /led=1");
  client.println();

 
}
  else {
    // turn LED off:
    digitalWrite(ledPin, LOW);
   // Serial.println("led spento"); 
  client.println("POST /led=0");
  client.println();

  }

}  buttonStateOld=buttonState;}


naturalmente dopo aver dichiarato:
int buttonState = 0;         // variable for reading the pushbutton status
int buttonStateOld = 0;

ma la cosa non cambia. Cosa posso fare ancora???

lesto

1. usa i tag [ code] e [ /code] (senza lo spazio) per scrivere il codice sul forum
2. formatta il tuo codice, se non altro per renderci la vita più facile. E' buona abitudine scriverlo già formattato, se non hai voglia almeno prima di postarlo clicca Tool->Autoformat, e otterrai del codice che non fa impazzire la gente.
3. se poi vuoi fare le cose fatte come si deve, clicca Edit->Copy for forum, non serve selezionare il codice, ti sembrerà non succedere niente ma se provi a fare dtsro ->incolla nel tuo post ecco cosa otterrai (questo passo esegue anche i 2 passi precedenti in automatico!):
Quote

void loop(){
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);
  if (buttonState != buttonStateOld)
  {

    // check if the pushbutton is pressed.
    // if it is, the buttonState is HIGH:
    if (buttonState == HIGH) {     
      // turn LED on:   

      digitalWrite(ledPin, HIGH);
      //Serial.println("led acceso");
      client.println("POST /led=1");
      client.println();


    }
    else {
      // turn LED off:
      digitalWrite(ledPin, LOW);
      // Serial.println("led spento");
      client.println("POST /led=0");
      client.println();

    }

  }  
  buttonStateOld=buttonState;
}


sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

lesto

ed ora le correzioni:

1. buttonStateOld lo puoi aggiornare solo se entri nell'if, non è un errore ma spreco di CPU

2. ancora manca il controllo se la connessione è chiusa e nel caso la riapra.

3. sicuro che la POST si faccia così?
a quanto mi risulta si fanno così:
Code: [Select]
POST /login.jsp HTTP/1.1
Host: www.mysite.com
Content-Length: 27

userid=joe&password=guessme


4. sicuro che non vuoi fare una GET? si fanno così:
Code: [Select]
GET /login.jsp?userid=joe&password=guessme HTTP/1.1
Host: www.mysite.com


5. Sicuro che il codice del server sia corretto? puoi postarlo?

6. studiati il protocollo ISO/OSI: http://it.wikipedia.org/wiki/Open_Systems_Interconnection
In particolare sappi che nel tua caso a livello applicazione in realtà non c'è il programma, ma il protocollo HTTP: http://it.wikipedia.org/wiki/Http
e poi la tua applicazione.

Se non sai le basi è inutile che ci giri troppo intorno, se vuoi che qualcuno scriva il codice per te si può fare, basta che apri il portafoglio :)

ps. 3 e 4 sono la stessa richiesta ma fatta in 2 modi diversi...
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up