[help] Soulager Arduino Page Web

bonjour,
je reviens sur cette phrase

L'utilisation d'un socket d’échange me plait beaucoup, l'utilisation de page on off etc n'est pas viable à mon avis car si l'on a X capteurs et Y actionneur il faut autant de "pages" ce qui n'est pas propre et lisible...
Je tiens vraiment à utiliser mon serveur php pour échanger par ethernet avec l'arduino et éviter ainsi la génération des page à ce dernier car je voudrais gérer une partie graphique lourde avec les valeurs récupérée de l'arduino...

je dirais qu'une seule page et nécessaire pour toutes les pages demandées :slight_smile:
il faut sur le server apache le rewrite activé simplement
dans le htaccess on met une ligne de ce style

#SetEnv PHP_VER 5_3
SetEnv REGISTER_GLOBALS 0
SetEnv PHP_VER 5  //active PHP5
#Active l'url rewrite
RewriteEngine on  //active url rewrite
RewriteRule ^ON\.html$ page.php [L] 
RewriteRule ^OFF\.html$ page.php [L]

dans le script du fichier page.php (celui qui sera appelé pour toutes les commandes, on met ceci

<?php
$PHP_SELF =$_SERVER['REQUEST_URI'] ;;
    $page= substr($PHP_SELF, strrpos($PHP_SELF, '/')+1,  strrpos($PHP_SELF,'.')-1);
//echo "page appel : ".$page;
?>

en gros on récupère le nom appelé ce qui donnera ON ou OFF au lieu de ON.html et OFF.html

après dans le script page.php toujours, on met des conditions de ce style

<?php
if ($page!='ON' & $page!='OFF'){header("location:erreur.php");}
if ($page='ON'){$allumled=1;}
if ($page='OFF'){$allumled=0;}
?>

bonjour à vous,

Je viens de voir que vous avez essayer de suivre les instructions de mon tuto : http://blog.weeboo.net/tutoriel-arduino-ethernet-shield-controler-led-depuis-une-page-web/ et que vous aviez des difficultés.

Souhaitant tout de même avoir un tuto qui fonctionne. Je me permet de revenir sur les erreurs que vous avez rencontré.

Est-il possible d'utiliser firebug sous mozilla lorsque vous tentez de bouger le slider et de regarder dans la console log les messages qui s'affiche ? Cela permet de contrôler si la communication ce fait ou non.

Bonjour,

J'ai essayé le tuto, mais hélas cela ne fonctionne pas

Dans la console de firefox j'ai une suite de lignes :
[16:16:42,239] POST http://127.0.0.1:8887/udp_control_led.php [HTTP/1.1 200 OK 0ms]
qui s'affichent lorsque je bouge le curseur.
Par contre le monitor serial reste vide et la LED éteinte.

voici mes paramètres :

.pde :

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,0,49 };

unsigned int localPort = 8886;

et pour
udp_control_led.php :

$host="192.168.0.49"; // Adresse ip défini dans le code arduino
$port=8886; // Port défini dans le code arduino

Je ne sais pas ce que j'ai loupé ?

Idem pour moi

Si on developpe la ligne on peut voir :

Fatal error: Call to undefined function socket_create() in C:\wamp\www\SliderLed\udp_control_led.php on line 7

++

je viens de prendre le script pour le tester, tout fonctionne impeccable.
j'ai remplacé le port par le 80.

une erreur a pu se glisser dans le copier coller des php
a vérifier si un espace ou une ligne ne s'est pas retrouvée devant <?php ce qui aurait pour effet de mettre out le php.

J'avais déjà essayé avec le port 80 et j'ai refait le test, toujours rien.

J'ai également revu les php (j'avais téléchargé le zip)

voici ce qu'affiche la console Mozilla :

[18:56:43,610] GET http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/images/ui-bg_glass_75_dadada_1x400.png [HTTP/1.1 304 Not Modified 49ms]

[18:56:54,044] GET http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/images/ui-bg_glass_65_ffffff_1x400.png [HTTP/1.1 304 Not Modified 55ms]
[18:56:54,156] POST http://127.0.0.1:8887/udp_control_led.php [HTTP/1.1 200 OK 6ms]
[18:56:54,226] POST http://127.0.0.1:8887/udp_control_led.php [HTTP/1.1 200 OK 1ms]
[18:56:54,274] POST http://127.0.0.1:8887/udp_control_led.php [HTTP/1.1 200 OK 2ms]
...
et ainsi de suite si je bouge le curseur
mais la LED reste éteinte en toujours aucun affichage sur le serial monitot.

tu passe par un router ou une box pour faire ton test?
peux tu pingger au moins ton arduino?

par ce que la communication se fait bien pourtant

[18:56:54,156] POST http://127.0.0.1:8887/udp_control_led.php [HTTP/1.1 200 OK 6ms]
[18:56:54,226] POST http://127.0.0.1:8887/udp_control_led.php [HTTP/1.1 200 OK 1ms]
[18:56:54,274] POST http://127.0.0.1:8887/udp_control_led.php [HTTP/1.1 200 OK 2ms]

mets ton pde pour vérifier
mes assignements ip mask gateway sont comme ca pour moi

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,2,200 };
unsigned char gateway[] = { 192,168,2,2 };			
unsigned char mask[] = {255,255,255,0};  

unsigned int localPort = 80;      // local port to listen on

void setup() {
  // start the Ethernet and UDP:
  Ethernet.begin(mac, ip, gateway, mask);
  Udp.begin(localPort);
  Serial.begin(9600);

}

Merci pour ton aide

Je suis sur un switch branché sur ma freebox.

J'ai pingué => pas de Pb

J'ai testé le fonctionnement proposé par ArtBotHack plus haut dans ce forum avec les pages php on.php et off.php et cela fonctionne très bien.

Voici mon code :

#include <SPI.h>       // needed for Arduino versions later than 0018
#include <Ethernet.h>
#include <Udp.h>         // UDP library from: bjoern@cs.stanford.edu 12/30/2008
 
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,0,49 };
unsigned char gateway[] = { 192,168,0,254 };			
unsigned char mask[] = {255,255,255,0};  

unsigned int localPort = 80;      // local port to listen on
 
// the next two variables are set when a packet is received
byte remoteIp[4];        // holds received packet's originating IP
unsigned int remotePort; // holds received packet's originating port
 
// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
char  ReplyBuffer[] = "acknowledged";       // a string to send back
 
void setup() {
  // start the Ethernet and UDP:
  Ethernet.begin(mac, ip, gateway, mask);
  Udp.begin(localPort);
 
  Serial.begin(9600);
}
 
void loop() {
  // if there's data available, read a packet
  int packetSize = Udp.available(); // note that this includes the UDP header
  if(packetSize)
  {
    packetSize = packetSize - 8;      // subtract the 8 byte header
    Serial.print("Received packet of size ");
    Serial.println(packetSize);
 
    memset(packetBuffer, 0, UDP_TX_PACKET_MAX_SIZE);
 
    // read the packet into packetBufffer and get the senders IP addr and port number
    Udp.readPacket(packetBuffer,UDP_TX_PACKET_MAX_SIZE, remoteIp, remotePort);
    Serial.println("Contents:");
    Serial.println(packetBuffer);
 
    analogWrite(9, atoi(packetBuffer)); //utiliser la valeur reçu pour allumer la led
  }
  delay(2);
}

je ne sais pas ce qui se passe.

je viens de m'amuser un peu en partant du script et rajoutant des trucs.
essaye avec ce php sans utiliser le JS avec juste un input dans le fichier slider_led.php

<?php
if (isset($_POST['envoyer'])){
                $valeur_led = $_POST["led1"]; //  récupération de la valeur transmise en méthode POST
               $host="192.168.2.200";  // Adresse ip défini dans le code arduino
               $port=80;    // Port défini dans le code arduino
               $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
               socket_sendto($socket, $valeur_led , strlen($valeur_led), 0, $host, $port);
              socket_close($socket);
}
?>

<!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>arduiboo - contrôle intensité LED</title>
    </head>
    <body>
<form action="" method="POST">
         Valeur led <input name="led1" type="text" value="<?php echo $valeur_led;?>">

<input name="envoyer" type="submit" value="envoyer">
</form>
     </body>
 
</html>

Bonjour,

Tu as vu mon msg un peu plus haut avec le message d'erreur.

N'est-ce pas là le problème ?

++

EDIT : Je ne sais pas si Brisebee constate la même chose.

J'ai trouvé !

Il faut activer PHP_Sokets dans le menu PHP extension sur le serveur et cela marche !

++

bonjour,
j'avais zappé ton erreur, mais bossant avec un vrai server, je n'ai pas ce problème. :grin:

Michel_B:
J'ai trouvé !

Il faut activer PHP_Sokets dans le menu PHP extension sur le serveur et cela marche !

++

C'est tout à fait ça :slight_smile:

en tout cas pour l'erreur qui a été mentionné par Michel_b

trigger:
Salut salut :slight_smile:

Je fais tourner un petit projet de domotique basé sur un Arduino Meag + Ethernet Shield et tout se passe plutôt bien sauf que souhaiterais alléger un peu la somme de travail que je demande a l'arduino ...

Sans trop entrer dans les détails qui vont barber la majorité d'entre vous xD
Je piloter des relays, ma télé ^^, envoie message twitter, capter la température ... via une page web

En effet l'arduino fait absolument tout : acquisition, hébergement des pages web, traitement des données ...

Je souhaiterais donc savoir si il est possible de soulager ?

Il y a beaucoup d'idée sur internet mais pas vraiment de tuto :S
Quelqu'un aurait une petite idée, VB, HTML/PHP ?

Je suis un petit nooby dans le domaine du dev web :frowning:

Amicalement,
trigger

wow ça peu faire tout ça un Arduino ????
personnellement moi je suis un peu plus que toi "nooby" mais moi c'est dans le domaine de l'électronique. Mais perso j utilise pas mal le CMS joomla (http://www.joomla.fr/decouvrir-joomla/qu-est-ce-que-joomla). Mais dans ton cas, ce ne serait pas judicieux de l'utiliser. C'est plus lourd à gérer qu'un site façonné à la main en HTML/PHP . Enfin je pense.

Encore merci pour votre aide,

Mais je n'arrive toujours pas à faire marcher le schmilblick.

J'ai essayé le code envoyé par infobarquee

dans la boîte "valeur de la LED" j'ai :
Notice:Undefined variable: valeur_led in C:\Program Files (x86)\EasyPHP-5.3.9\www\slider_led.php on line 21

et voici ce que j'obtiens lorsque j'appuie sur envoyer :
Fatal error: Call to undefined function socket_create() in C:\Program Files (x86)\EasyPHP-5.3.9\www\slider_led.php on line 6

J'utilise Easy PHP-5.3.9 et ne ne vois pas où activer PHP_Sokets comme le propose Michel_B

si tu comprends un peu l'anglais il y a différentes procédures expliquées sur cette page pour activé le socket sous wamp :
http://rodrixar.blogspot.com/2011/07/how-to-run-php-sockets-in-wamp.html

Ca y est ça marche !

C'était bien ça, en fait les sockets ne sont pas activés par défaut dans EasyPHP.

Merci à tous.

Bonjour, je coule...
J'utilise arduino 1.0 et essaye d'utiliser le code de http://blog.weeboo.net/tutoriel-arduino-ethernet-shield-controler-led-depuis-une-page-web/
J'arrive bien à envoyer ma valeur vers l'arduino mais je ne trouve pas comment récupérer une trame depuis l'arduino... En gros sa réponse...

voici le code de ma partie php:

if (isset($_POST['envoyer'])){
               $valeur_led = $_POST["led1"]; //  récupération de la valeur transmise en méthode POST
               $host="192.168.1.30";  // Adresse ip défini dans le code arduino
               $port=8888;    // Port défini dans le code arduino
               $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
               socket_sendto($socket, $valeur_led , strlen($valeur_led), 0, $host, $port);
               
			   /*$result = socket_bind($socket, $host, $port) ;//or die("Could not bind to socket\n"); 
				echo "Socket Open OK 
 \n"; 
				$tt=0;
				while($tt<20){ 	// Lire les données 20 caracteres : 
					$input = socket_read($socket,20);
					$tt++;
				}
				echo 'Message reçu : ' . stream_socket_recvfrom($socket, 15) . '
';
				*/
				socket_close($socket); 

}				

	
echo"retour POST=".$valeur_led."longueur=".strlen($valeur_led)." 
";
$valeur_led=125;//ré initialisation par default pour le formulaire html

mon code ino:

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


byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 30); //ip arduino

unsigned int localPort = 8888;      // port de communication arduino

// buffers RX TX en UDP (24 par defaut??)
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
char  ReplyBuffer[] = "acknowledged";       // a string to send back

// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;

void setup() {
  // start the Ethernet and UDP:
  Ethernet.begin(mac,ip);
  Udp.begin(localPort);
  Serial.begin(9600);
}

void loop() {

  int packetSize = Udp.parsePacket();
  if(packetSize)
  {
    Serial.print("Received packet of size ");
    Serial.println(packetSize);
    Serial.print("From ");
    IPAddress remote = Udp.remoteIP();
    for (int i =0; i < 4; i++){
      Serial.print(remote[i], DEC);
      if (i < 3){
        Serial.print(".");
        }
      }
    Serial.print(", port ");
    Serial.println(Udp.remotePort());
    
    memset(packetBuffer, 0, UDP_TX_PACKET_MAX_SIZE);//permet de vider le buffer
    
    // lecture du buffer reception
    Udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);
    Serial.println("Contents:");
    Serial.println(packetBuffer);
    
    // envoi d'une réponse à la trame udp reçu
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(ReplyBuffer);
    Udp.endPacket();
  }
  delay(5);
}

Ma premiere question, remarque/probleme est le port affiché dans la console série , il varie en permanence...

voici quelques exemples:

Received packet of size 3
From 192.168.1.50, port 54964
Contents:
160
Received packet of size 3
From 192.168.1.50, port 58487
Contents:
125
Received packet of size 1
From 192.168.1.50, port 58488
Contents:
1

ma deuxième question est comment récupérer la trame envoyée par l'arduino? Ici "acknowledged"
Dans mon code php, si je laisse les parties contenant la lecture du buffer de réception, j'obtient systématiquement une erreur "Could not bind to socket"
raison pour laquelle j'ai commenté cette partie du code... en gros je suis perdu dans la partie réception php....
Pour éviter les problèmes de routage, je travail en câble direct sur mon pc avec les 2 machines en ip fixe arduino 192 168 1 30 et serveur apache 192 168 1 50 (easyphp 5.4 avec extension php_sockets activée)
voili voilà...
Merci d'avance de votre aide...
Mon but est uniquement de pouvoir échanger des info entre l'arduino et mon serveur php, je verrais ensuite à utiliser ces données pour représenter des entrées/capteur ou des consignes pour l'arduino.

Salut Osaka et Chesnel,
vous semblez bien maîtriser le domaine du ethernet sur arduino, pouvez vous me dire comment récupérer des infos depuis l'arduino sur ma page php? je ne comprends déjà pas pourquoi le port de réception varie en permanence???
Merci @++