Vote utilisateur: 3 / 5

Etoiles activesEtoiles activesEtoiles activesEtoiles inactivesEtoiles inactives
 

Nécessite une LED sur IO2 et un potentiomètre sur A0.

Schéma de cablage :

 

le code pour la carte Arduino :

  1. /**
  2. * Communication bidirectionnelle en WiFi.
  3. * Nécessite une LED sur IO2 et un potar sur A0.
  4. * Une autre appli doit être lancé sur PC ou tablette pour communiquer.
  5. * Voir les exemples
  6. *     - Processing (fonctionnel su PC et tablette mais pas en javascript),
  7. *     - AppInventor (seul l'émission vers Arduino est pour l'instant fonctionnelle),
  8. *     - Windev (mettre 2 dans la constante PositionCaractere),
  9. *     - Page Web (non fait).
  10. * Les exemples contiennent un schéma du cablage.
  11. * Attention à bien modifier les lignes indiquant le SSID, le type de cryptage du réseau wifi
  12. * le port et l'adresse IP
  13. *
  14. * Téléverser le programme puis lancer le moniteur série.
  15. * A son invite lancer le logiciel PC ou tablette.
  16. *
  17. * Les lignes estampillées "Pour débogage" ne sont pas nécessaires
  18. *
  19. */
  20. #include <SPI.h>
  21. #include <WiFi.h>
  22.  
  23.  
  24.  
  25. const int LEDJaune=2;
  26. const int Potar=A0;
  27.  
  28. int OctetRecu;
  29. int OctetRecuPrecedent;
  30. int ValeurPotar;
  31. int ValeurPotarPrecedente;
  32.  
  33. String ChaineRecu;
  34. int PositionCaractere=2; //1 pour processing et 2 pour windev
  35.  
  36.  
  37. //******************** Paramètres de connexion *********************
  38. //******************************************************************
  39. char ssid[] = "SSID"; //  SSID du réseau Wi-Fi à changer
  40. char pass[] = "PASS"; // inutile pour un réseau non protégé
  41. unsigned int port = 50000;// Numéro du port
  42. //******************************************************************
  43.  
  44. int status = WL_IDLE_STATUS;
  45. WiFiServer server(port);// création d'un serveur qui écoute le port 50000
  46. boolean alreadyConnected = false;
  47.  
  48. void setup()
  49. {
  50.   pinMode(LEDJaune, OUTPUT);
  51.   Serial.begin(9600); //Intitialisation de la communication série et attente de l'ouverture de du port série - Pour débogage
  52.   while (!Serial) {;}//Attente de connexion du port série - Pour débogage
  53.   if (WiFi.status() == WL_NO_SHIELD) // Vérifie la présence du shield wi-fi
  54.   {
  55.     Serial.println("Le shield WiFi doit être connecté");
  56.     while(true);//arrêt du programme
  57.   }
  58.   while ( status != WL_CONNECTED) // attente de la connection au Wi-Fi
  59.     {
  60.       Serial.print("Tentative de connexion au SSID : ");
  61.       Serial.println(ssid);
  62.       //Connexion en mode  WPA ou non protégé
  63.       if (pass=="" )
  64.         {status = WiFi.begin(ssid);} // Connection au  Wi-Fi non protégé
  65.         else {status = WiFi.begin(ssid, pass);} // Connection au  Wi-Fi WPA
  66.       delay(500);
  67.     }
  68.   server.begin();// démarrage de l'objet serveur
  69.   IPAddress ip = WiFi.localIP();// Pour débogage
  70.   Serial.print("Lancer maintenant le logiciel sur PC ou Tablette avec : \n     - comme IP : ");// Pour débogage
  71.   Serial.print(ip);// Pour débogage
  72.   Serial.println(",");// Pour débogage
  73.   Serial.print("     - comme port :");// Pour débogage
  74.   Serial.print(port);// Pour débogage
  75.   Serial.println(".");// Pour débogage
  76.  
  77.  }
  78.  
  79.  
  80. void loop() {
  81.   WiFiClient client = server.available();// Attente de la connection d'un nouveau client
  82.   if (client)
  83.   {
  84.     if (!alreadyConnected)
  85.     {
  86.       client.flush();    
  87.       alreadyConnected = true;
  88.     }
  89.     if (client.available() > 0) // si qqc de reçu
  90.     {
  91.       ChaineRecu=client.readString();// Réception d'une chaine
  92.       Serial.print("Chaine reçu :");// Pour débogage
  93.       Serial.println(ChaineRecu);// Pour débogage
  94.       if (ChaineRecu.length()>1)
  95.       {
  96.        OctetRecu=int(ChaineRecu[ChaineRecu.length()-PositionCaractere]);//Extraction du dernier octet de la chaine
  97.        Serial.print("dans le if :");// Pour débogage
  98.        Serial.print(ChaineRecu.length());// Pour débogage
  99.       }
  100.       else
  101.           {
  102.             OctetRecu=int(ChaineRecu[0]);
  103.             Serial.println("dans le else :");
  104.           }
  105.       //OctetRecu = client.read();//Réception d'un octet directement. Marche si on peut envoyer seulement un octet
  106.     }
  107.     //Cette structure permet d'éviter de "noyer" la com série avec des info sans intérêt
  108.     // Attention je ne gère ici qu'un seul octet.
  109.     // Pour un communication plus pertinente il peut être utile de transmettre des chaines
  110.     if (OctetRecu!=OctetRecuPrecedent)
  111.      {
  112.        OctetRecuPrecedent=OctetRecu;
  113.       Serial.print("Valeur reçu : ");// Pour débogage
  114.       Serial.println(OctetRecu);// Pour débogage
  115.       // Cette structure permet de gérer l'odre reçu. On peut créer un cas par défaut
  116.         switch (OctetRecu)
  117.         {
  118.           case 100:
  119.             digitalWrite(LEDJaune,HIGH);
  120.           break;
  121.           case 101:
  122.             digitalWrite(LEDJaune,LOW);
  123.           break;
  124.         }
  125.      }
  126.     //client.write("Essais");
  127.     ValeurPotar=map(analogRead(Potar),0,1024,0,256);
  128.     //Cette structure permet d'éviter de "noyer" la com série avec des info sans intérêt
  129.    
  130.     if ((ValeurPotar>ValeurPotarPrecedente+2) || (ValeurPotar<ValeurPotarPrecedente-2))
  131.     {
  132.      
  133.       Serial.print("Valeur emise : ");// Pour débogage
  134.       Serial.println(ValeurPotar);// Pour débogage
  135.       client.write(ValeurPotar);//Emission d'un octet **********************************
  136.       //client.print(ValeurPotar);
  137.       ValeurPotarPrecedente=ValeurPotar;
  138.     }
  139.   }
  140. }

Lancer Arduino.ino puis la communication série et après ouvrir une application sur PC ou Tablette (WinDev, Processing ou AppInventor).

Voir les exemples : 

    - Processing (fonctionnel sur PC et tablette, mais pas en javascript - mettre 1 dans la constante PositionCaractere),

Impossible de trouver le layout

    - AppInventor (seule l'émission vers Arduino est pour l'instant fonctionnelle - mettre 1 dans la constante PositionCaractere),

Impossible de trouver le layout

    - WinDev (mettre 2 dans la constante PositionCaractere),

Impossible de trouver le layout

    - Page Web (non fait).

 

Attention à bien modifier les lignes indiquant le SSID, le type de cryptage du réseau WiFi ainsi que l’adresse IP et le Port dans le fichier Arduino.ino et l’adresse IP et le Port dans les autres.

Vous n'avez pas le droit de commenter cet article.

Commentaires   

mandrin
# mandrin 17-02-2017 10:50
bonjour,
Je voulais essayer une communication wifi avec Processing, et j'ai obtenu lors de la compilation les messages suivants.
processing.app.SketchException: unexpected char: 'A'
at processing.mode.java.JavaBuild.preprocess(JavaBuild.java:361)
at processing.mode.java.JavaBuild.preprocess(JavaBuild.java:155)
at processing.mode.java.JavaBuild.build(JavaBuild.java:122)
at processing.mode.java.JavaBuild.build(JavaBuild.java:104)
at processing.mode.java.JavaMode.handleLaunch(JavaMode.java:122)
at processing.mode.java.JavaEditor.lambda$0(JavaEditor.java:1097)
at java.lang.Thread.run(Thread.java:745)
Pour les 2lignes suivantes.
"JavaScript > Playback Setting (D:\Achives softs\Processing\Serveur_Bidir_Essai\Processing\data)"
@pjs preload="LEDBrillante.png, LEDEteinte.png, PotarVide.png, arduinoledpotar.png";
merci de vos conseils.
le reste du prg peut vous etre envoyé en pièces jointes
Frank SAURET
# Frank SAURET 17-02-2017 14:52
Bonjour,
La ligne en question n'est nécessaire que pour compiler le programme en JS. J'ai fait ce programme il y a quelques années et je pense en processing 2.
Si vous tenez à compiler en JS essayez avec la version 2 et sinon supprimez cette ligne.
Frank