Go Down

Topic: Envoie de données en UDP (Read 3621 times) previous topic - next topic

regarde l'exemple UDPSendReceiveString.ino, et tu verras que:

Code: [Select]
  // start the Ethernet and UDP:
  Ethernet.begin(mac,192, 168, 1, 40);

est foireux.

Il faut donc quelque chose comme:
Code: [Select]
IPAddress monIP(192, 168, 1, 40); // ip de l'arduino
Ethernet.begin(mac,monIP);


Ensuite:

Code: [Select]
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
n'a pas de sens, puisque dans l'exemple c'est l'information d'IP et port du message reçu. Or tu n'en as pas dans ton cas.

Il faut donc quelque chose comme:
Code: [Select]
IPAddress remoteIP(192, 168, 1, 177); // ip du serveur
Udp.beginPacket(remoteIP, 9999);

pour lui indiquer quel est l'IP et le port de la cible (ton serveur)

Gromain
"pour résoudre un gros problème, il est souvent plus facile de le diviser en petits problèmes élémentaires..."

projet domotique xPLDuino
IRC: freenode #xplduino

je n'avais pas vu, mais tu as 2 fois "Ethernet.begin" dans le setup(). il n'en faut qu'un.
Garde uniquement:

Code: [Select]
Ethernet.begin(ipLocal, passerelle, masque);

"pour résoudre un gros problème, il est souvent plus facile de le diviser en petits problèmes élémentaires..."

projet domotique xPLDuino
IRC: freenode #xplduino

Merci pour la remarque je n'est pas fait attention  XD
Toujours aucun changement au niveau de Wireshark. Tout a l'heure j'ai eu quelques trames sur Wireshark ( la source était Arduino.cc et la destination était mon pc en 192.168.1.59 alors qu'elle est censé être 192.168.1.26).

C'est bon la carte Arduino communique avec le serveur  :D mais l'action ce fait continuellement, le bouton poussoir n'est pas pris en compte j'ai l'impression.

cool que ça marche.

Pour le bouton, il faut une soit une résistance de pull-up soit une pull-down.

Si tu utilises une pull-up (interne ou externe), alors le niveau sera HIGH quand le bouton n'est pas pressé.

http://arduino.cc/en/Tutorial/DigitalPins

Note que tant que tu appuieras sur le bouton, la trame sera envoyée. Il faudra prévoir un mécanisme soft pour ne prendre en compte qu'une seule fois par appui.
"pour résoudre un gros problème, il est souvent plus facile de le diviser en petits problèmes élémentaires..."

projet domotique xPLDuino
IRC: freenode #xplduino

Ok merci, je vais bosser sur la fonction LOW du bouton car je me retrouve avec 10000 repères sur le serveur c'est ennuyant XD

pourrais-tu m'éclairer sur la commande qui va permettre lors de l'appui sur le bouton poussoir, d'envoyer le paquet et d'arrêter l'envoie quand on relâche le bouton. Avec la commande il envoie le paquet 1 fois et ne le renvoie pas si il est pressé une autre fois  :smiley-roll:
Code: [Select]
void loop() {


  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);
  // check if the pushbutton is pressed.     
    if (buttonState == HIGH);

IPAddress remoteIP(192, 168, 1, 26); // ip du serveur
    Udp.beginPacket(remoteIP, 9999);
    Udp.write("label: debut");
    Udp.endPacket();
     
    if (buttonState == LOW);
     Udp.endPacket();


je pense qu'il n' y a pas de boucle.

il va falloir que tu te mettes au C pour comprendre un minimum ce que tu codes et t'en sortir seul ;)

Code: [Select]
Udp.endPacket(); ne fait pas ce que tu penses qu'il fait (http://arduino.cc/en/Reference/Ethernet)

Il faut simplement que tu mémorises que tu as envoyé le message, et tu reset le flag une fois le bouton relaché. Si le flag est vrai, alors tu n'envoies pas le message.

Code: [Select]
boolean memo = false; // variable globale, à placer en tete du code
IPAddress remoteIP(192, 168, 1, 26); // ip du serveur, tu peux le placer en tete du code également

void loop() {


// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);

// check if the pushbutton is pressed et que la commande n'est pas envoyée
if (buttonState == HIGH &! memo ){

Udp.beginPacket(remoteIP, 9999);
Udp.write("label: debut");
Udp.endPacket();

memo=true; // on memorise que la commande a été envoyée
}

if (buttonState == LOW){
memo=false; // on remet à zéro le flag
};


il est possible que sur appui il envoie plusieurs fois le message à cause de possible rebonds du contact. Dans ce cas temporise un peu avant de relire l'entrée (100ms)
"pour résoudre un gros problème, il est souvent plus facile de le diviser en petits problèmes élémentaires..."

projet domotique xPLDuino
IRC: freenode #xplduino

Code: [Select]

boolean memo = false; // variable globale, à placer en tete du code

void setup() {
  //---- initialise la connexion Ethernet avec l'adresse MAC du module Ethernet, l'adresse IP Locale
//---- l'adresse IP de la passerelle internet et le masque du réseau local
Ethernet.begin(ipLocal, passerelle, masque);
delay(1000); // donne le temps à la carte Ethernet de s'initialiser

  IPAddress (192, 168, 1, 40); // ip de l'arduino
 
  Udp.begin(8888);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
}

void loop() {


  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);
  // check if the pushbutton is pressed.     
    if (buttonState == HIGH &! memo);
      {

IPAddress remoteIP(192, 168, 1, 26); // ip du serveur
    Udp.beginPacket(remoteIP, 9999);
    Udp.write("label: debut");
    Udp.endPacket();
    memo=true; // on memorise que la commande a été envoyée
      }
  if (buttonState == LOW); {
  memo=false; // on remet à zéro le flag
   delay(100);
  }
}
   



toujours le même problême  =(

Je pense que le problème vient de ma commande qui ne dit pas à la carte Arduino d'arrêter d'envoyer des paquets quand le serveur en a reçu un. C'est pour cela qu'il en envoie continuellement.

Problème résolue merci à toi Gromain. :D

Go Up