Go Down

Topic: [SOLVED] Two EthernetClient at the same time (Read 186 times) previous topic - next topic

kayy

Feb 19, 2015, 11:59 am Last Edit: Feb 19, 2015, 03:49 pm by kayy
Hi,

I'm working on an alarm connected. I use a XBoard Relay by DFRobot (Leonardo + Ethernet Shield assembled) and a PIR motion sensor. I have two programs :

- The first connects my board to a server each time that a motion detection occurs. This runs a php program which sends me an email.

- The second hosts a web page where I will can activate/inactive the alarm. At this moment, I only want an access to this web page (it's working).

Now, I would like to merge this two programs in one. I already tried and my best version allows me to connect to the web page but, as soon as the first motion is detected, the page become offline. All the following motions send me emails successfully.

I put my code in the next post because it's higher than 9000 characters.


Sorry for the bad English and commentaries in French..

 Thanks in advance.


kayy

Code: [Select]
// Projet tutoré : Alarme Connectée
// Partie a

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

// Variables

String etat = "<FONT color=\"red\"> ETEINTE </FONT>";

Servo microservo;

//identifiant de la broche de l'Arduino branchée à la sortie d'informations du détecteur.
//Cette broche est considérée comme l'entrée des informations sur l'Arduino.
int detecteurPin = A0;

//identifiant de la del qui s'allumera lors d'une détection,
//c'est celle marquée d'un L sur un Arduino Leonardo
//et elle est considérée comme la sortie des informations.
int delPin = 13;

//Temps donné en seconde pour que le détecteur se calibre,
//c'est-à-dire qu'il se mette en situation de non mouvement.
int tempsCalibration = 10;  

//Afin d'éviter d'envoyer une multitude d'emails lors d'une seule détection de mouvement
// il faut mettre en place un délai sans mouvement nécessaire afin de remettre le signal à LOW.

//Temps lors de la transition du signal LOW à HIGH.
long unsigned int tempsLow;

//Temps requis sans mouvement.
long unsigned int pasDeMouvement = 6000;

//permet de savoir si c'est une nouvelle détection ou juste une répetition
boolean lowVerrouille = true;

//permet de savoir si on est en phase de calcul de la pause.
boolean calculPause;


byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // adresse mac de shield

//IPAddress server(192,168,1,2);  // adresse ip du serveur

// adresse ip donnee a l'arduino A changer avec Numéricable a changer avec orange
//IPAddress ip(192,168,1,70);

byte ip[] = {
  192, 168, 1, 70 };  

byte gateway[] = {
  192, 168, 1, 1 };     // adresse ip du routeur interface orange box
byte subnet[] = {
  255, 255, 255, 0 };    // masque
EthernetServer server(80);               // port du serveur
String readString;


char server2[] = "remi.serveur.free.fr";
//char server[] = "www.google.fr";

EthernetClient client;


// Initialisation
void setup(){
  Serial.begin(9600);

  while (!Serial) {
    ; // attend que le port serie se connecte. Seulement necessaire pour un Arduino Leonardo
  }


  microservo.attach(7);
  // demarre la connexion Ethernet et le serveur:
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  // verifie que le serveur a la bonne adresse ip
  Serial.print("Le serveur a l'adresse ip: ");
  Serial.println(Ethernet.localIP());


  //on passe la broche 3 en mode entrée
  pinMode(detecteurPin, INPUT);

  //on passe la del en mode sortie
  pinMode(delPin, OUTPUT);

  //Desactive la resistance interne
  digitalWrite(detecteurPin, LOW);

  //on calibre le détecteur
  Serial.print("Calibration du detecteur ");
  for(int i = 0; i < tempsCalibration; i++){
    Serial.print(".");
    //On attends 1sec après l'écriture d'un . afin que le temps de calibration soit respecté
    delay(1000);
  }


  Serial.println(" FIN");
  Serial.println("DETECTEUR ACTIVE");
  delay(50);
}



//Boucle du programme
void loop(){
  //Si l'entrée passe à High, cela signifie une présence et la del s'allume(High)
  if(digitalRead(detecteurPin) == HIGH){
    digitalWrite(delPin, HIGH);



    //si LowVerrouillé est vrai, alors c'étais bien un LOW vers HIGH
    //il faut maintenant s'assurer que la prochaine détection soit bien une nouvelle
    //et faire une pause avant de remettre à LOW
    if(lowVerrouille)
    {
      lowVerrouille = false;
      Serial.println("------------------------------");
      Serial.print("Un mouvement a ete detecte a ");
      Serial.print(millis()/1000);
      Serial.println(" secondes.");
      delay(50);
    }
    calculPause = true;

    /*   while (!Serial) {
    
     }*/


    if (Ethernet.begin(mac) == 0) {
      Serial.println("Failed to configure Ethernet using DHCP");
      //Ethernet.begin(mac, ip);
    }
    delay(1000);
    Serial.println("connecting...");

    if (client.connect(server2, 80)) {
      Serial.println("connected");
      client.println("GET /programme.php?mail=theodore.lambolez@gmail.com HTTP/1.1"); // chemin permettant de lancer le programme d'envoi du mail
      client.println("Host: remi.serveur.free.fr");
      client.println("Connection: close");
      client.println();
      delay(10000);

      if (client.available()) {
        char c = client.read();
        Serial.print(c);
      }
      if (!client.connected()) {
        Serial.println();
        Serial.println("disconnecting.");
        client.stop();
        while(true);
      }
      client.stop();
    }
    else {
      Serial.println("connection failed");
    }
  }

  //Si l'entrée est Low, la del reste éteinte(low)
  if(digitalRead(detecteurPin) == LOW){      
    digitalWrite(delPin, LOW);  

    //Quand le signal devient Low, nous devons savoir si le délai sans détection est fini
    //afin soit de réinitialiser cette pause ou mettre le signal à HIGH en cas de détection
    if(calculPause)
    {
      tempsLow = millis();
      calculPause = false;
    }

    //si le détecteur est LOW pendant le délai de pause
    //alors la prochaine la prochaine détection est bien une nouvelle.
    if(!lowVerrouille && millis() - tempsLow >= pasDeMouvement)
    {
      lowVerrouille = true;
      Serial.print("Le mouvement s'est bien termine a ");
      Serial.print((millis() - pasDeMouvement)/1000);
      Serial.println(" secondes.");
      delay(50);
    }
  }



  // Creation d'une connexion client
  EthernetClient client2 = server.available();
  if (client2) {
    while (client2.connected()) {  
      if (client2.available()) {
        char c = client2.read();

        //lis caractere par caractere la requete HTTP
        if (readString.length() < 100) {
          // concatene les caracteres
          readString += c;
          //Serial.print(c);
        }

        //si la requete HTTP est finie d'etre lu
        if (c == '\n') {          
          Serial.println(readString); // imprime sur le moniteur serie pour le debogage

          client2.println("HTTP/1.1 200 OK"); // envoi une nouvelle page
          client2.println("Content-Type: text/html");
          client2.println();    
          client2.println("<HTML>");
          client2.println("<HEAD>");
          client2.println("<meta name='apple-mobile-web-app-capable' content='yes' />");
          client2.println("<meta name='apple-mobile-web-app-status-bar-style' content='black-translucent' />");
          client2.println("<style type=\"text/css\">");
          client2.println("body{ margin:60px 0px; padding:0px;text-align:center;}h1{text-align: center;font-family:Arial, \"Trebuchet MS\", Helvetica, sans-serif;}h2{text-align: center;font-family:Arial, \"Trebuchet MS\", Helvetica, sans-serif;}a{text-decoration:none;width:75px;height:50px;border-color:black;border-top:2px solid;border-bottom:2px solid;border-right:2px solid;border-left:2px solid;border-radius:10px 10px 10px;-o-border-radius:10px 10px 10px;-webkit-border-radius:10px 10px 10px;font-family:\"Trebuchet MS\",Arial, Helvetica, sans-serif;-moz-border-radius:10px 10px 10px;background-color:#293F5E;padding:8px;text-align:center;}a:link {color:white;}      /* unvisited link */a:visited {color:white;}  /* visited link */a:hover {color:white;}  /* mouse over link */a:active {color:white;}  /* selected link */");
          client2.println("</style>");
          client2.println("<TITLE>Accueil - Interface de controle de l'alarme</TITLE>");
          client2.println("</HEAD>");
          client2.println("<BODY>");
          client2.println("<H1>Controle de l'alarme</H1>");
          client2.println("<hr />");
          client2.println("<br />");  
          client2.println("<H2>Etat de l'alarme: "+etat);
          client2.println("</H2>");
          client2.println("<br />");  
          client2.println("<H2>Arduino avec un shield ethernet</H2>");
          client2.println("<br />");  
          client2.println("<a href=\"/?button1on\"\">Allumer l'alarme</a>");
          client2.println("<a href=\"/?button1off\"\">Eteindre l'alarme</a><br />");  
          client2.println("<br />");    
          client2.println("</BODY>");
          client2.println("</HTML>");

          delay(1);
          // arret du client
          client2.stop();
          // controle de l'Arduino si on a appuye sur un bouton
          if (readString.indexOf("?button1on") >0){
            // lancement du programme d'interpretation du signal
            etat = "<FONT color=\"green\"> ALLUMEE </FONT>";
          }
          if (readString.indexOf("?button1off") >0){
            // arret du programme d'interpretation du signal
            etat = "<FONT color=\"red\"> ETEINTE </FONT>";
          }
          // effacement pour la prochaine lecture
          readString="";  

        }
      }
    }
  }
}

SurferTim

You are not initializing the w5100 correctly. If you are using a static IP, then:
Code: [Select]
//change this
  Ethernet.begin(mac, ip, gateway, subnet);
// to this
  Ethernet.begin(mac, ip, gateway, gateway, subnet);

Call this once. Remove the Ethernet.begin() call in your loop.


kayy

Thanks, it's working !

But can you explain me my mistake ? I don't understand the two gateways..

SurferTim

Actually, the first gateway parameter is the dns server. If you specify a dns server ip in a variable named dnServer, then this is how you use it:
Code: [Select]
  Ethernet.begin(mac, ip, dnServer, gateway, subnet);

kayy

Yes, ok, but before, my two programs separate worked well.

Is The Ethernet.begin in the loop wrong ?

SurferTim

Is The Ethernet.begin in the loop wrong ?
Yes. You should call Ethernet.begin() only in setup. The call in setup uses a static IP. The one you have in the loop uses a dhcp IP. That would be a different IP, so the server section would no longer respond to the static IP.

kayy


Go Up