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§