[ Arduino 803 ] Arduino et Ethernet : serveur

Dans ce chapitre, l’Arduino sera maintenant responsable de l’envoi des données vers le monde extérieur. On dit qu’elle agit en serveur. Ce sera donc un outil externe (logiciel particulier, navigateur etc) qui viendra l’interroger et à ce moment-là elle renverra les informations demandées. On pourra aussi, via un site externe, lui envoyer des ordres pour faire des actions.

Préparer l’Arduino

L’utilisation de l’Arduino en mode serveur est sûrement plus courante que celle en client. Cette partie devrait donc particulièrement vous intéresser.
Deux grands rôles peuvent être accomplis :

  • L’envoi de données à la demande (l’utilisateur vient demander les données quand il les veut) :
  • La réception d’ordre pour effectuer des actions.

Ces deux rôles ne sont pas exclusifs, ils peuvent tout à fait cohabiter ensemble. Mais dans un premier temps, reparlons un peu de ce qu’est un serveur.

Nous l’avons vu dans le premier chapitre, un serveur est chargé de réceptionner du trafic, l’interpréter puis agir en conséquence. Pour cela, il possède un port particulier qui lui est dédié. Chaque octet arrivant sur ce port lui est donc destiné. On dit que le serveur écoute sur un port.

C’est donc à partir de cela que nous allons pouvoir mettre en place notre serveur !

Comme pour le client, il va falloir commencer par les options du shield (MAC, IP…) afin que ce dernier puisse se connecter à votre box/routeur.
On retrouve donc un setup similaire au chapitre précédent :

Bien. Au chapitre précédent cependant nous avions des variables concernant le client. Ici, de manière similaire nous aurons donc des variables concernant le serveur.
La première et unique nouvelle chose sera donc une variable de type EthernetServer qui prendra un paramètre : le port d’écoute. J’ai choisi 4200 de manière un peu aléatoire, car je sais qu’il n’est pas utilisé sur mon réseau. Une liste des ports les plus souvent utilisés peut être trouvée sur Wikipédia.

Puis, à la fin de notre setup il faudra démarrer le serveur avec la commande suivante :

En résumé, on aura donc le code suivant pour l’initialisation :

Et voila, votre serveur Arduino est en train de surveiller ce qui se passe sur le réseau !

Répondre et servir des données

Maintenant que le serveur est prêt et attend qu’on lui parle, on va pouvoir coder la partie « communication avec le demandeur ».
La première étape va être de vérifier si un client attend une réponse de la part de notre serveur. On va donc retrouver notre objet EthernetClient vu au chapitre précédent et une fonction du serveur que l’on aurait presque pu deviner : available()

Ensuite les choix sont simples. Soit un client (donc une application externe) est connecté avec l’Arduino et veut interagir, soit il n’y a personne et donc on ne fait… rien (ou autre chose). Pour cela, on va simplement regarder si client vaut autre chose que zéro. Si c’est le cas, alors on traite les données.

Maintenant, on va faire au plus simple. On va considérer que l’on renvoie toujours les mêmes informations : la valeur de l’entrée analogique 0 et la variable millis(), quelque soit la requête du client. On va alors se retrouver dans le cas similaire au chapitre précédent ou il faudra simplement construire une requête pour renvoyer des données.
Comme j’aime les choses simples, j’ai décidé de ne pas renvoyer une page web (trop verbeux) mais juste du texte au format JSON qui est simple à lire et à fabriquer.

Le HTML demande BEAUCOUP trop de contenu texte à envoyer pour afficher une information utile. Soyons clair, un système embarqué comme Arduino n’est pas fait pour afficher des pages web, il faut pouvoir renvoyer des informations de manière simple et concise.

Il faudra comme pour le client commencer par renvoyer un header. Le notre sera simple et possèdera seulement deux informations : Le protocole utilisé avec le code de retour (encore http 1.1 et 200 pour dire que tout c’est bien passé) ainsi que le type mime du contenu renvoyé (en l’occurrence « application/json »). (Si vous renvoyez de l’html ce serait « text/html » par exemple).

Une fois le header envoyé, on construit et envoie notre réponse json. C’est assez simple, il suffit de bien former le texte en envoyant les données dans le bon ordre avec les bons marqueurs.

On a presque fini !

Une fois la réponse envoyée, on va faire une toute petite pause pour laisser le temps aux données de partir et enfin on fera le canal de communication avec le client.

Et voilà !

Il est maintenant temps de tester. Branchez votre Arduino, connectez-la au réseau et allez sur la page ip:port que vous avez paramétré avec votre navigateur (en l’occurrence http://192.168.0.143:4200/ pour moi). Si tout se passe bien, aux valeurs près vous obtiendrez quelque chose de similaire à ceci :

Génial non ?

Voici le code complet pour faire tout cela :

S’il faut encore vous convaincre, sachez que cet exemple affiche environ 50 caractères, donc 50 octets (plus le header) à envoyer. La même chose en html proprement formaté aurait demandé au grand minimum le double.

Agir sur une requête plus précise

Nous savons maintenant envoyer des données vers notre shield, mais il pourrait être sympa de pouvoir en interpréter et ainsi interagir avec le shield. Voyons voir comment, mais avant tout un petit avertissement :

On ne va pas se mentir, faire cela demande un peu de bidouille car il faut être à l’aise avec la manipulation de chaîne de caractères. Ce type de code est difficilement généralisable ce qui signifie qu’il faut bien souvent développer pour son cas précis. Ce qui sera exposé ici sera donc un « exemple d’application pour faire comprendre ».

Notre objectif va être simple, on doit être capable de recevoir et interpréter les choses suivantes :

  • Un premier paramètre sera « b » signifiant « broches ». Il indiquera l’état des broches 3, 4, 5. Si une broche est dans la liste, alors elle est à 1, sinon 0
  • Un second paramètre sera « p » et indiquera le rapport cyclique (entier entre 0 et 255) d’une pwm sur la broche 6.
  • Enfin, dans tous les cas on renvoie un json possédant les informations suivantes :
    • L’uptime de l’Arduino (millis)
    • L’état des broches 3, 4 et 5
    • La valeur de la PWM de la broche 6
    • La lecture analogique de la broche A0

Démarrons par la fin et avec les choses simples, une fonction pour renvoyer le json.

En cadeau voici le schéma !

Ethernet

Ethernet schema

Répondre à la requête

On l’a vu plus tôt, répondre à une requête n’est pas très compliqué et construire un json non plus. Je vais donc simplement vous poster le code de la fonction repondre() avec des commentaires en espérant que cela suffise. Rien de nouveau par rapport aux choses vues ci-dessus.

Lire la requête

Lorsque l’on reçoit une requête, il faut la traiter. Avez-vous essayé de faire un Serial.print() des caractères reçus lors des demandes ? Vous pouvez remarquer que la première ligne est toujours « GET /… HTTP/1.1 ». Avec GET qui est « l’action », /... l’url demandée et HTTP/1.1 le protocole utilisé, on a tout ce qu’il faut pour (ré)agir ! Par exemple, si on reçoit la requête GET /?b=3,4&p=42 HTTP/1.1, on aura « juste » à traiter la demande pour extraire le numéro des broches à allumer (3 et 4 mais pas 5) et la valeur du rapport cyclique à appliquer pour la PWM (42).
Voyons comment faire.

Preparation

Tout d’abord, on va réserver un tableau de caractères pour le traitement des données. Dans notre cas, 100 caractères devraient largement faire l’affaire. On va aussi déclarer quelques variables pour stocker l’état des broches à changer.

Une fois cela fait, nous allons devoir passer à la récupération de la premiere chaîne envoyée par le client.

Récuperer l’URL

C’est parti, faisons notre loop ! On va commencer comme avant, en allant lire la présence d’un client.

Si un client est présent, on va regarder s’il a des données à nous donner tant qu’il est connecté (car s’il se déconnecte pas la peine de perdre du temps avec lui !).

Maintenant que l’on sait que le client est là et nous parle, on va l’écouter en lisant les caractères reçus.

Interpréter l’URL

Maintenant que nous avons la chaîne du client, il faut l’interpreter pour lire les valeurs des paramètres.
Tout d’abord, on commencera par remettre les anciens paramètres à zéro. Ensuite, on va parcourir les caractères à la recherche de marqueur connu : b et p. Ce n’est pas ce qu’il y a de plus simple, mais vous allez voir avec un peu de méthode on y arrive !
Rappel : Nous cherchons à interpréter GET /?b=3,4&p=42 HTTP/1.1

PS : le code est « volontairement » un peu plus lourd car je fais des tests évitant les problèmes si quelqu’un écrit une URL un peu farfelue (sans le « b » ou le « p »).

Agir sur les broches

Lorsque toutes les valeurs sont reçues et interprétées, il ne reste plus qu’à les appliquer à nos broches. Vu ce que l’on vient de faire, c’est de loin le plus facile !

On assemble !!

Il ne reste plus qu’à enchaîner toutes nos fonctions pour avoir un code complet !!

Code complet

Secret SelectionnerAfficher

Sortir de son réseau privé

À ce stade, nous arrivons à récupérer des informations et donner des ordres à notre Arduino. Cependant, on est bloqué dans notre réseau local. En effet, si vous essayez d’y accéder depuis un autre ordinateur à l’autre bout du monde, il est fort probable que cela ne marche pas…

Pour palier à cela, il va falloir faire un peu d’administration réseau. Je vais couvrir la démarche ici mais ne rentrerai pas trop dans les détails car ce n’est pas non plus le but de ce tutoriel. Je partirai aussi du principe que vous êtes à votre domicile et utilisez une box ou un routeur que vous pouvez administrer.

L’opération que nous allons faire ici s’appelle une redirection NAT (Network address translation). Mais tout d’abord, essayons de comprendre le problème.

Le souci

Le problème dans l’état actuel c’est que votre box laisse passer le trafic vers l’extérieur, accepte les réponses, mais ne tolère pas trop qu’on accède directement à son adresse sur n’importe quel port. En effet, après tout c’est logique. Imaginez que vous avez plusieurs équipements connectés a votre routeur/box. Si vous essayez d’y accéder depuis l’extérieur, comment cette dernière saura à quel matériel vous souhaitez accéder ?

Dans votre réseau local, chaque appareil à sa propre adresse IP qui le représente localement. Cette adresse est très souvent de la forme 192.168.0.xyz. Vous pourriez avoir par exemple votre téléphone en 192.168.0.142, votre ordinateur en 192.168.0.158 et votre Arduino en 192.168.0.199. Votre box (qui gère ce réseau local) possède quant à elle une IP publique. C’est cette IP qui la représente aux yeux du monde. Admettons, pour l’exemple, que cette adresse soit 42.128.12.13 (trouvez la vôtre avec un service comme my-ip.com). Si vous cherchez à accéder à l’adresse publique avec le port 4200 en espérant atteindre votre Arduino vous serez déçus. En effet, vous allez bien atteindre votre box, mais cette dernière n’aura aucune idée de quel équipement doit être interrogé ! Est-ce votre ordinateur ? votre smartphone ? votre Arduino ?

Il va donc falloir lui expliquer…

Sa solution

Chaque constructeur de box/routeur possède sa propre interface. Je vais essayer d’être le plus générique possible pour que les explications parlent au plus grand nombre, mais ne m’en voulez pas si toutes les dénominations ne sont pas exactement comme chez vous !

Et cette explication s’appelle une redirection NAT, ou redirection de port. En faisant cela, vous expliquerez à votre box que « tout le trafic qui arrive sur ce port particulier doit être envoyé sur cet équipement local » (et vous pouvez même rerouter le trafic pour le changer de port si vous voulez).

Mettons cela en place. Pour cela, commencez par aller dans l’interface d’administration de votre box (souvent c’est à l’adresse 192.168.0.1). Vous devez être dans le réseau local de la box pour le faire ! Ensuite, il vous faudra trouver la partie parlant de « NAT » ou de « redirection de port ».
Une fois dans cette dernière, il va falloir demander à ce que tout ce qui rentre dans le port 4200 (ou la plage 4200-4200) soit redirigé vers l’équipement « Arduino » (Wiznet) ou son adresse IP locale si vous la connaissez et que vous l’avez déjà imposée au routeur comme fixe.

Vous aurez alors quelque chose comme ça :

Réglages NAT

Réglages NAT

Sauvegardez et éventuellement redémarrez votre box (normalement ce n’est pas nécessaire, mais sur du vieux matériel ça peut arriver…). Maintenant démarrez votre Arduino avec un des programmes ci-dessus et essayez d’accéder à votre adresse publique et le port 4200 avec un navigateur internet. Normalement, l’Arduino devrait répondre comme si vous l’interrogiez avec son adresse locale !

Faire une interface pour dialoguer avec son Arduino

Pour terminer ce tutoriel, je vous propose de réaliser une petite interface de pilotage de l’Arduino via internet. Pour cela, on va garder le programme que nous avions dans l’Arduino pour le paragraphe concernant les requêtes avancées, et nous nous contenterons de simplement faire de l’html et du javascript. L’html servira à faire l’interface et le javascript fera les interactions via des requêtes ajax.

Avant toute chose, je vous ai menti ! Il faut en fait rajouter une petite ligne dans notre code de la fonction repondre() faite plus tôt. En effet, pour des raisons de sécurité les requêtes ajax ne peuvent pas aller d’un domaine à un autre (donc de « n’importe où sur le web » à « votre Arduino »). Il faut donc rajouter une ligne dans le header renvoyé pour signaler que l’on autorise le « cross-domain ».
Rajoutez donc cette ligne juste après le « content-type » :

Maintenant que cela est fait, nous allons créer une structure html toute simple pour avoir nos boutons.

Interface HTML

Interface HTML

Ensuite, un peu de javascript nous permettra les interactions. L’ensemble est grosso-modo divisé en deux fonctions importantes. setup() qui sera exécutée lorsque la page est prête puis executer() qui sera appelée à chaque fois que vous cliquez sur le bouton. Cette dernière fera alors une requête à votre Arduino et attendra la reponse json. La fonction afficher() utilisera alors les informations pour changer les composants html.
Comme vous pouvez le constater, toute la partie affichage est gérée de manière quasi-complètement indépendante de l’Arduino. Cela va nous permettre de transmettre un minimum de données et garder une souplesse maximale sur l’affichage. Si demain vous decidez de changer l’interface voire carrément de faire une application dans un autre langage, vous n’aurez pas besoin de toucher à votre Arduino car les données sont envoyées dans un format générique.

En cadeau de fin, une version utilisable en ligne de cette interface peut être trouvée ici : http://jsfiddle.net/f6c2kc11/5/. Pour l’utiliser il suffit simplement de modifier l’url de base avec votre ip publique et le port utilisé par l’Arduino.

Une version légèrement améliorée (mise en paramètre de l’ip:port de la cible) est ici : http://jsfiddle.net/f6c2kc11/7/

Magie de l’internet, votre Arduino fait maintenant partie de la grande sphère de l’IoT, le phénomène très à la mode de l’Internet of Things. Qu’allez-vous bien pouvoir envoyer comme informations dorénavant ?

Une expérience (bonne ou mauvaise) à partager ? Des questions à poser ? Des conseils à donner ? Ne soyez pas timide !

44 commentaires

  1. Bonsoir, tu fais du très bon boulot continue ainsi. Je voulais revenir sur la partie qui parle du NAT : je suis face à un souci d’adressage sur mon réseau local qui a comme adresse IP local de la forme 192.168.1.xyz, en attribuant manuellement une adresse IP sans laisser le router lui en attribuer une, (sachant que je l’utilise comme étant un serveur) je n’arrive pas à établir la communication à partir du client qui est FlexSim (logiciel sur mon PC  »client ») alors que dans le centre de recherche où je prépare mon PFE cela marche normalement (c’est juste pour prouver que le problème proviens de mon routeur) cela fait un mois que je suis bloqué, je ne peux pas travailler chez moi, donc pour tester n’importe quel programme je dois attendre que je soit au centre de recherche.

    Je sais que ce que tu a expliqué en haut concerne un accès depuis un réseau outre que le réseau local, mais sait-on jamais.

    Cordialement.

    • Oulah j’ai pas tout compris 🙁 Qui a quoi ? Quels équipements sont comment ? De ce que je comprend, tu as un réseau local. Ce dernier est de la forme 192.168.1.xyz. Dessus tu as un PC (qui marche point de vue réseau ?) et ton Arduino. Les deux peuvent communiquer ensemble a l’intérieur du réseau ? Si oui c’est deja bien, ca veut dire qu’il y a juste un souci de redirection de l’extérieur vers l’intérieur.

  2. Je suis navré, en voulant donner beaucoup de détails j’ai fini par tout bafouer. Je récapitule : j’attribue manuellement l’adresse IP de la carte Arduino (Serveur) par exemple 192.168.1.200, mon routeur a comme adresse IP 192.168.1.1. Pour le PC c’est le routeur qui lui en attribuera une grâce à son seveur DHCP. En testant tout cela dans le centre de recherche où je prépare mon PFE cela fonctionne normalement (je ne connais pas leur configuration du routeur), bref chez moi ça ne marche pas et je suis certain que c’est une histoire de redirection de l’extérieur vers l’intérieur comme tu viens de le dire, le hic c’est que je ne sais pas comment faire cela, c’est-à-dire comment régler le souci de redirection. J’ai un routeur Netgear WNDR4300.

    Une autre question : est-ce que le routeur doit être connecté au Web pour que cela fonctionne ? Ou bien je peut l’utiliser comme un switch ?

    Merci, bonne continuation :).

    • Une autre question : est-ce que le routeur doit être connecté au Web pour que cela fonctionne ? Ou bien je peut l’utiliser comme un switch ?

      Si tu veux juste travailler en local non ce n’est pas nécessaire.

      Pour le reste, il faut que tu ailles accéder aux paramètres de ton routeur. Ainsi, tu pourras lui demander d’imposer une adresse IP pour l’adresse MAC de l’Arduino (et comme ca ca passera outre le DHCP). Apres cela, pas besoin de redirection NAT étant donnée que tu restes sur ton réseau local normalement tout les ports sont accessibles directement.

  3. bonjour, je suis très intéressé par votre code arduino seulement quand je l’essaye de mon coté, tout d’abord j’ai du remplacer les ‘&lt’ et autres code html pour que cela soit correct mais un fois cela fais une erreur de compilation apparaît mais je n’arrive pas a savoir d’ou vient l’erreur et donc encore moins comment la résoudre. Avait vous une idée ? avez-vous eu des retour d’un problème similaire ?

    • J’ai réussi à résoudre mon problème mais un autres suit, cette fois ci je reçois bien la requête GET (GET /?b=3,4 HTTP/1.1) mais la console marque « Oups problème dans l’identification des broches » seulement je ne voit pas d’ou vient le problème étant donnée qu’il identifie bien la requête et qu’il identifie bien les broches à activer (Test avec un Serial.println) la seul sources de problème serait que l’index dépasse 100 mais pourquoi il dépasserait 100 ? Autre problème je reçois aussi de temps en temps une requête GET /favicon.ico après quelque recherche je sais ce que c’est mais je n’arrive pas à résoudre ou empêcher cette requête, quelqu’un aurait une idées ?

  4. Bonjour,

    Premièrement bravo pour ce tuto qui m’a fortement aidé

    Je suis face à un problème, j’ai une application en visual basic sur pc qui doit venir récupérer des données de mon serveur arduino via ethernet (arduino qui fait office d’automate pour une machine).

    Je n’arrive pas a initialiser le serveur sur la carte (atmega 2560) car avec votre code (pour voir si ma carte fonctionne), il me marque que dans le loop() « serveur » n’est pas déclaré. Est-ce normal?

    AI-je besoin de créer un driver pour communiquer entre mon application vb et mon arduino?
    Je précise que je travaille en local et que j’ai essayé deja bien des manières mais impossible de créer un serveur sur cette carte, mon application ne la reconnait pas.

    Merci d’avance pour votre aide

    • il me marque que dans le loop() “serveur” n’est pas déclaré. Est-ce normal?

      C’est étrange ca, car serveur est bien là dans mon code…

      Pourrais tu ouvrir un sujet sur le forum « Systèmes et Matériels » de Zeste de Savoir et y coller ton code Arduino (et éventuellement vb) pour pouvoir mieux comprendre où se situe le souci ?

      • Ha j’avais oublié de le « EthernetServer serveur(8080); » Autant pour moi désolé. *ho le boulet*

        Mais pourquoi je n’arrive pas a me connecter avec mon application? L’Arduino quant à lui force toujours une init sur l’IP définie. Cela peut-il venir de mon câble ethernet (relié en direct au PC et câble non croisé)?

        Mon code VB n’est pas parfait lui non plus mais pour me lier à l’arduino j’utilise le mode TCP cela est-il correct?

        Merci encore

        • Tu veux dire que tu utilises une connexion ethernet direct entre ton PC et ton Arduino ? Donc ton PC envoi une adresse IP à ton Arduino ou un truc du genre pour que les deux communiques ?

          N’oublie pas non plus de bien communiquer sur le bon port.

          • Pour mon projet je doit récupérer des informations d’un codeur de moto réducteur connecté à mon arduino via un module de commande MD25 (rien de compliqué pour le faire fonctionner car communication via librairie softwareserial)

            Mon soft (appli PC en vb.net créer par mes soins) se connecte à mon arduino par ethernet (contrainte imposée) pour récupérer les infos codeur et lui dire de lancer certains void en fonction des résultats. J’ai configuré mon projet de manière a avoir mon arduino en serveur et mon soft en client.

            Ex: si codeur1=<X et codeur2=<Y alors aller void n() sinon aller void m() et afficher résultats codeur sur l'appli.

            J'ai un peu de mal pour les faire communiquer, le soft se connecte bien mais pour ce qui es de l'échange de données comment envoyer un ordre à l'arduino? Et comment recevoir les infos de codeur pour les traiter?

            Merci beaucoup d'avance

  5. Salut à tous,
    Je vais tester ce code dès aujourd’hui. Par contre, j’ai pas mal de warning lors de la compilation :(. Surtout à propos des conversions implicites.

    De plus, il n’y aurait pas une erreur ici ? :

    while(url[index-1] != ‘p’ && url[index] != ‘=’ && index= ‘0’ && url[index] <= '9') {

    C'est pas plutôt :
    while(url[index-1] != 'p' && url[index] != '=' && index == '0' && url[index] <= '9') {

    F@b.

    • J’ai également constaté l’erreur précisée par James Bond et l’ai corrigée plutôt ainsi :

      while(url[index-1] != ‘p’ && url[index] != ‘=’ && url[index] >= ‘0’ && url[index] <= '9') {

  6. Bonjour Eskimon,

    Super Tuto que je vais m’empresser d »étudier et mettre en application.
    mais j’ai une petite question
    – Pour générer plusieurs pages sur un web serveur, est-ce que l’on passe obligatoirement par une carte SD?
    en faite je voudrais avoir une page « calibration » qui permettrait de changer l’adresse IP et de la stocker dans l’EPROM et aussi avoir un accès sécurisé par mot de passe au web serveur.

    Il y a peu de Tuto qui aborde ce sujet, ou je ne les ai pas trouvé. est-ce que tu pourrais m’en conseiller quelques un?

    merci pour tes réponses.
    Bonne journée

  7. Merci pour ce tuto!
    En revanche, je ne comprend pas à la fin, où mettre le code html et javascript lorsqu’on crée l’interface, peux tu m’en dire plus? A la suite du code arduino?

  8. Bonjour,

    D’abord, merci pour ces excellents tutoriels.
    Si je ne me trompe pas, le code proposé utilise DHCP pour attribuer une adresse IP (ce n’est qu’en cas d’erreur qu’une IP fixe est utilisée).
    Or il me semble impossible de faire de la redirection de port sans IP fixe et donc impossible d’accéder à la carte Arduino de l’extérieur.
    Est-ce exact ? et si oui pourquoi alors ne pas supprimer l’éventualité DHCP pour l’aspect serveur ?
    Merci encore

    • Tout a fait, ca vaudrait le coup de le préciser. En fait mon routeur est paramétrer de telle facon à marche en DHCP mais en donnant toujours la même adresse à certaines adresse MAC, ce qui fait que même en comportement DHCP j’ai une adresse ip statique.

  9. Bonjour,

    Globalement, avec quelques modifications et sans trop de problèmes, je reproduis ce tutoriel:
    – même montage à 3 leds numériques + 1 led pwm + 1 capteur LM35
    – une requête AJAX dans la page web sur mon serveur local communique avec l’Arduino (à travers une autre page web locale de façon à ne pas accéder à arduino directement de l’extérieur – mais c’est secondaire-)
    J’ai une petite remarque et un problème:

  10. La remarque: j’utilise « char url[100] » mais j’initialise la chaine avec
    for (index = 0; index<=99; index++) {
    url[index] = 0; // on remet à zéro la chaîne tampon – 0 est le caractère de fin de chaine
    }

  11. le problème: l’instabilité de la température qui varie un peu avec le nombre de leds allumées, et beaucoup selon l’alimentation:
    – 20-22 °C avec le cordon usb -> PC
    – 12-17 °C avec un transfo 5V/3A connecté aux broches 5V et Gnd du shield ethernet.
    – la tension mesurée est 4,94 V avec l’usb et 4,87 V avec le transfo.
    – j’utilise analogReference(INTERNAL); pour, normalement, plus de précision.
    – je voudrais déconnectée l’arduino du PC et ne pas utiliser de pile !!
    quelle alimentation utiliser ? et comment supprimer les variations de température ??
    merci pour tous conseil

  12. Bonjour,
    une question simple mais que je n’arrive pas à résoudre: où est appelée la fonction javascript par la page html principale et comment lancer à distance la commande en mettant les pages sur le web.

  13. Bonjour,

    Merci pour ce tuto, il y a quelques erreurs de syntaxe et logique au niveau du :

    while(url[index-1] != ‘p’ && url[index] != ‘=’ && index= ‘0’ && url[index] <= '9') {

    Par contre visiblement il faut un serveur avec Javascript pour que l'ensemble fonctionne ce qui est bien dommage.

    • Pour autant que je sache, Javascript s’exécute coté client, à savoir le navigateur web. Tous les navigateurs comprennent le Javascript sauf s’il a été intentionnellement désactivé dans les préférences du navigateur.

      Donc n’importe quel serveur web fera l’affaire et saura envoyer au client (navigateur) du code html + javascript, et n’importe quel navigateur saura comprendre ce code et l’exécuter 🙂

      Il faut juste avoir une carte Arduino et un serveur web…

  14. Bonjour,

    Je voudrai juste savoir :
    – que ce passe t-il quand on clique sur le bouton « Executer ! » de la page web ?
    – comment est lancé le javascript ?

    En tous les cas, bravo et merci pour ce tuto.

    Michel

  15. Arduino : 1.6.11 (Windows 7), Carte : « Arduino/Genuino Uno »

    ethernet_sketch_controller:17: error: two or more data types in declaration of ‘url’

    char *url = (char *)malloc(100); // L’url recu à stocker

    ^

    C:\Users\Thomas\Documents\Arduino\ethernet_sketch_controller\ethernet_sketch_controller.ino: In function ‘void loop()’:

    ethernet_sketch_controller:57: error: ‘url’ was not declared in this scope

    url = «  »; // on remet à zéro notre chaîne tampon

    ^

    ethernet_sketch_controller:75: error: ‘action’ was not declared in this scope

    action();

    ^

    C:\Users\Thomas\Documents\Arduino\ethernet_sketch_controller\ethernet_sketch_controller.ino: In function ‘boolean interpreter()’:

    ethernet_sketch_controller:158: error: ‘url’ was not declared in this scope

    while(url[index-1] != ‘b’ && url[index] != ‘=’) { // On commence par chercher le « b= »

    ^

    ethernet_sketch_controller:167: error: ‘url’ was not declared in this scope

    while(url[index] != ‘&’) { // On cherche le ‘&’

    ^

    ethernet_sketch_controller:183: error: ‘url’ was not declared in this scope

    while(url[index-1] != ‘p’ && url[index] != ‘=’ && index= ‘0’ && url[index] Préférences.

    voisi le message d’erreur que l’on m’envoie

  16. bonjour
    Je suis en terminale Sti2 d, je souhaiterais poser une petite question. d’abord je dois faire un serveur Ethernet sous arduino cela et bon je l’ai fait mais je n’arrive pas recevoir les donnes que j’envoie avec mon windev donc je demande de l’aide pour pouvoir réussir ce que je suis entré de faire merci . Et aussi si des personnes s’y connaissent un peu en Windev je suis preneur de conseil merci de votre aide et aussi je dois faire sa en UDP sous arduino .

  17. Alors là, je suis admiratif ESKIMON !
    J’ai repris ton code et…. tout fonctionne.
    Tu m’as ouvert les yeux!
    En une soirée, j’ai fait une recopie de ma chaudière en page HTML; Tous les voyants
    Pour l’instant, je ne peux le regarder que de chez moi mais, c’est pas fini eh eh.
    MERCI MERCI MERCI merci merci merci ….. …… …..

  18. Pingback: Tuto w5100 – Dreambot blog

  19. Salut
    Tout d’abord merci pour tes tutos.
    J’ai un soucis avec le code liée à l’échange d’information entre le client et la carte commandant les leds et la sonde de t°.
    J’ai un message d’erreur en ligne 67 (Arduino : 1.8.0 (Windows 7), Carte : « Arduino/Genuino Uno »

    test_reseau_3:68: error: empty character constant

    url[index] =  »;

    ^

    C:\Users\Stef_2\Documents\Arduino\test_reseau_3\test_reseau_3.ino: In function ‘void loop()’:

    test_reseau_3:72: error: ‘action’ was not declared in this scope

    action();

    ^

    C:\Users\Stef_2\Documents\Arduino\test_reseau_3\test_reseau_3.ino: In function ‘boolean interpreter()’:

    test_reseau_3:180: error: lvalue required as left operand of assignment

    while(url[index-1] != ‘p’ && url[index] != ‘=’ && index= ‘0’ && url[index] Préférences.

    Peux tu m’aider SVP?
    Merci d’avance
    Cordialement

  20. Bonjour,
    tout d’abord merci pour ce site.

    J’ai bien compris le programme Arduino. Par contre, j’ai très peu de connaissances en html et javascript
    Peux tu m’apporter quelques précisions?
    -le nom du fichier html
    -le nom du fichier javasript
    Est ce que ces 2 fichiers communiques ensemble ?
    Peux tu fournir un lien pour télécharger ces fichiers ?

    Merci

Laisser un commentaire