Pages: [1]   Go Down
Author Topic: Commande alllumage LED par ethernet  (Read 5814 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 6
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour, j'ai encore besoin de vos lumières :
comment donner un ordre à l'arduino par ethernet (arduino en webserver, avec l'ordi connecté directement par câble sans passer par un routeur) ?
Par exemple je voudrais allumer une LED (sortie digitale) en cliquant sur un bouton de ma page HTML ?
Ou bien, si j'entre un nombre dans un champ HTML, je peux faire clignoter la LED à une vitesse fonction de ce nombre qui représente le délai entre chaque allumage de la LED.

1°) Le code HTML je peux me débrouiller, mais je voudrais savoir comment envoyer cet ordre à l'arduino depuis le PC ?
2°) de quelle manière faire attendre l'arduino un nouvel ordre avant de continuer ? (exemple : faire clignoter la LED 3 fois puis attendre l'ordre suivant).

Merci d'avance à tous, j'ai déjà fait un 1er grand pas grâce à polo-m sur un autre topic.
Logged

Blainville (Montreal area)
Offline Offline
Newbie
*
Karma: 0
Posts: 21
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vu sur un autre post : http://www.siteduzero.com/tutoriel-3-14136-maitrisez-le-temps.html avec millis() à la place de SDL_GetTicks(). millis() (cf http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1274881200)
Pour envoyer "l'ordre" ce que je t'ai proposé ne convient pas ? un formulaire html (avec juste un bouton submit par exemple) que tu traite côté arduino.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 6
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bah ça répond pas exactement à ce que je cherche. Mais tu m'as mis sur la bonne voie, en effet je peux créer une boucle d'attente avec une condition permettant d'en sortir dès que l'arduino reçoit un signal venant d'un capteur ou d'une commande de l'ordi. Merci quand même polo-m.

Je cherche surtout à envoyer un ordre au serveur Arduino depuis ma page HTML, et ça c'est la clé de mon projet.
Logged

Blainville (Montreal area)
Offline Offline
Newbie
*
Karma: 0
Posts: 21
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je ne comprend pas tout alors, qu'entend-tu pas ordre ? L'arduino peut être configuré pour attendre une requête http (par exemple de formulaire de type post, avec passage de paramètres). La réponse peut être récupérée dans l'instruction loop  avec Client.read(), après il faut tester les paramètres de la requête et faire le traitement voulu. Dis moi si j'ai pas compris ta demande smiley
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 6
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oui je crois que c'est ça, mais comme je suis débutant, je n'ai peut-être pas les bons mots techniques.
Voilà, pour faire simple, comment faire pour allumer puis éteindre une LED depuis la page HTML en cliquant sur un lien ?
Je ne sais pas comment le serveur web de l'arduino peut recevoir une telle requête HTTP et l'interprêter ?

Je devine que client.read est peut-être la bonne formule, mais.... on écrit quoi autour ?
Si on part de cet exemple simple :

void loop()
{ digitalWrite(LED, HIGH);
delay(1000);
digitalWrite(LED, LOW);
delay(1000);
}

La LED clignote automatiquement toutes les secondes.
Au lieu de ça, je voudrais que la LED reste allumée et quand je clique sur un lien HTML, elle s'éteint.

Tu as la solutiion ?

Logged

Blainville (Montreal area)
Offline Offline
Newbie
*
Karma: 0
Posts: 21
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code sorti comme ça non testé et perfectible, mais je dirai ça :
Déclarer le server

 Server server(80);
 String readString;
setup() {
    server.begin();
}
loop() {
     if (client.available()) {
        char c = client.read();
          readString.append(c);
          if (c == '\n') { //fin de la requete
          if(readString.contains("Led1=on")) {
              digitalWrite(led1, HIGH);
              readString="";
          }
        }
}
Pas très propre au niveau du code mais ça doit marcher (en corrigeant peut être 2-3 petits trucs), j'ai utilisé la librairie String.

Il faut aussi connecter le client, regarde : http://arduino.cc/en/Reference/Ethernet il y a tout.
Après il existe peut être des librairies développées par la communauté pour traiter des requêtes http, ça pourrait être intéressant.

Edit : http://code.google.com/p/webduino/ il y a ce projet qui je pense peut te faciliter la tâche, mais je ne l'ai pas personnellement testé.
« Last Edit: July 27, 2010, 01:53:58 am by polo_m » Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 6
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci polo-m,

j'ai compilé ta solution avec celle du lien suivant :
http://www.scienceprog.com/getting-hands-on-arduino-ethernet-shield/
Avec tout ça j'ai réussi à atteindre mon objectif qui est de commander une LED et recevoir en retour son état allumé ou éteint.

Voici le code pour info, j'ai compris enfin comment le HTML intervient dans les requêtes.

L'arduino attend "L1" pour allumer la LED:
Code:
if (c == '\n') {
if(readString.contains("L=1")) {
digitalWrite(ledPin, HIGH);
LEDON = true;
}else{
digitalWrite(ledPin, LOW);
LEDON = false; }
C'est la checkbox qui écrit la requête et le bouton l'envoie vers l'arduino :
Code:
client.println("<form method=get name=LED><input type=CHECKBOX name=L value=1>LED<br><input type=submit value=submit></form>");

Et ci-dessous le code complet.
Merci encore !!!

Code:
#include <WString.h>
#include <Ethernet.h>

/*
Simple Ethernet Test
Arduino server outputs simple text to browser
and controlling LED with simple checkbox
The circuit:
* Arduino Duemilanove
* Arduino Ethernet shield
* Basic FTDI breakout 5V
* LED connected to GND and digital pin 4 via resistor
*/

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = { 169, 254, 10, 64 }; // ip in lan
Server server(80); //server port
int ledPin = 4; // LED pin
String readString = String(30); //string for fetching data from address
boolean LEDON = false; //LED status flag

void setup(){
//start Ethernet
Ethernet.begin(mac, ip);
//Set pin 4 to output
pinMode(ledPin, OUTPUT);
//enable serial datada print
Serial.begin(9600); }

void loop(){
// Create a client connection
Client client = server.available();
if (client) {
while (client.connected()) {
if (client.available()) {
char c = client.read();
//read char by char HTTP request
if (readString.length() < 30) {
//store characters to string
readString.append(c); }
//output chars to serial port
Serial.print(c);
//if HTTP request has ended
if (c == '\n') {
//lets check if LED should be lighted
if(readString.contains("L=1")) {
//led has to be turned ON
digitalWrite(ledPin, HIGH); // set the LED on
LEDON = true;
}else{
//led has to be turned OFF
digitalWrite(ledPin, LOW); // set the LED OFF
LEDON = false; }
// now output HTML data starting with standart header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
//send first heading
client.println("<font color='red'><h1>HTTP test routines</font></h1>");
client.println("<br /><hr />");//some space between lines
//controlling led via checkbox
client.println("<h1>LED control</h1>");
//address will look like http://192.168.1.110/?L=1 when submited
client.println("<form method=get name=LED><input type=CHECKBOX name=L value=1>LED<br><input type=submit value=submit></form>");
client.println("<br />");
//printing LED status
client.print("<font size='5'>LED status: ");
if (LEDON)
client.println("<font color='green' size='5'>ON");
else
client.println("<font color='grey' size='5'>OFF");
client.println("</body></html>");
//clearing string for next read
readString="";
//stopping client
client.stop();
}}}}}
Logged

Pages: [1]   Go Up
Jump to: