Arduino MEGA 2560 W5500 réception variable par ethernet
Bonjour,
Je suis tout nouvel utilisateur d'arduino que je souhaite utiliser connecté sur un réseau local ethernet. Le but de connecter cet arduino sur un réseau local ethernet est de pouvoir y récupérer des informations ( variables + valeurs ) qui seraient utilisées pour piloter une sortie analogique.
Actuellement je suis en phase de recherches d'informations, dans les différents forums (developpez.net, arduino, ...), afin de trouver quelques exemples simples me permettant de faire des premiers tests. J'ai aussi trouvé quelques exemples d'utilisation de sockets.
Mais pour dire vrai, je ne sais pas trop comment m'y prendre. Voila pourquoi j'en appel à vos conseils afin de m'orienter vers des exemples pertinents, librairies, etc... qui me permettraient de commencer doucement ce sujet.
En vous remerciant.
Arduino MEGA 2560 W5500 réception variable par ethernet
Bonjour,
Merci pour votre réponse.
Du coup j'ai pris un peu de temps pour regarder et tester différents exemples notamment disponibles sur le forum arduino.
J'ai aussi installé la librairie "Ethernet2" depuis l'application Arduino.
Il s'avère qu'en chargeant ce bout de code, j'arrive bien à "pinger" l'arduino et je génère en parallèle un signal carré sur la pin 12.
Ce début m'encourage fortement et je souhaite aller plus loin.
Dans l'idée, je souhaiterai envoyer une valeur via Ethernet à l'arduino, qui récupère cette valeur pour adapter la fréquence du signal carré...
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
#include <SPI.h>
#include <Ethernet.h>
#define broche 12
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(10, 2, 2, 200);
void setup() {
pinMode(broche, OUTPUT);
Serial.begin(9600);
// initialize the ethernet device
Ethernet.begin(mac, ip);
//print out the IP address
Serial.print("IP = ");
Serial.println(Ethernet.localIP());
}
void loop() {
digitalWrite(broche, HIGH); // sortie PIN 12 à l'état haut
delay(0.5); // en milliseconde
digitalWrite(broche, LOW); // sortie PIN 12 à l'état bas
delay(0.5); // en milliseconde
} |
Arduino MEGA 2560 W5500 réception variable par ethernet
Bonjour,
Oui effectivement, je m'en suis rendu compte... pas de 0,5 dans "Delay".
Merci.
Arduino MEGA 2560 W5500 réception variable par ethernet
Bonjour,
Oui j'ai fait un serveur node js lancé depuis un PC connecté à l'arduino et je compte, via une page web, renseigner différentes valeurs dans cette page web.
Dans l'idée, lorsque ces valeur seront validées (en cliquant sur le bouton), le serveur récupérera la valeur et partagera cette valeur avec l'arduino...
Coté page web et serveur js, je ne rencontre pas de difficultés, mais c'est plutot entre serveur et arduino... je ne sais pas trop comment m'y prendre. Si vous avez des idées..
Le truc c'est que je debute en arduino et je ne sais pas trop comment gérer les codes qui s'y trouvent, si je peux y mettre plusieurs fichiers , etc... pour l'instant c'est brouillon, mais je vais y arriver !!!
Merci.
Bonne journée.
Arduino MEGA 2560 W5500 réception variable par ethernet
Bonjour,
Je suis en train de finaliser la petite interface nodejs qui permettra de renseigner les valeurs de fréquence que je souhaite envoyer vers l'arduino. Je devrais être en mesure de partager mes codes rapidement.
Mais effectivement je me demande comment l'arduino va faire pour récupérer ces valeurs... Oui le serveur nodejs pourra avec une requete POST envoyer une valeur vers un destinataire, mais comment l'arduino va la récupérer ??
J'avoue ne vraiment pas être à l'aise avec l'arduino...
Merci pour vos conseils.
Arduino MEGA 2560 W5500 réception variable par ethernet
Bonjour,
Je pense qu'effectivement la methode de passer des parametre dans une page web est plutot la solution la plus facile.
Mon code actuel permet de connecter un pc avec l'arduino, et lorsque l'on passe des valeurs depuis le navigateur, tel que : 10.0.2.200/valeur=55 alors dans la console de l'arduino on voit bien passer la valeur ==> GET /valeur=55 ce qui est bien, par contre ce que j'arrive pas a faire c'est faire comprendre à l'arduino que je veux valeur=55 comme une variable afin de l'utiliser dans le loop.
Je sais qu'il faut parser les data, mais je ne sais pas comment faire. Si vous avez des conseils je suis preneur. Merci.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
|
#include <SPI.h> // Libairie communication SPI avec le Shield éthernet
#include <Ethernet.h> // Librairie communication Ethernet sur un réseau local
#define broche 12 // définition de pin 12 comme nommé broche
boolean incoming = 0;
byte MAC[] = { 0x10, 0x11, 0x12, 0x13, 0x14, 0x15 };
IPAddress IP(10, 0, 2, 200); // Adresse IP donné au Shield Ethernet
EthernetServer serveurHTTP(80); // Le Shield devient un serveur sur le port 80 (port HTTP)
void setup()
{
Ethernet.begin(MAC, IP); // ici initialisation de la carte shield en utilisant une adresse IP fixe
serveurHTTP.begin(); // lancement du serveur
Serial.begin(9600); // initialisation de la comm serie a 9600bds
Serial.print("- Arduino's IP address : "); // ici affichage dans la console de l'adresse IP de l'arduino
Serial.println(Ethernet.localIP());
pinMode(broche, OUTPUT); // ici on définit broche comme pin output
}
void loop() {
connection();
generateur_frequence();
}
void connection()
{
EthernetClient client = serveurHTTP.available();
if (client) {
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.print(c); // ici on devrait pouvoir recuperer la valeur pour la variable
}
}
}
}
void generateur_frequence()
{
// ici le code pour generer le signal
//Serial.print("- Arduino boucle generation frequence ");
} |
Arduino MEGA 2560 W5500 réception variable par ethernet
Bonjour,
Avec l'arduino mega je souhaite récupérer une valeur envoyé comme paramètre... mais je n'arrive pas encore à utiliser la fonction strtok.
Dans l'idée :
1 - je lance le programme depuis l'arduino,
2 - depuis le navigateur de mon PC je tape : 10.0.2.200:8000/?frequence=66 (66 pour l'exemple)
3 - le programme de l'arduino identifie la valeur 66.
4 - le programme de l'arduino affecte la valeur 66 à une variable qui sera utilisée plus loin dans le programme.
Mais pour l'instant j'ai pas l'impression de bien identifier / récupérer la valeur. La function strtok n'a pas l'air de "répondre", je ne comprends pas ce qui ne va pas.
Je suis preneur de vos conseils / orientations. En vous remerciant.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
|
#include <SPI.h>
#include <Ethernet.h>
#define broche 12
byte mac[] = { 0xDE, 0xAD, 0xAF, 0xBA, 0xEE, 0xDF }; // adresse MAC
IPAddress ip(10,0,2,200); // adresse IP
String readString;
EthernetServer server(8000); // port du serveur
void setup() {
Serial.begin(115200); //attention il faut configurer le tx de la console
Ethernet.begin(mac, ip); // démarrez la connexion Ethernet et le serveur
server.begin();
Serial.print("- Arduino's IP address : "); // ici affichage dans la console de l'adresse IP de l'arduino
Serial.println(Ethernet.localIP());
pinMode(broche, OUTPUT); // ici on definit la pin utilisee pour generer la frequence
}
char commande[50];
char *item;
int charcount=0;
int demiperiode=0; //definition de la demi periode du signal
void loop() {
EthernetClient client = server.available(); // listen for incoming clients
if (client) {
Serial.println("Client Connecté");
memset(commande,0,sizeof(commande));
charcount=0;
boolean currentLineIsBlank = true; // une requête http se termine par une ligne vide la ligne actuelle est vide = vrai
while (client.connected()) { // boucle infini -> tant que le client et connecté
if (client.available()) { // et que le client est disponible
char c = client.read(); // ici "c" recupere les infos de "client"
commande[charcount]=c; // ici on met dans la table "commande" les éléments "c"
if (charcount<sizeof(commande)) charcount++; // ici on adapte la taille de la table
Serial.write(c);
if (c == '\n') { // nouvelle ligne
currentLineIsBlank = true; // la ligne actuelle est vide = vrai
if (strstr(commande,"/?frequence=") >0) { // ici on verifie la presence du parametre frequence
Serial.println(("parametre frequence trouvé")); // ici verifie que strstr a bien trouve le parametre frequence ==> ça marche bien
digitalWrite(broche, LOW); // ici on passe la pin 12 à l'état éteint (pas grand interet pour l'instant)
}
item = strtok(commande, "="); // ici je voudrais recuperer la valeur associée au parametre
if (item != NULL) {
Serial.println("contenu de item");
Serial.println(item); // ici on affiche les valeurs de item separe de "="
}
memset(commande,0,sizeof(commande)); // ici on vide le tableau
charcount=0;
}
}
}
delay(1); // give the time to receive the data
client.stop(); // close the connection
Serial.println("client disonnecté");
Serial.println(F(""));
}
}
void signal()
{
digitalWrite(broche, HIGH); // turn the LED on (HIGH is the voltage level)
delay(demiperiode); // 1 milliseconde
digitalWrite(broche, LOW); // turn the LED off by making the voltage LOW
delay(demiperiode); // 1 milliseconde
} |
Arduino MEGA 2560 W5500 réception variable par ethernet
J'ai modifié mon code afin d'extraire la valeur de la variable ( demiperiod ).
Vu mon faible niveau vos critiques et remarques sont les bienvenues.
Merci.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
|
#include <SPI.h>
#include <Ethernet.h>
#define broche 12
byte mac[] = { 0xDE, 0xAD, 0xAF, 0xBA, 0xEE, 0xDF }; // adresse MAC
IPAddress ip(10,0,2,200); // adresse IP
String readString;
EthernetServer server(8000); // port du serveur
void setup() {
Serial.begin(115200); //attention il faut configurer le tx de la console
Ethernet.begin(mac, ip); // démarrez la connexion Ethernet et le serveur
server.begin();
Serial.print("- Arduino's IP address : "); // ici affichage dans la console de l'adresse IP de l'arduino
Serial.println(Ethernet.localIP());
pinMode(broche, OUTPUT); // ici on definit la pin utilisee pour generer la frequence
}
char commande[50];
char *item;
const char *delimiter ="=";
int charcount=0;
int demiperiode=0; //definition de la demi periode du signal
void loop() {
EthernetClient client = server.available(); // listen for incoming clients
if (client) {
Serial.println("Client Connecté");
memset(commande,0,sizeof(commande));
charcount=0;
boolean currentLineIsBlank = true; // une requête http se termine par une ligne vide la ligne actuelle est vide = vrai
while (client.connected()) { // boucle infini -> tant que le client et connecté
if (client.available()) { // et que le client est disponible
char c = client.read(); // ici "c" recupere les infos de "client"
commande[charcount]=c; // ici on met dans la table "commande" les éléments "c" ==> ça devrait ressembler a 10.0.2.200:8000/?frequence=2002
if (charcount<sizeof(commande)) charcount++; // ici on adapte la taille de la table
Serial.write(c);
if (c == '\n') { // nouvelle ligne
currentLineIsBlank = true; // la ligne actuelle est vide = vrai
if (strstr(commande,"/?frequence=") >0) { // ici on verifie la presence du parametre frequence
Serial.println(("parametre frequence trouvé")); // ici verifie que strstr a bien trouve le parametre frequence ==> ça marche bien
digitalWrite(broche, LOW); // ici on passe la pin 12 à l'état éteint (pas grand interet pour l'instant)
}
item = strtok(commande, delimiter); // ici je voudrais recuperer la valeur associée au parametre
while (item != NULL) { // ici on teste avec while (au lieu) de if
Serial.println("contenu de item");
Serial.println(item); // ici on affiche les valeurs de item separe de "="
item = strtok(NULL, delimiter);
}
Serial.println("\nResultat du strtok 1");
p = &mystring[0]; // ici devrait afficher qqechose comme ça : 10.0.2.200:8000/?frequence
Serial.println(p);
Serial.println("\nResultat du strtok 2");
p = &mystring[27]; // ici devrait afficher la valeur valeur : 2002
Serial.println(p);
demiperiod = p; // ==> comment affecter cette valeur à une variable ??
memset(commande,0,sizeof(commande)); // ici on vide le tableau
charcount=0;
}
}
}
delay(1); // give the time to receive the data
client.stop(); // close the connection
Serial.println("client disonnecté");
Serial.println(F(""));
}
}
void signal()
{
digitalWrite(broche, HIGH); // turn the LED on (HIGH is the voltage level)
delay(demiperiode); // 1 milliseconde
digitalWrite(broche, LOW); // turn the LED off by making the voltage LOW
delay(demiperiode); // 1 milliseconde
} |