Projet ouverture portail + gestion lumiere extérieur

Bonjour a tous.

Je possede un arduino mega + ethernet shield + 4 relais depuis quelques semaines et j'ai démarrer ce projet :

-Ouverture du portail via app android ,soit en demandant manuellement l'ouverture ,soit en utilisant ma position gps. J'y ai mis un périmètre de déclenchement. .

-gestion de l'éclairage extérieur ,soit avec un interrupteur + minuterie arduino, soit quand le portail s'ouvre.
Je dois utiliser un interrupteur et non un bouton poussoir, car l’éclairage extérieur était en va et vient avant, mais plus besoin ,enfin bref.
Voici le code :

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

int etatInterrupteur;

int relaislumiere = 22;
int relaisportail = 23;

int button2 = 4;
int memo = LOW;


boolean routine = 0; // demarrage tempo eclairage ext
boolean incoming = 0; // reception donnée http


byte mac[] = {0x00, 0xAA, 0xBB, 0xCC, 0xDA, 0x03 };
//ip donnée par routeur
EthernetServer server(48880);
void setup()
{
  pinMode(relaislumiere, OUTPUT);
  digitalWrite(relaislumiere, HIGH); // je suis tout a l'envers
  
  pinMode(relaisportail, OUTPUT); // la aussi
  digitalWrite(relaisportail, HIGH);

  // Configuration de la broche button en tant qu'entree numerique
  //pinMode(button1,INPUT);
  pinMode(button2, INPUT);







  // start the Ethernet connection and the server:
  Ethernet.begin(mac);
  server.begin();
  Serial.begin(9600);
  Serial.println("serveur ok");
}
void loop()
{
  {
    //Gestion interrupteur lumiere


    etatInterrupteur = digitalRead(button2);// lecture de l'état du bouton

    if (etatInterrupteur == !memo) {    //si changement etat inter, demarrage routine
      routine = 1;
      memo = etatInterrupteur; //enregistre dernier etat inter
    }



    // demarrage temporisation lumiere

    if (routine == 0) {
      digitalWrite(relaislumiere, HIGH);
    }

    if (routine == 1) {
      digitalWrite(relaislumiere, LOW);
      delay(60000);
      routine = 0;
    }



    //Gestion reception commande portail

    // listen for incoming clients
    EthernetClient client = server.available();
    if (client) {
      // an http request ends with a blank line
      boolean currentLineIsBlank = true;
      while (client.connected()) {
        if (client.available()) {
          char c = client.read();
          // if you've gotten to the end of the line (received a newline
          // character) and the line is blank, the http request has ended,
          // so you can send a reply

          //reads URL string from $ to first blank space
          if (incoming && c == ' ') {
            incoming = 0;
          }
          if (c == '

J'ai des problème avec l'ethernet.
Deja ma bbox ne reconnait pas l'arduino, pas moyen de le branché derrière alors que derrière un routeur je n'ai pas ce problème.
Il n'y a pas de conflit d'ip puisque je réserve une ip a l'adresse mac de l'arduino.

Je fais bien mes redirections de port sur l'ip de l'arduino.

Quand je met mon arduino sur le routeur, le ping de l'ip fonctionne, mais la réaction a un ordre htttp://......:48880/$2 est aléatoire.

Des fois ca fonctionne ,d'autre fois non ,voir ca plante et je reset l'arduino.

J'ai essayer plein de methode , mais je n'ai pas du trouver la bonne.
Je pense avoir un problème avec le démarrage du serveur.

) {
           incoming = 1;
         }

//Checks for the URL string $1 or $2
         if (incoming == 1) {
           Serial.println(c);

if (c == '1') {
             Serial.println("OFF");
             digitalWrite(relaisportail, HIGH);
             routine = 1;
           }
           if (c == '2') {
             Serial.println("ON");
             digitalWrite(relaisportail, LOW);
             delay(1000);
             digitalWrite(relaisportail, HIGH);
             routine = 1;
           }
           //
           if (c == '\n') {
             // you're starting a new line
             currentLineIsBlank = true;
           }
           else if (c != '\r') {
             // you've gotten a character on the current line
             currentLineIsBlank = false;
           }
         }
       }
       // give the web browser time to receive the data
       delay(1);
       // close the connection:
       client.stop();
     }
   }
 }

}


J'ai des problème avec l'ethernet.
Deja ma bbox ne reconnait pas l'arduino, pas moyen de le branché derrière alors que derrière un routeur je n'ai pas ce problème.
Il n'y a pas de conflit d'ip puisque je réserve une ip a l'adresse mac de l'arduino.

Je fais bien mes redirections de port sur l'ip de l'arduino.

Quand je met mon arduino sur le routeur, le ping de l'ip fonctionne, mais la réaction a un ordre htttp://......:48880/$2 est aléatoire.

Des fois ca fonctionne ,d'autre fois non ,voir ca plante et je reset l'arduino.

J'ai essayer plein de methode , mais je n'ai pas du trouver la bonne.
Je pense avoir un problème avec le démarrage du serveur.

Bon ,j'ai tout recommencer ,et faut que je bosse sur certaines fonction que je ne comprend pas encore.

Bonjour,
Permet moi de te donner un conseil, réfléchis bien à la sécurité et au fonctionnement.
Plusieurs questions me viennent à l'esprit :

  • Est-ce que ton système programmé ne sert qu'a fournir un contact sec ou doit-il manœuvrer les moteurs.
  • L'éclairage lui aussi n'est qu'un système tiers et donc ne fournir qu'un contact sec ?
  • Pourquoi ne pas utiliser un système autonome tel qu'un "LoLin NodeMCU ESP8266" que tu pourrais piloter depuis tout ton réseau local et même depuis un smartphone ?
  • Et enfin de quoi as-tu besoin ? Que pouvons nous faire pour t'aider ?

Bonjour,

Donc je n'ai besoin que de contact sec qui provienne de l'arduino .
J'ai fais une app android qui envoie une requete http quand j'arrive dans une zone geographique autour de chez moi ,en utilisant ma position gps.

j'avais des soucis pour demarrer le serveur web ,sans doute un conflit d'ip et le code que j'avais ne pouvais pas m'en avertir ,j'en ai donc trouver un mieux.
voici le code complet actuel :

// Ces deux bibliothèques sont indispensables pour le shield
#include <SPI.h>
#include <Ethernet.h>

int etatInterrupteur ;
int relaislumiere = 22;
int relaisportail = 23;
int button2 = 4;
int memo = LOW;
boolean routine = 0; // demarrage tempo eclairage ext
boolean incoming = 0; // reception donnée http
boolean portail = 0;
// L'adresse MAC du shield
byte mac[] = {
  0x90, 0xA2, 0xDA, 0x0E, 0xA5, 0x7E
};
// L'adresse IP que prendra le shield
IPAddress ip(192, 168, 0, 14);
// Initialise notre serveur
// Ce dernier écoutera sur le port 48880
EthernetServer server(48880);
void setup()
{
  // On démarre la voie série pour déboguer
  Serial.begin(9600);
  char erreur = 0;
  // On démarre le shield Ethernet SANS adresse ip (donc donnée via DHCP)
  erreur = Ethernet.begin(mac);
  if (erreur == 0) {
    Serial.println("Parametrage avec ip fixe...");
    // si une erreur a eu lieu cela signifie que l'attribution DHCP
    // ne fonctionne pas. On initialise donc en forçant une IP
    Ethernet.begin(mac, ip);
  }
  Serial.print("Init...");
  // Donne une seconde au shield pour s'initialiser
  delay(1000);
  // On lance le serveur
  server.begin();
  Serial.println("Pret !");
  //config des entrees sorties
  pinMode(relaislumiere, OUTPUT);
  digitalWrite(relaislumiere, HIGH); // je suis tout a l'envers
  pinMode(relaisportail, OUTPUT); // la aussi
  digitalWrite(relaisportail, HIGH);
  // Configuration de la broche button en tant qu'entree numerique
  //pinMode(button1,INPUT);
  pinMode(button2, INPUT);
}
/////////////////////////////////////////////////////////////////
void loop()
{

  //Gestion reception commande portail
  // listen for incoming clients
  EthernetClient client = server.available();

  if (client) {
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        //reads URL string from $ to first blank space
        if (incoming && c == ' ') {
          incoming = 0;
        }
        // // // // // // // //
        if (c == '

Le principe est simple; j'envoie une requête http://.............:monport/$2, l'arduino l'interprete et exécute les actions associées.

Dans mon cas ,le /$2 doit activer le relais pendant 800ms puis se désactiver.
La carte du portail possède une entrée spécial qui permet de démarrer un cycle définie d'ouverture quand cette entrée est activé.

Je n'ai pas de problème de ce coté la ,mais plutot du coté gestion de la requete et reaction du navigateur on va dire.

Actuellement ,j'envoie ma requete via navigateur du pc avec un http:/moniplocal:monport/$2 ,l'arduino reçois l'ordre car j'entends le relais coller puis decoller ,mais le navigateur reste attendre une information ,
Donc j'en déduis que l'arduino n'envois pas ce que le navigateur attends.
Si je stop le navigateur ,mon relais recolle une deuxième fois et il ne le faut pas.Il y a quelque chose que je ne comprend pas.

J'ai essayer de placer :

client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");

mais je ne sais pas en quelle position le mettre.

j'ai aussi essayer de deplacer le client.stop();

Voici la boucle loop :

void loop()
{

  //Gestion reception commande portail
  // listen for incoming clients
  EthernetClient client = server.available();

  if (client) {
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        //reads URL string from $ to first blank space
        if (incoming && c == ' ') {
          incoming = 0;
        }
        // // // // // // // //
        if (c == '

) {
         incoming = 1;
       }
       // // // // // // // //

//Checks for the URL string $1 or $2
       if (incoming == 1) {
         Serial.println(c);
         {
           // // // // // // // // // // // // // // // //
           if (c == '1') {
             Serial.print("Demande par gps reçu");
             digitalWrite(relaisportail, LOW);
             delay(800);
             digitalWrite(relaisportail, HIGH);
             portail = 1;
           }
           // // // // // // // //
           if (c == '2') {
             Serial.print("Demande manuelle");
             digitalWrite(relaisportail, LOW);
             delay(800);
             digitalWrite(relaisportail, HIGH);
             portail = 1;
             break;
           }
       
         if (c == '\n') { // je ne comprends pas  son utilité
           // you're starting a new line
           currentLineIsBlank = true;

}
         else if (c != '\r') {  // je ne comprends pas  son utilité
           // you've gotten a character on the current line
           currentLineIsBlank = false;

// // // // // // // //

}
         }
       }
     }

}
   delay(10);
   // close the connection:
   client.stop();
 }

//Gestion interrupteur lumiere
 etatInterrupteur = digitalRead(button2);// lecture de l'état du bouton

if (etatInterrupteur == !memo) {    //si changement etat inter, demarrage routine
   routine = 1;
   memo = etatInterrupteur; //enregistre dernier etat inter
 }

// si demande ouverture portail reçu

if (portail == 1) {
   routine = 1; // je veux aussi la lumiere
   digitalWrite(relaisportail, LOW);
   delay(800);
   digitalWrite(relaisportail, HIGH);
   portail = 0 ;
 }
 // demarrage temporisation lumiere
 if (routine == 0) {
   digitalWrite(relaislumiere, HIGH);
 }
 if (routine == 1) {
   digitalWrite(relaislumiere, LOW);
   delay(60000);
   digitalWrite(relaislumiere, HIGH);
   routine = 0;
 }

}


Le principe est simple; j'envoie une requête http://.............:monport/$2, l'arduino l'interprete et exécute les actions associées.

Dans mon cas ,le /$2 doit activer le relais pendant 800ms puis se désactiver.
La carte du portail possède une entrée spécial qui permet de démarrer un cycle définie d'ouverture quand cette entrée est activé. 

Je n'ai pas de problème de ce coté la ,mais plutot du coté gestion de la requete et reaction du navigateur on va dire.

Actuellement ,j'envoie ma requete via navigateur du pc avec un http:/moniplocal:monport/$2 ,l'arduino reçois l'ordre car j'entends le relais coller puis decoller ,mais **le navigateur reste attendre une information** ,
Donc j'en déduis que l'arduino n'envois pas ce que le navigateur attends.
Si je stop le navigateur ,mon relais recolle une deuxième fois et il ne le faut pas.Il y a quelque chose que je ne comprend pas.

J'ai essayer de placer :

§DISCOURSE_HOISTED_CODE_1§


mais je ne sais pas en quelle position le mettre.

j'ai aussi essayer de deplacer le client.stop();

Voici la boucle loop :

§DISCOURSE_HOISTED_CODE_2§


) {
          incoming = 1;
        }
        // // // // // // // //

        //Checks for the URL string $1 or $2
        if (incoming == 1) {
          Serial.println(c);
          {
            // // // // // // // // // // // // // // // //
            if (c == '1') {
              Serial.print("Demande par gps reçu");
              digitalWrite(relaisportail, LOW);
              delay(800);
              digitalWrite(relaisportail, HIGH);
              portail = 1;
            }
            // // // // // // // //
            if (c == '2') {
              Serial.print("Demande manuelle");
              digitalWrite(relaisportail, LOW);
              delay(800);
              digitalWrite(relaisportail, HIGH);
              portail = 1;
              break;
            }
         
          if (c == '\n') { // je ne comprends pas  son utilité
            // you're starting a new line
            currentLineIsBlank = true;

          }
          else if (c != '\r') {  // je ne comprends pas  son utilité
            // you've gotten a character on the current line
            currentLineIsBlank = false;

            // // // // // // // //

          }
          }
        }
      }

    }
    delay(10);
    // close the connection:
    client.stop();
  }

) {
         incoming = 1;
       }
       // // // // // // // //

//Checks for the URL string $1 or $2
       if (incoming == 1) {
         Serial.println(c);
         {
           // // // // // // // // // // // // // // // //
           if (c == '1') {
             Serial.print("Demande par gps reçu");
             digitalWrite(relaisportail, LOW);
             delay(800);
             digitalWrite(relaisportail, HIGH);
             portail = 1;
           }
           // // // // // // // //
           if (c == '2') {
             Serial.print("Demande manuelle");
             digitalWrite(relaisportail, LOW);
             delay(800);
             digitalWrite(relaisportail, HIGH);
             portail = 1;
             break;
           }
       
         if (c == '\n') { // je ne comprends pas  son utilité
           // you're starting a new line
           currentLineIsBlank = true;

}
         else if (c != '\r') {  // je ne comprends pas  son utilité
           // you've gotten a character on the current line
           currentLineIsBlank = false;

// // // // // // // //

}
         }
       }
     }

}
   delay(10);
   // close the connection:
   client.stop();
 }

//Gestion interrupteur lumiere
 etatInterrupteur = digitalRead(button2);// lecture de l'état du bouton

if (etatInterrupteur == !memo) {    //si changement etat inter, demarrage routine
   routine = 1;
   memo = etatInterrupteur; //enregistre dernier etat inter
 }

// si demande ouverture portail reçu

if (portail == 1) {
   routine = 1; // je veux aussi la lumiere
   digitalWrite(relaisportail, LOW);
   delay(800);
   digitalWrite(relaisportail, HIGH);
   portail = 0 ;
 }
 // demarrage temporisation lumiere
 if (routine == 0) {
   digitalWrite(relaislumiere, HIGH);
 }
 if (routine == 1) {
   digitalWrite(relaislumiere, LOW);
   delay(60000);
   digitalWrite(relaislumiere, HIGH);
   routine = 0;
 }

}


Le principe est simple; j'envoie une requête http://.............:monport/$2, l'arduino l'interprete et exécute les actions associées.

Dans mon cas ,le /$2 doit activer le relais pendant 800ms puis se désactiver.
La carte du portail possède une entrée spécial qui permet de démarrer un cycle définie d'ouverture quand cette entrée est activé. 

Je n'ai pas de problème de ce coté la ,mais plutot du coté gestion de la requete et reaction du navigateur on va dire.

Actuellement ,j'envoie ma requete via navigateur du pc avec un http:/moniplocal:monport/$2 ,l'arduino reçois l'ordre car j'entends le relais coller puis decoller ,mais **le navigateur reste attendre une information** ,
Donc j'en déduis que l'arduino n'envois pas ce que le navigateur attends.
Si je stop le navigateur ,mon relais recolle une deuxième fois et il ne le faut pas.Il y a quelque chose que je ne comprend pas.

J'ai essayer de placer :

§DISCOURSE_HOISTED_CODE_1§


mais je ne sais pas en quelle position le mettre.

j'ai aussi essayer de deplacer le client.stop();

Voici la boucle loop :

§DISCOURSE_HOISTED_CODE_2§

J'ai fais du ménage dans la boucle loop.

Mon navigateur attends toujours quelque chose

void loop()
{

  //Gestion reception commande portail
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        //reads URL string from $ to first blank space
        if (incoming && c == ' ') {
          incoming = 0;
        }
        if (c == '

) {
          incoming = 1;
        }

//Checks for the URL string $1 or $2
        if (incoming == 1) {
          Serial.println(c);

if (c == '2') {
            Serial.println("Demande ouverture portail GPS");
            digitalWrite(relaisportail, LOW);
            delay(1000);
            digitalWrite(relaisportail, HIGH);
          }

}
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
  }
}