Pages: 1 2 3 [4]   Go Down
Author Topic: aduino ethernet shield  (Read 2460 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 0
Posts: 112
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

help!!!!
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley

Code:
#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:
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:
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
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Offline Offline
Full Member
***
Karma: 0
Posts: 112
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

[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 smiley
Dove salvo il valore dell'ultima richiesta? E' proprio qui che non riesco a trovare soluzione.
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 112
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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???
Logged

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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;
}


Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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:
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 smiley

ps. 3 e 4 sono la stessa richiesta ma fatta in 2 modi diversi...
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Pages: 1 2 3 [4]   Go Up
Jump to: