Composants pour interface web

Voila le code coté serveur PHP

<?php
$host="192.168.0.19";  // A adapter sur la configuration de chacun
$port=8888;    // A adapter sur la configuration de chacun

   $buf = "12345678abcdefghijklmnop";    // message envoyé en UDP

    $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
    socket_sendto($socket, $buf, strlen($buf), 0, $host, $port);
    socket_close($socket);

?>

Pour faire le lien entre le comportement d'un composant comme un slider en JQUERY et le script PHP permettant d'envoyer le message à l'ARDUINO, je dois mettre en place de l'AJAX.
JQUERY a tout ce qu'il faut pour réaliser ce mécanisme...

Qui saurait m'aider à le mettre en place?
Je manque malheureusement vraiment de temps en ce moment pour avancer sur ce développement... Mais je vois bien d'un point de vue architecture globale ce qu'il faut mettre en place :slight_smile:

Je peux t'aider avec plaisir. Je pense avoir les compétences nécessaire et d'ailleurs je suis en ce moment la dessus. J'essaye aussi une autre méthode qui va permettre de ne pas avoir à interroger toutes les secondes la page php. Je test ton code je te reviens sur la suite rapidement :slight_smile:

Bon j'ai fait une tentative en Local ça fonctionne parfaitement mais celle en ligne je tombe sur :

Warning: socket_sendto() [function.socket-sendto]: unable to write to socket [1]: Operation not permitted in /home/weeboon/public_html/arduiboo/udp_switch_led.php on line 8

J'ai ouvert le port que j'utilise en UDP depuis mon routeur et le résultat est le même.

Par contre j'ai réussi à établir une connexion vers l'arduino directement avec Jquery. Un petit avant gout de ce qui permet d'envoyer les infos

<script type="text/javascript">
        $(function(){

            $("#statut_led").click(function(){
              
                $.get("http://arduiboo.dyndns.biz/",{led1:"255", led2:"255"});

          });

        });

                </script>

avec ceci je suis capable d'envoyer en mode GET n'importe qu'elle information à l'arduino

Ton erreur vient du fait que sur ton serveur externe, l'extension PHP_SOCKETS n'est pas installée...
Voir si ton hébergeur te permet de le faire...

pour se faire, il faudrait dé-commenter la ligne suivante :
;extension=php_sockets.dll
qui se trouve dans le php.ini

dé-commenter = enlever le ; qui est au début de la ligne... 8)

chesnel:
Par contre j'ai réussi à établir une connexion vers l'arduino directement avec Jquery. Un petit avant gout de ce qui permet d'envoyer les infos

<script type="text/javascript">

$(function(){

$("#statut_led").click(function(){
             
                $.get("http://arduiboo.dyndns.biz/",{led1:"255", led2:"255"});

});

});




avec ceci je suis capable d'envoyer en mode GET n'importe qu'elle information à l'arduino

Oula... Pourrais-tu expliquer ou commenter les lignes?
C'est un script que tu positionnes où?

je te donnes tous les détails dès que j'ai réussi à faire ce que je voulais du coté arduino :slight_smile:

//declare une function globale
$(function(){
            //ecoute un click sur la balise <a id="statut_led">button</a> dans le dom html 
            $("#statut_led").click(
            //sur le click on execute la function
            function(){
                 //appelle la page arduiboo.dyndns.biz/index.php avec la method GET et on lui passe les variable $_GET['led1'] =  255 puis led2 ...
                $.get("http://arduiboo.dyndns.biz/",{led1:"255", led2:"255"});

          });

        });

(pour le futur ) En html5 on peut faire un Socketclient :slight_smile:

Désolé, mais je ne comprends absolument rien... =(
Ce script, vous le mettez où??? :astonished:
Pourquoi passer par une page http://arduiboo.dyndns.biz/

Vous dialogiez avec l'ETHERNET SHIELD de quelle façon??? :astonished:

Ce bout de js se met dans une balise javaScript sur une page web sur ton serveur ...

Pourquoi arduiboo.dyndns.biz, parce que un domaine dyndns c'est gratuit ,mais dans ton cas c'est l'adresse de ton script php.

Mais j'aimerais bien comprendre pourquoi vous n'appeler pas directement la carte ?

Bon c'est partis je prend un peu de temps pour partager mon avancement smiley

Arduino est comme en mode écoute la manière dont cela fonctionne si vous allez dans votre navigateur et que vous tapez 192.168.1.200?led=200z et que vous avez votre serial monitor ouvert, vous devriez voir s'afficher des informations dont la valeur de led transmise. J'ai fait le tuto de cette page http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.ArduinoEthernetServeurControleLEDx7 et mes connaissances rudimentaires. Il existe surement d'autre manière plus propre pour récupérer la valeur, mais c'est déjà un bon début selon moi.

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

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x4A, 0x8A };
byte ip[] = { 192,168,1,200}; 
byte passerelle[] = { 192, 168, 1, 254 };
byte masque[] = { 255, 255, 255, 0 }; 


String chaineRecue=""; 
int comptChar=0; 

Server serveurHTTP(80); 
int etat = 255;


void setup()   { 

Serial.begin(115200); 

Ethernet.begin(mac, ip, passerelle, masque);

serveurHTTP.begin();



}

void loop(){ 

  while(!serveurHTTP.available()); // attend qu'un client soit disponible


  Client client = serveurHTTP.available();

  if (client) { // si l'objet client n'est pas vide = si le client existe
  
    chaineRecue=""; // vide le String de reception
    comptChar=0; // compteur de caractères en réception à 0  
  
    if (client.connected()) { // si le client est connecté
     
           while (client.available()) { 

                char c = client.read(); 
                comptChar=comptChar+1; 
                //récuperation des 100 premier caractères
                if (comptChar<=100) chaineRecue=chaineRecue+c; 

      } // --- fin while client.available
      
      
    //Serial.println(chaineRecue); // affiche le String de la requete pris en compte pour analyse
    Serial.println("");
    //les valeurs nous intéressant dans le GET transmit ce trouve entre = et & (led1=valeur$
    //trouve la position du premier =
    
    Serial.println(chaineRecue);
    Serial.println("");
    
    //trouve la position du premier =
    int positionStart = chaineRecue.indexOf('='); 
    Serial.print("la position du = est ");
    Serial.println(positionStart);
    
    //trouve la position du premier z
    int positionEnd = chaineRecue.indexOf('z');
    Serial.print("la position du z est ");
    Serial.println(positionEnd);
    
    //récupère la velur présente entre le = et z
    String valeurLed = chaineRecue.substring(positionStart+1,positionEnd);
    
    int valeurLedint;
    //String en int est possible avec ses changements http://code.google.com/p/arduino/issues/detail?id=468
    long valeurLed2 = valeurLed.toInt();
    
    Serial.print("valeur de la led : ");
    Serial.print(valeurLed2);
    Serial.println("");
    
    
    analogWrite(9, valeurLed2);
    

    } // --- fin if client connected

    delay(1);

    client.stop();


  } //---- fin if client existe ----



}

Alors du coté de la page Web :
Pour ma part j'ai fait les essaie en local et en ligne et ça fonctionne. J'ai tout intégré dans une seul page css + jquery histoire que ce soit plus simple à comprendre.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
    <head>

        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>changement couleur arduino Client</title>
        
        <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script>
        <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>

        <style type="text/css">
            #slider { margin: 10px; width: 300px; }
            #contenu { width: 300px; height: 50px; margin:100px auto 0px auto; }
        </style>

        <script type="text/javascript">


        $(function(){

             //lien vers l'arduino qui est en mode écoute 
             var $link = "192.168.1.200"
             //creation du slider avec une valeur max de 255 et initial de 0
             $( "#slider" ).slider({ max: 255 },{ value: 0 });

             //--- transmet la valeur durant le déplacement du slide - peu stable et envoi beaucoup de requête ---- //
             //a chaque fois que le slider est en action on envois la valeur
             /*$( "#slider" ).bind( "slide", function() {
                var value = $( "#slider" ).slider( "option", "value" );
                $.get($link,{led1:value+"z"});
            });*/

             //a chaque fois que le slider et laché on envois la valeur
             $( "#slider" ).bind( "slidestop", function() {
                var value = $( "#slider" ).slider( "option", "value" );
                //envoi par methode GET les informations à l'arduino
                $.get($link,{led1:value+"z"});
            });

               

        });

                </script>

    </head>

    <body>
        <div id="contenu">
            <div id="slider"></div>
        </div>

    </body>

</html>

La zone qui est en commentaire qui permet de transmettre la valeur durant le changement du slide n'est pas active car je me suis rendu compte que trop de valeur était transmise à l'arduino et parfois certaine envoyé en première arrivé après les suivantes transmises. Ce qui donnais une led clignotante à certains moment :stuck_out_tongue:

Je donne quelque explication par rapport à cette partie

 var $link = "192.168.1.200"

pour la démonstration j'ai mon mon adresse local mais pour faire fonctionner sur internet il y à plusieurs chose à savoir. Vous devez redirigez vers votre adresse ip qui, la plupart du temps est dynamique. À chaque fois que vous vous reconnecter à internet une nouvelle adresse ip vous est assigné. Ojal l'adresse que tu as vus est en faite créée via le site https://www.dyndns.com. Elle permet de rediriger en permanence vers l'adresse ip de mon ordinateur, même si celle-ci change.

Pour ma part j'ai du paramétrer mon routeur pour que, lorsque j'accède à l'adresse ip de mon ordinateur, je sois rediriger vers l'adresse ip local de l'arduino, dans l'exemple 192.168.1.200 sous le port 80. Sur ce point je ne peux pas vraiment aider car les configurations de routeur varie selon les marques.

Gardez en tête que c'est une première tentative... elle fonctionne mais je suis certains que nous pouvons améliorer tout ceci ! Enfin pour le moment je trouve que ça peut ouvrir à pas mal d'idée ! :slight_smile:

Voilà Si vous avez des questions sur le code n'hésitez pas !

PS(2h plus tard) : Je viens de faire mon tout premier montage avec un relais pour allumer une lumière branché sur du 120V ! branché au Québec, et testé depuis le Suisse ! Je crois que je deviens accros à tout ça :stuck_out_tongue:

goabonga:
Mais j'aimerais bien comprendre pourquoi vous n'appeler pas directement la carte ?

tu peux donner plus de précision ?

Ça semble très intéressant! priori un simple passage d'arguments dans l'URL très classique 8)
Pas eu le temps d'analyser le dernier post, mais ça veut donc bien dire qu'il n'y a pas qu'UDP pour communiquer avec l'ARDUINO...
Je me remets à tout ça dès que j'ai un moment...

En fait, le problème que nous rencontrons est assez simple... Nous (je?) manquons de doc sur le SHIELD ETHERNET et sur les bibliothèques qui permettent à l'ARDUINO de communiquer par les couches réseau... On peut trouver ça où ???

ça veut donc bien dire qu'il n'y a pas qu'UDP pour communiquer avec l'ARDUINO...

initialement, l'arduino ne supportait que le TCP/IP (webserver, client web). Puis des âmes généreuses et dévouées ont écrit une bibliothèque UDP, qui a été intégré à l'IDE de manière officielle après la version 19.

Nous (je?) manquons de doc sur le SHIELD ETHERNET et sur les bibliothèques qui permettent à l'ARDUINO de communiquer par les couches réseau...

Sur le site de wiznet, tu trouveras le datasheet du W5100.

sur ce site: Integrating Wiznet W5100, WIZ811MJ network module with Atmel AVR Microcontroller | ermicroblog, tu auras une explication intéressante de son fonctionnement.

Les bibliothèques arduino sont les bibliothèques wiznet adaptée à l'arduino (allégée)

Gromain

Bonjour

je ni comprend plus rien, j'ai fait un schéma pour mieux comprendre.
Tu a serveur Web Ché ton FAI (Fournisseur Acces Internet) et tu a mie un arduino ché toi au Q de ton modem ADSL exate ?
Pour moi Arduino doi étre dans la DMZ du routeur de ton FAI, ces impératif pour que sa fonctionne correctement.
Il est Claire que la doc sur le Shield Ethernet et tré limiter, nous somme aussi limiter par la vitesse du processeur 16Mhz.

pour faire de la domotique, la supervision de la maison, GTC, il ne faut pas ce voiler la face ce n'est pas avec un arduino simple que lon peut faire quelle que chose de correcte, il faudra un serveur WEB (apache, Mysql) et un arduino comme interface entrée et de sortie avec une gestion des automatise de base, le serveur Web et la pour sécurisé l'acces et faire interface IHM (Interface Homme Machine) changer des valeurs ou afficher des valeurs dans une pas web.

C tré risquer en terme de securité, n'importe qui peut faire ce qu'il veut ché son voisin monter les rideau, allumer les lumiére, changer le point de consigne du chauffage etc....

Cordialement

PS pardon pour les faute orthographe.

La configuration de l'accès à l'arduino est en DeMilitarized Zone (DMZ) http://www.commentcamarche.net/contents/protect/dmz-cloisonnement.php3

La seul différence entre ce que j'ai fait et de la domotique, peut-être un peu plus réaliste. C'est que pour moi le serveur WEB ne ce trouve pas chez moi mais sur un de mes site personnel. D'ailleurs ton schéma est correct Powerpack :slight_smile: Ceci pourrais être une seconde étape avoir un petit ordinateur dédié pour servir comme serveur ce trouvant chez moi et communiquant avec l'arduino. D'ailleurs mon prochaine essai et de pouvoir communiquer dans les deux sens. Que je puisse allumer la lumière physiquement (un bouton) et que ceci change la valeur d'état dans la base de donnée qui est à distance et inversement.

Question risque ça l'est si tu ne protège pas les informations auxquelles tu peux accéder. Pour moi c'est le cas en ce moment, mais rien ne m'empêche de développer un système d'accès sécurisé avec clé crypté pour rendre la tâche difficile à mon voisin, qui n'a d'ailleurs certainement pas de notion de hacking :stuck_out_tongue:

Bonjour,

Je ne suis pas convaincu de la nécessité de mettre l'ARDUINO en DMZ... Il faut configurer le routeur, je ne vois pas l'impossibilité... En DMZ, il me semble très vulnérable aux attaques extérieures... s'il doit y en avoir 8)
Le serveur hébergé est la meilleure solution quand cela est possible... Aucun intérêt à avoir un serveur qui tourne chez soi... La seule limitation est que certains hébergeurs ne donnent pas accès à toutes les options... Le must étant son propre serveur en mode hébergé... Il y a des choses pas trop chères maintenant... Par exemple http://www.kimsufi.com/fr/cloud/ à 10.50 € TTC / mois... :slight_smile:

ojal:
Bonjour,

Je ne suis pas convaincu de la nécessité de mettre l'ARDUINO en DMZ...

En faite la DMZ c'est la zone ou ce trouve l'arduino, non le serveur web php/mysql qui a les informations. Il n'y a, à ma connaissance, pas d'autre alternative. Ton arduino est forcément brancher sur un routeur et il faut éviter les intrusions.

Sinon l'intéret d'avoir un serveur chez soi c'est pour la rapidité de communication Serveur <-> arduino qui est certainement limité quand ton serveur web ce trouve sur un herbergement (ce qui est mon cas) Mais pour des exercice comme celui-ci ce n'est pas nécessaire.

L'ARDUINO obtient une adresse IP du routeur et je ne vois pas pourquoi cette adresse ne serait pas accessible depuis l'extérieur avec une bonne config du routeur...?
C'est ce que j'avais fait à une époque pour accéder à mon serveur PHP MYSQL depuis l'extérieur... A valider quand même...

Un hébergement extérieur ne sera pas forcément beaucoup plus lent... Il n'y a pas de volumes de données à transférer... Et c'est quand même un ENORME soucis de moins à gérer... Je ne connais personne qui ai un serveur 'fiable' sur son réseau local... Cela génère souvent une nuisance sonore, ventilation du serveur, une dépense énergétique non nulle et tous les soucis de redémarrage en cas de coupure de courant etc...

Perso les serveurs doivent tous être chez des hébergeurs et OVH est assez bon pour ça... En tous cas pour l’Europe...

ojal:
L'ARDUINO obtient une adresse IP du routeur et je ne vois pas pourquoi cette adresse ne serait pas accessible depuis l'extérieur avec une bonne config du routeur...?
C'est ce que j'avais fait à une époque pour accéder à mon serveur PHP MYSQL depuis l'extérieur... A valider quand même...

Mais c'est tout à fait ça. l'adresse IP qu'obtiens ton arduino est une ip adresse local. en Configurant ton routeur tu assignes l'adresse ip qui permet d'accéder à ton ordinateur depuis le web à l'ip local de ton arduino. Mais tout ceci est configurer en DMZ tout simplement (enfin corrigé moi si je me tormpe :p)

C'est clair que ça peut être embêtant à gérer un serveur local. Je ne m'y connais pas en domotique mais je suis pas certains qu'il accède à un seveur distant. Mais pour nos projets il est clair que c'est suffisant. Je serais curieux de savoir comment cela fonctionne pour les maisons domotique, jvais aller googeler ! :slight_smile: