est-ce un problème de code ou de matériel ?

Bonjour à tous,

Voila je suis nouveau sur ce forum, et j'ai commencé un projet semi-domotique dans ma chambre. Ce projet consiste à commander des prises, des lampes, un volet roulant ... Pour cela j'avais commencé à installer un automate programmable industriel. Cela fonctionne mais n'est pas très ludique, en effet pour allumer ou éteindre les différents composants je doit faire un certain nombre d'impulsions sur un bouton poussoir. Donc pour résoudre ce problème j'ai pensé relié ce système au web, avoir une page html pour contrôler le tout et donc je me suis tourné vers l'arduino Uno Rev 3 + ethernet shield qui va avec. Après quelque test, j'ai réussi à pondre un commencement de code pour contrôler deux leds à partir d'un page html créé par l'arduino. Seulement des que j'essaye d'en contrôler 3 le code ne fonctionne plus, je ne peu plus rien contrôler.

c'est pourquoi aujourd'hui je fais appelle à vous, cela fait plus d'un mois que je cherche des morceau de code, des solutions,.... partout sur le web dans des livres ... seulement rien ne résout mon problèmes.

Voici mon script pour contrôler 2 leds: controle 2 led arduino - Pastebin.com
et voici celui pour en contrôler 3 : contrôle 3 led arduino - Pastebin.com

Je vous remercie d'avance.
Cordialement,
Colben

Salut,

Je ne suis pas allé lire ton code dans le détail, mais je me demande si dans ta version
3 leds tu n'as pas un conflit avec le SPI.

L'éthernet Shield utilise les pins 4 (CS de la SD Card) 10 (CS du chip ethernet) et 11, 12, 13
qui sont MOSI MISO SCK pour le SPI.

Tu défini pin9 à 11 et tu l'as configure en INPUT alors qu'elle
corresponds à MOSI utilié en sortie pour le SPI lié à l'éthernet shield.

Peux-tu vérifier ça ?

Bonjour,

Il y a effectivement conflit entre le port SPI et les broches des leds dans le second code.
Utilise des broches autre que 0/1 (port série) et 10/11/12/13 (port SPI) et ton programme devrait marcher.

Bonjour,

J'ai essayé d'appliqué vos conseils mais cela ne fonctionne pas plus. Et d'ailleurs je suis bien embêté car je comptais utilisé tout les pins que j'ai déclaré car je dois communiqué avec un automate et pour se faire je contait mettre en oeuvre un système de langage sur 4 pins (4 pin de sortie, 4 pins d'entrée). Auriez-vous aussi un conseil la dessus qui ne soit pas trop coûteux?

Cordialement,
Thibault BOULLIER.

Le plus simple pour avoir une vue d'ensemble des broches utilisées/utilisables est de faire un tableau.

Pour le moment je vois :
D13 -> SCK (SPI)
D12 -> MISO (SPI)
D11 -> MOSI (SPI)
D10 -> SS_ethernet (SPI)
D9 ->
D8 ->
D7 ->
D6 ->
D5 ->
D4 -> SS_carteSD (SPI)
D3 ->
D2 ->
D1 -> Port série
D0 -> Port série
A0 ->
A1 ->
A2 ->
A3 ->
A4 ->
A5 ->
(les broches Ax peuvent être utilisé en mode "numérique" classique)

Si j'ai bien compris il te faut 8 broches libres pour ton programme ?
Est-ce qu'il te faut d'autre broches ?

Bonjour,

En effet, j'ai bien besoin de 8 broches et je n'avais pas pensé au broches analogiques autant pour moi. je refait mon code re-teste et vous ferais part de l'avancement de tout ceci. Et encore merci de m'aider la dessus.

Cordialement,
Thibault BOULLIER

RE-POST:

J'ai changé mes déclarations, j'ai pris les sortie au pin 2,3,5,6 et mes entrées sur A0,A1,A2,A3. mais sa ne fonctionne toujours pas mieux je ne sait plus quoi faire. Auriez-vous une idée ?

Cordialement,
Thibault BOULLIER

RE-POST:

Il n'y aurais pas moyen de faire cela a l'aide de matrice ? Si oui, Pouvez-vous m'en dire plus sur les matrices ?
Et après des tests j'ai remarqué que si il y avait plus de 4 conditions sa ne fonctionnait plus. Bizarre

Cordialement,
Thibault BOULLIER

Bonjour,

Je me permet un petit up :blush: pour faire remonter le sujet car j'ai re-post mais sa ne le fait pas remonter.

Cordialement,
Thibault BOULLIER

  1. valider le montage : est-ce que le boutons marchent (physiquement) ?
  2. le code complet serait pratique pour savoir où est le problème :wink:

Le câblage fonctionne car je n'ais pas mis d'interrupteurs mais que des leds pour le moment, et les leds fonctionnent j'ai réussit à les faire clignoter. Pour le programme le voici: Arduino code chambre - Pastebin.com

Ya des trucs qui sont pas tiptop :wink:

  • les variables pin1, pin2, pin3 ... servent à rien (ou alors fait des variables const et utilisent les partout dans le code)
  • toutes les chaines de caractères devrait être en mémoire flash avec F("blabla")
  • donne un coup de CTRL+T pour indenter le code, en l'état c'est vraiment difficile à lire

Ensuite quel est le problème exactement ? J'ai regardé le code mais j'ai rien vu de particulier ...

mon problème exact c'est que je charge mon programme dans l'arduino sauf que quand je clique sur l'un de mes boutons sur ma page rien de se passe peut importe le bouton hors quand je refait le code pour seulement 2 leds tout fonctionne à merveille et je ne comprend pas pourquoi.

et je n'ai pas compris mes variable pin2, pin3, ... servent bien a quelque chose et je m'en sert dans tout mon code.
et pour les chaîne de caractères je n'ais pas compris se que tu a voulu me dire.

colben:
mon problème exact c'est que je charge mon programme dans l'arduino sauf que quand je clique sur l'un de mes boutons sur ma page rien de se passe peut importe le bouton hors quand je refait le code pour seulement 2 leds tout fonctionne à merveille et je ne comprend pas pourquoi.

Ok, sinon change de technique : utilise une librairie de webserver toute prête :

Au moins comme ça tu éviteras tout problème de protocole.
Tu as un exemples de led + bouton ici :

colben:
et je n'ai pas compris mes variable pin2, pin3, ... servent bien a quelque chose et je m'en sert dans tout mon code.

Déjà tes variables ne sont pas constantes (mot clef "const"), ensuite tu as des pinMode() avec juste des chiffres et des pinMode() avec tes variables.
Du coup regarde pour la pin 4, tu te retrouve avec deux pinMode(4, OUTPUT) c'est pas génial.

colben:
et pour les chaîne de caractères je n'ais pas compris se que tu a voulu me dire.

"blabla" -> F("blabla")
En faisant ça tu évites que ces chaines de caractères soit en mémoire RAM et viennent tout faire planter.

Bonsoir,

Apres maintes tentatives pour comprendre la bibliothèque webduino, je revient demander de l'aide. Car je ne comprend pas comment m'en servir malgré les exemples fourni avec. Surtout je ne comprend pas comment récupérer l'information d'un GET (ou d'un POST) venant de la page et plus particulièrement de bouton. Pourriez-vous m'indiquer des explications en français car l'anglais n'est pas du tout mon fort malheureusement =(.

Cordialement,
colben.

Ce topic devrait t'aider à comprendre, pour le GET du moins :wink:
http://forum.arduino.cc/index.php?topic=154925.0
(bien lire du début)

Après quelque semaine d'épreuves je me suis remis à mon code, seulement je suis un peu perdu car j'ai essayé de comprendre se que tu m'as envoyer par le lien et voici un morceau de code très incomplet que j'ai "pondu" :

#include "SPI.h"
#include "Ethernet.h"
#include "WebServer.h"
#include "stdio.h"

static uint8_t mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0xF0, 0xA4 };
static uint8_t ip[] = { 192, 168, 1, 30 };

#define PREFIX "/utilisateur"
WebServer webserver(PREFIX, 80);


#define LED_1 2

char toggle = 0;

void REQ(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
{
  if (type == WebServer::GET)
  {
    P(message)=
    "<html><head><title>Chambre de thibault</title></head>"
    "<body>"
    "
<hr />"
    "<h1><div align='center'>"
    "<font color='#2076CD'>Chambre de thibault BOULLIER "
    "</font></div></h1>"
    "<hr />
"
    "
"
    "<form method=get>"
    "<input type=submit name=ref value='refresh'>"
    "</form></td>"
    "<div align='left'>"
    "
"
    "<table border='1' width='500' cellpadding='5'>"
    "<tr bgColor='#222222'>"
    "<td bgcolor='#222222'>"
    "<font face='Verdana' color='#CFCFCF' size='2'>"
    "led 2
</font></td>"
    "<td align='center' bgcolor='#222222'>"
    "<form method=get>"
    "<input type=submit name=2 value='allumer'>"
    "</form></td>"
    "<td align='center' bgcolor='#222222'>"
    "<form method=get>"
    "<input type=submit name=2 value='eteindre'>"
    "</form></td>"
    "<td align='center'>"
    "<font color='green' size='5'>ON");
    "</font></td></tr>"
    "<tr bgColor='#222222'>"
    "<td bgcolor='#222222'>"
    "<font face='Verdana' color='#CFCFCF' size='2'>"
    "led 3
</font></td>"
    "<td align='center' bgcolor='#222222'>"
    "<form method=get><input type=submit name=3 value='allumer'></form></td>"
    "<td align='center' bgcolor='#222222'>"
    "<form method=get><input type=submit name=3 value='eteindre'></form></td>"
    "<td align='center'>"
    "<font color='green' size='5'>ON");
    "</font></td></tr>"
    "</table>"
    "
"
    "<form method=get>"
    "<input type=submit name=all value='tout eteindre'>"
    "</form>"
    "</body>";
    
    server.printP(message);


int main(int argc, char** argv) {
	double consigne, intervalle, p, i, d;
    int type ;
    
	if(argc == 1) return 1;
	
	if(sscanf(argv[1], "?%d", &req) == 6) {
		server.printf("req: %d\n", req);
    }
	
	return 0;	
    }
  }
}
void setup() {
  
}
void loop(){
  
}

pourrais-tu m'aider à le compléter ainsi qu'a l'améliorer? car comme je l'ais dit plus haut je suis perdu :~ (ah! maudite épreuves :0)

Aie aie aie ... tu n'as strictement rien compris au topic que je t'ai linké.

Bon, vu que tu n'arriveras manifestement pas à faire un formulaire commence petit avec un simple lien.
De plus ton code HTML est bourré (mais alors bourré de chez bourré) d'erreurs : balises fermantes oubliés, truc pas nette, ...

On reprend donc tout de zéro, voici un exemple simple à comprendre :

// Includes 
#include "SPI.h"
#include "Ethernet.h"
#include "WebServer.h"

// Param réseau
static uint8_t mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
static uint8_t ip[] = { 
  192, 168, 1, 30 };

// Déclaration du serveur web (port 80 sans préfix)
WebServer webserver("", 80);

// Fonction affichant la page d'acceuil
void defaultCmd(WebServer &server, WebServer::ConnectionType type, char *, bool)
{
  // Envoi le code HTTP 200
  server.httpSuccess();

  // Si la méthode est GET
  if (type == WebServer::GET)
  {
    P(message)=
      "<html>"
      "    <head>"
      "        <title>Page leds</title>"
      "    </head>"
      "    <body>"
      "        <table border='1'>"
      "            <tr>"
      "            <td>led 1</td>"
      "            <td><a href=\"action?action=1&led=1\">allumer</a></td>"
      "            <td><a href=\"action?action=0&led=1\">eteindre</a></td>"
      "            <td>ON</td>"
      "            </tr>"
      "            <tr>"
      "            <td>led 2</td>"
      "            <td><a href=\"action?action=1&led=2\">allumer</a></td>"
      "            <td><a href=\"action?action=0&led=2\">eteindre</a></td>"
      "            <td>ON</td>"
      "            </tr>"
      "            <tr>"
      "            <td></td>"
      "            <td><a href=\"action?action=1&led=0\">Tout allumer</a></td>"
      "            <td><a href=\"action?action=0&led=0\">Tout eteindre</a></td>"
      "            <td></td>"
      "            </tr>"
      "        </table>"
      "    </body>"
      "</html>";

    // Envoi le texte de la page d'acceuil
    server.printP(message);
  }
}

// Fonction traitant une commande
void formCmd(WebServer &server, WebServer::ConnectionType type, char * urlTail, bool tailComplete)
{
  // Buffer pour les arguments
  char nameBuf[16], valueBuf[16];
  int nameLen = 16, valueLen = 16;

  // Action à réaliser
  byte action = 0; // 0 = eteindre, 1 = allumer

  // Traite tout les arguments dans l'ordre d'apparition
  while (server.nextURLparam(&urlTail, nameBuf, nameLen, valueBuf, valueLen)) {

    // Si c'est "action=xxx"
    if (strcmp(nameBuf, "action") == 0) {

      // Traite la valeur
      switch(valueBuf[0]) {
      case '0':
        action = 0;
        break;

      case '1':
        action = 1;
        break;

      default:
        return;
      }

      // Si c'est "led=xxx"
    } 
    else if (strcmp(nameBuf, "led") == 0) {

      // Traite la valeur
      switch(valueBuf[0]) {
      case '0':
        // Allume ou éteint toute les leds
        break;

      case '1':
        // Allume ou éteint la led 1
        break;

      case '2':
        // Allume ou éteint la led 2
        break;

      default:
        return;
      }

      // Si c'est autre chose
    } 
    else {
      return;
    }

    // Reset des tailles de buffer pour la boucle suivante
    nameLen = 16, valueLen = 16;
  }
}

void setup()
{
  Ethernet.begin(mac, ip);

  webserver.setDefaultCommand(&defaultCmd);
  webserver.addCommand("action", &formCmd);

  webserver.begin();
}

void loop()
{
  char buff[64];
  int len = 64;

  webserver.processConnection(buff, &len);
}

Quand tu auras compris le principe tu pourras changer le code pour utiliser un formulaire.
Mais pour le moment fait marcher la version simple :wink:

Pour plus tard :

Bonsoir,

Ayant fini mes épreuves, je me suis repenché sur le code, et voila se que j'ai fait à partir de ce que tu m'as communiquer:

// Includes 
#include "SPI.h"
#include "Ethernet.h"
#include "WebServer.h"

// Param réseau
static uint8_t mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
static uint8_t ip[] = { 
  192, 168, 1, 30 };

// Déclaration du serveur web (port 80 sans préfix)
WebServer webserver("", 80);

// Fonction affichant la page d'acceuil
void defaultCmd(WebServer &server, WebServer::ConnectionType type, char *, bool)
{
  // Envoi le code HTTP 200
  server.httpSuccess();

  // Si la méthode est GET
  if (type == WebServer::GET)
  {
    P(message)=
      "<html>"
     "<head><title>Chambre </title></head>"
    "<body>"
    "
<hr />"
    "<h1><div align='center'>"
    "<font color='#2076CD'>Chambre"
    "</font></div></h1>"
    "<hr />
"
    "
"
    "</td>"
    "<div align='left'>"
    "
"
    "<table border='1' width='500' cellpadding='5'>"
    "<tr bgColor='#222222'>"
    "<td bgcolor='#222222'>"
    "<font face='Verdana' color='#CFCFCF' size='2'>"
    "led 2
</font></td>"
    "<td align='center' bgcolor='#222222'>"
    "<form method=get>"
    "<input type=submit name=action value='1'>"
    "</form></td>"
    "<td align='center' bgcolor='#222222'>"
    "<form method=get>"
    "<input type=submit name=action value='0'>"
    "</form></td>"
    "<td align='center'>"
    "<font color='green' size='5'>ON"
    "</font></td></tr>"
    "</table>"
    "
"
    "<form method=get>"
    "<input type=submit name=all value='tout eteindre'>"
    "</form>"
    "</body>"
      "</html>";

    // Envoi le texte de la page d'acceuil
    server.printP(message);

  }
}

// Fonction traitant une commande
void formCmd(WebServer &server, WebServer::ConnectionType type, char * urlTail, bool tailComplete)
{
  // Buffer pour les arguments
  char nameBuf[16], valueBuf[16];
  int nameLen = 16, valueLen = 16;
  
  int LED_1 = 2;
  pinMode (LED_1, OUTPUT);

  // Action à réaliser
  byte action = 0; // 0 = eteindre, 1 = allumer

  // Traite tout les arguments dans l'ordre d'apparition
  while (server.nextURLparam(&urlTail, nameBuf, nameLen, valueBuf, valueLen)) {

    // Si c'est "action=xxx"
    if (strcmp(nameBuf, "action") == 0) {

      // Traite la valeur
      switch(valueBuf[0]) {
      case '0':
        digitalWrite (LED_1, LOW);
        break;

      case '1':
        digitalWrite (LED_1, HIGH);
        break;

      default:
        return;
      }

    } 

    else {
      return;
    }

    // Reset des tailles de buffer pour la boucle suivante
    nameLen = 16, valueLen = 16;
  }
      server.printP(nameBuf);
}

void setup()
{
  Ethernet.begin(mac, ip);

  webserver.setDefaultCommand(&defaultCmd);
  webserver.addCommand("action", &formCmd);

  webserver.begin();
}

void loop()
{
  char buff[64];
  int len = 64;

  webserver.processConnection(buff, &len);
  
}

seulement voila sa ne fonctionne pas y aurai-t-il des chose fausse dedans et est-ce que la syntaxe est clair et bien faite ?

Cordialement,

Ça compile au moins ?
Si oui ajoute des Serial.println("x"); un peu partout pour voir où ça plante.