résolu :-D Help : Ethernet shield sans interface graphique + rs485

bonjour tout le monde,

autant je commence a piger certains trucs avec l’arduino, autant le shield ethernet me laisse perplex.

donc voici ce que j’aimerai reussir a faire avec votre aide.

partie matos: arduino uno + shield ethernet + module rs485

ce que j’aimerai faire : entrer une addresse dans le navigateur sous une forme du genre “http://192.168.0.200/carte10io07on” et que cette commande soit interpretée par l’arduino et transmette une commande équivalente en rs485.
je ne souhaite pas avoir la moindre interface graphique et j’aimerai un code le plus simple possible (quitte a multiplier les lignes, je ferai le menage après)

la partie rs485, pas de probleme, je gére, c’est sur la partie de reception de la commande via http et l’interpretation de cette derniere que je seche ( a vrai dire je ne sais même pas par ou commencer).

merci a ceux et/ou celles qui pourront m’aider.

cordialement.

bonjour, cherche du coté de indexOf pour parser la chaine.

Jetez un coup à mon petit tuto ça pourrait vous donner une idée de structure de code

Il suffit de retourner une réponse http vide si vous ne voulez pas de UI

@ infobarquee, merci, je consulte et essaie de comprendre differents exemples trouvés ici et la avec ce mot clef mais ce n'est pas des plus simple a comprendre pour moi.

@ J-M-L, j'ai regardé le code et cela me semble bien complex et assez mysterieux, a commencer par le loop pratiquement vide hormis un renew (dont je ne comprend pas l'interet si en ip fixe). ce qui veux dire qu'une commande http outrepasse le loop ? il n'y a pas moyen de faire vraiment plus simple du genre "if client.read == 'carte10io07on' { serial.println("allumage sortie 07 sur carte 10") } ??

merci.

Cool !!!

en reprenant le code du site suivant : http://nmwilliam.tripod.com/arduinet.html je parvient a faire ce que je voulait, pour l’instant je test avec encore du html mais ça disparaitera au final.
voici le code modifié qui fonctionne nickel chez moi, pour l’instant les fonctions rs485 ne sont pas implémentées mais c’est une bonne base, j’ai laissé pas mal de commentaires, en ai modifié et/ou traduit d’autres pour une bonne compréhension:

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

EthernetServer server(80);// Server port


const byte ledorange = 8;// pin pour la led orange
const byte ledbleue = 9;// pin pour la led bleue

byte mac[] = { 0x00, 0x08, 0xDC, 0xAB, 0xCD, 0xEF };// Physical MAC address
byte ip[] = { 192, 168, 0, 100 };// Fixed IP address
byte gateway[] = { 192, 168, 0, 1 };// Router Gateway Internet access
byte subnet[] = { 255, 255, 255, 0 };// Subnet mask
String readString;

void setup()
{
delay(500);// Delay for Ethernet shield initialization (Arduino has 65mS Power Up delay and W5100 reset logic has 280mS)
pinMode(ledorange, OUTPUT);// Define pin for Main Light as Output
pinMode(ledbleue, OUTPUT);// Define pin for Chandelier as Output

Serial.begin(9600);// Initialize serial communications at 9600 bps
Serial.println(F("Arduino + Ethernet Shield"));
Ethernet.begin(mac, ip, gateway, subnet);// Start Ethernet
server.begin();
Serial.print(F("adresse IP de la carte:"));
Serial.println(Ethernet.localIP());// Print Server IP address
}

void loop()
{
EthernetClient client = server.available();// Create a client connection
if (client == true)
{
while (client.connected())
{
if (client.available())
{
char c = client.read();// lecture caractere par caractere de la requete html
if (readString.length() < 100)
{
readString = readString + c;// Store characters to string
}
if (c == '\n')
{
client.println(F("http/1.1 200 ok"));// Send standard http headers
client.println(F("content-type: text/html"));
client.println();
client.println(F("<!doctype html><html>"));
//client.println(F("<body bgcolor='blue'>")); //fond de page bleu
client.println(F("<center><head><title>Home Web Control</title></head>"));
client.println(F("<h2>Arduino + ethernet shield(v1)</h2>"));
client.println(F("<h4>NeXeN</h4>"));
client.println(F("<hr/><p> Click the Buttons to turn On and OFF or enter a html command<p/><hr/>"));
client.print(F("<input type=button value='led orange ON' onmousedown=location.href='/?carte10io07on'>"));
client.println(F("<input type=button value='led orange OFF' onmousedown=location.href='/?carte10io07off'>

"));
client.print(F("<input type=button value='led bleue ON' onmousedown=location.href='/?carte22io02on'>"));
client.println(F("<input type=button value='led bleue OFF' onmousedown=location.href='/?carte22io02off'>

"));
client.println(F("</body></html>"));
delay(1);// page loading delay
client.stop();// Stop client
if(readString.indexOf("/?carte10io07on") > 0) digitalWrite(ledorange, HIGH), Serial.println("orange is ON");// Switch on orange led
if(readString.indexOf("/?carte10io07off") > 0) digitalWrite(ledorange, LOW), Serial.println("orange is OFF");// Switch off orange led
if(readString.indexOf("/?carte22io02on") > 0) digitalWrite(ledbleue, HIGH), Serial.println("blue is ON");// Switch on blue led
if(readString.indexOf("/?carte22io02off") > 0) digitalWrite(ledbleue, LOW), Serial.println("blue is Off");// Switch off blue led

readString = "";// Clearing string pour nouvelle lecture
}
}
}
}
} // End of loop

non

nexen: @ J-M-L, j'ai regardé le code et cela me semble bien complex et assez mysterieux, a commencer par le loop pratiquement vide hormis un renew (dont je ne comprend pas l'interet si en ip fixe). ce qui veux dire qu'une commande http outrepasse le loop ?

Le if teste si la connexion est bonne, et si oui j'appelle la fonction handleClient() qui gère tout

le code ci dessus que vous avez trouvé est assez similaire au mien (enfin ils met le code directement dans la boucle au lieu d'appeler une fonction). il utilise des String ce qui n'est pas une super idée car ça morcelle la mémoire - c'est pour cela que dans mon code je construis un buffer standard (c-string)

Ce code ne gère que des URL statiques - sans lecture de variables et décodage de l'URL - c'est ce qui rend le code mon tuto un peu plus compliqué effectivement

J-M-L: non Le if teste si la connexion est bonne, et si oui j'appelle la fonction handleClient() qui gère tout

le code ci dessus que vous avez trouvé est assez similaire au mien (enfin ils met le code directement dans la boucle au lieu d'appeler une fonction). il utilise des String ce qui n'est pas une super idée car ça morcelle la mémoire - c'est pour cela que dans mon code je construis un buffer standard (c-string)

Ce code ne gère que des URL statiques - sans lecture de variables et décodage de l'URL - c'est ce qui rend le code mon tuto un peu plus compliqué effectivement

oui effectivement, votre code, bien que sans nul doute plus efficace que celui que j'utilise, a été trés compliqué a appréhender pour moi qui suis novice. Néanmoins je tiens a vous remercier de l'aide que vous m'avez apporté.

bien cordialement.

pas de soucis ! (en guise d'exercice vous pourriez vous entrainer à ré-écrire la construction de la chaîne de réception avec un buffer statique et en gérant correctement la requête HTTP - affichez tout ce que vous recevez vous verrez)

bons bidouillages