Pages: [1]   Go Down
Author Topic: Arduino ethernet + Relay shield - Ping and WebServer  (Read 703 times)
0 Members and 1 Guest are viewing this topic.
Siena
Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Salve a tutti, premetto che sono un principiante sulla programmazione di Arduino. Devo implementare un mini-telecontrollo per un wISP. In poche parole devo fare dei ping ad un IP e dopo 10 Timout devo aprire il circuito in modo da spengere gli apparati per 10 secondi e riaccenderli. Fino a qui tutto ok, posto il codice (ho usato la libreria ICMPPing.h) :

Code:
void loop() {
  if (DELAY_PING > DELAY_CEHCK_PING ) {
    ICMPPing ping(pingSocket);
    ping(4, pingAddr, buffer);
    if (String(buffer).indexOf(STR_FAIL) != -1) {
      PING_FAIL++;
      if (PING_FAIL > WAIT_TO_RESET ) {
        Serial.println( "Ping FALLITO ! Count Reset eccessivo SPENGO la porta ! ");
        digitalWrite(5, LOW);
        delay(DELAY_OFF);
        digitalWrite(5, HIGH);
        Serial.println( "Ping FALLITO ! Count Reset eccessivo ACCENDO la porta ! ");
        PING_FAIL=0;
      } else {
        Serial.println( "Ping FALLITO ! Count Reset: " + String(PING_FAIL) );
      }
    } else {
      Serial.println(buffer);
    }
    DELAY_PING = 0;
  } else {
    DELAY_PING++;
  }
 
  delay(1);
}

il problema sta nel fatto che devo fare anche un mini pannello web dove occorre visualizzare lo stato dei canali. Prima del delay ho inserito il codice per creare un WebServer (come da esempio nel compilatore). Il problema sta nel fatto che se richiamo due volte la pagina web i ping mi tornano sempre in timeout e Arduino mi fa partire procedura per spengere e riaccendere il canale ...

Come posso implementare un sistema che faccia di continuo i ping e se viene richiamata una pagina web restituisca lo stato dei canali ??

grazie mille Sascha
Logged

Siena
Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

mi ero dimenticato di mettere il codice iniziale
Code:
#include <SPI.h>
#include <Ethernet.h>
#include <ICMPPing.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0x90, 0xA2, 0xDA, 0x0D, 0x93, 0x70 };
IPAddress ip(192,168,1, 183);
IPAddress sub(255,255,255,0);
IPAddress gw(192,168,1, 5);

SOCKET pingSocket = 1;

int WAIT_TO_RESET = 10; //numero di tentativi falliti dopo il quale si effettua lo shutdown della porta !
int PING_FAIL = 0;
int DELAY_PING = 0; //variabile per il controllo del delay del loop principale
int DELAY_CEHCK_PING = 5000; // ogni 5 secondi effettua un ping !!
int DELAY_OFF = 7000; //quanto deve tenere spento il canale

char STR_FAIL[] = "Timed Out";

byte pingAddr[] = {192,168,1,14};
char buffer [256];

EthernetServer server(80);

void setup() {
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  //imposto i PIN out per la shield dei Relè
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
 
  //imposto tutti i canali ACCESI
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
 
  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip, gw, sub);
  server.begin();
  delay(100);
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}
Logged

Siena
Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Forse dovrei aver capito il problema ... ovvero i socket ....
Arduino quanti socket può aprire ?? la libreria ethernet parte da 0 come default giusto ??
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 110
Posts: 6975
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Puoi avere solo 4 socket.
Inoltre sbagli l'inizializzazione della ethernet.
Con 4 paramenti devi passare
Code:
Ethernet.begin(mac, ip, dns, gateway);
Mentre per passare la netmask devi utilizzare l'inizializzazione con 5 paramenti.
Code:
Ethernet.begin(mac, ip, dns, gateway, subnet);

Nel tuo caso puoi mettere:
Code:
Ethernet.begin(mac, ip, gw, gw, sub);

--> http://arduino.cc/en/Reference/EthernetBegin
« Last Edit: December 03, 2012, 12:11:12 pm by PaoloP » Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Siena
Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie mille Paolo !!
Ultima domanda, come posso fare per riservare un socket ai Ping e 3 al web server ??
Grazie ancora !!
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 110
Posts: 6975
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Non ho mai lavorato con quella libreria.
Potresti pero chiedere a brunol949. Ha realizzato un progetto simile --> http://arduino.cc/forum/index.php/topic,93073.msg751133.html#msg751133
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Pages: [1]   Go Up
Jump to: