Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Arduino] Inscrire la variable sur le PC

    17 novembre 2014 à 17:11:56

    Bonjour,

    Je recherche depuis un certain temps s'il est possible ( et si oui comment ) d'envoyer une variable au PC pour contrôler ou lire des variables Arduino depuis un site web hébergé sur le PC qui est connecté à la carte Arduino également, si jamais je ne me suis pas assez bien expliqué : j'aimerais pouvoir voir des mesures que ma carte Arduino ferait ( un thermomètre ) et me la mettre sur mon site web ( La température est de : #LaVariable# )

    En espérant que vous pourrez m'aider.

    Merci d'avance.

    • Partager sur Facebook
    • Partager sur Twitter
      17 novembre 2014 à 17:46:05

      Oui, c'est possible ;)

      En revanche, cela va te demander un bon petit packet de ligne de code.


      Coté arduino, tu n'as pas vraiment le choix : le seul moyen de communiquer avec un PC est le Serial.

      Tu peux donc t'en servir pour envoyer ta valeur.

      Un petit exemple :

      int val = 12;
      
      Serial.print(val);
      Serial.print(':');

      Tu noteras la présence du caractère "deux points" qui servira de délimiteur.


      Coté PC, si ton arduino envoie des données en permanence, tu devrais recevoir quelque chose qui ressemble à 12:55:988:52:25:448

      Maintenant, tu comprends l'utilité du caractère "deux points" qui permet de séparer les différentes valeurs.

      Si tu as plusieurs données à envoyer, libre à toi d'ajouter d'autres caractères et/ou délimiteurs.

      Par exemple, si l'arduino doit envoyer une Température et une Pression, cela peut être : T25;P1013;T24;P1014;T24;P1015 ...

      Du coup, il te faudra ouvrir le port COM et lire les données petit à petit jusqu'à trouver le caractère "deux points".

      Si tu as suivie le cours de C++, tu dois connaitre Qt, ce qui te permettra de faire ça facilement avec la lib QextSerialPort.


      Toujours coté PC, il faut aussi envoyer les données sur le serveur.

      Pour cela, on peut imaginer un chargement de page PHP en transmettant la valeur reçue sur le port COM.

      Cela donne donc une URL du genre : http://tonsite.com/reccord.php?T=25

      La page PHP se chargera elle d'ajouter une ligne dans la base de données de façon à enregistrer qu'il faut 25°C

      Tu peux là encore faire ça avec Qt et sa classe QNetworkAccessManager ainsi que ses dérivées.


      Et pour finir, il te faudra coder la page reccord.php dont j'ai évoqué le fonctionnement juste au dessus.


      Notons quand même que l'emploie d'un shield Ethernet te permettrait de ne pas utiliser de PC.

      En effet, avec ce shield, l'arduino aura accès à internet et pourra fait lui même les requêtes de chargement de l'URL.

      -
      Edité par lorrio 17 novembre 2014 à 17:53:12

      • Partager sur Facebook
      • Partager sur Twitter
        18 novembre 2014 à 9:24:25

        Bonjour,

        Tout d’abord merci pour votre réponse plus que rapide, je comprends l’utilité de la bibliothèque Qt, je n'arrives en revanche pas à l’utiliser, j'ai donc essayé de faire un petit programme, en suivant deux ou trois tutoriels sur le Qt sur internet, mais sans grand succès. 

        Code :

        #include "qextserialport.h"
        
        int thermometre = 5;
        
        void Qt()
        {
          port = new QextSerialPort("COM1");
          connect(port, SIGNAL(readyRead()), this, SLOT(onDataAvailable()));
          port->open();
        }
        
        void Qt_read()
        {
          QByteArray data = port->readAll();
          processNewData(usbdata);
        }
        
        void setup()
        {
          pinMode(thermometre, INPUT);
          Serial.begin(9600);
        }
        
        void loop()
        {
          thermometre_read = Serial.read(thermometre);
          Serial.print(thermometre_read);
          Serial.print(";");
          Qt_read();
        }

        Par contre, y aurait-il un moyen pour stocker les variables dans un document texte, sans avoir besoin de faire passer l'info dans l'URL de ma page Php ( c'est juste pour que ça fasse un peu plus propre dans les liens, parce que j'ai une bonne dizaine de capteurs, mais si ce n'est pas possible, ça ne fait rien :) ).

        Merci encore pour votre aide.

        -
        Edité par TheDarangel 18 novembre 2014 à 9:36:00

        • Partager sur Facebook
        • Partager sur Twitter
          18 novembre 2014 à 9:58:36

          Alors là, j'avoue ne pas du tout comprendre ton code.

          En effet, il y a un petit problème : tu mélanges un peu tout :-°


          D'un coté, il y a les fonctions setup et loop qui utilise Serial.begin et Serial.print pour transmettre des données.

          => C'est donc un code purement Arduino destiné à envoyer des données vers un PC

          De l'autre coté, il y a les fonctions Qt et Qt_read qui QextSerialPort pour lire des données.

          => C'est donc un code purement PC destiné à recevoir des données que l'arduino envoie.


           Normalement, ton code arduino devrait ressemblé à ça :

          int pinThermometre = 5;                          // Thermomètre ANA connecté sur la pin 5
          
          void setup() {
            pinMode(pinThermometre , INPUT);               // On passe la pin en INPUT
            Serial.begin(9600);                            // On commence la COM à 9600b
          }
           
          void loop()
          {
            int temperature = analogRead(pinThermometre);  // On lit la température (brut)
            Serial.print(thermometre_read);                // On l'envoie
            Serial.print(";");                             // On envoie aussi un délimiteur
            delay(500);                                    // On attend 500ms avant de recommencer
          }

          Avec cela, ton arduino devrait envoyer la température brut (valeur de l'ADC entre 0 et 1023 qu'il faudra ensuite convertir en °C) toutes les 500ms soit 2 fois par secondes.


          Pour Qt, je ne te cache pas que ce sera bien plus compliqué.

          Tu auras besoin de télécharger et installer l'IDE complet (Qt + QtCreator) soit environ 1 Go.

          Ensuite, tu devras faire un nouveau projet et commencer à coder.

          Tu peux t'inspirer de l'ensemble Serial Term pour voir comment utiliser qtserialport : http://qt-project.org/doc/qt-5/qtserialport-terminal-example.html

          Par contre, je ne te cache pas que Qt ne s'apprend pas en un jour.

          Le dernier chapitre du cours Q++ est entièrement consacrer à Qt et il faut surement plusieurs semaines pour tout assimiler.


          Pour stocker les données dans un document texte, là encore Qt te permet de faire ça avec la classe QFile.

          En faite, Qt permet vraiment de faire tout et n'importe quoi sur un PC (gérer des fenêtres, du réseau, des fichiers, des images,  des sons, des vidéos, des threads, des scripts JS ...)

          C'est vraiment une lib extrêmement puissante et diversifiée et donc longue à maitriser au début.

          • Partager sur Facebook
          • Partager sur Twitter
            18 novembre 2014 à 17:08:14

            Bonjour,

            D'accord, je vais donc me documenter sur cette Lib, merci infiniment pour votre aide, vous venez de sauver mon projet de Bac :)

            Merci encore.

            -
            Edité par TheDarangel 19 novembre 2014 à 9:46:14

            • Partager sur Facebook
            • Partager sur Twitter
              8 janvier 2015 à 17:08:29

              Bonjour,

              je me permet de ré-ouvrir ce sujet, parce que j'aimerais savoir s'il est possible de faire ce genre de programme directement sans la lib Qt ?

              et si oui, comment ,

              Merci d'avance :)

              • Partager sur Facebook
              • Partager sur Twitter
                8 janvier 2015 à 19:18:35

                Bien sûre que tu peux faire ça sans la lib Qt : il te suffit de passer par les API de ton système d'exploitation.

                Cependant, le gros avantage de Qt, c'est que c'est une librairie très bien codée, facile à utiliser et qui fonctionne sur tous les systèmes d'exploitations.

                Si tu utilises l'API windows, tu te rendras vite compte que le code finale est imbuvable, excessivement long et ne marche que sur Windows.

                Ce que l'on peut faire facilement en quelques lignes de code avec Qt peut nécessiter 10 à 100 fois plus de lignes avec l'API windows.

                Pour plus d'infos, c'est pas là : http://msdn.microsoft.com/en-us/library/ff802693.aspx

                • Partager sur Facebook
                • Partager sur Twitter
                  11 janvier 2015 à 11:24:39

                  Bonjour,

                  Ok je vais aller voir tout ça, merci beaucoup :)

                  Cordialement

                  • Partager sur Facebook
                  • Partager sur Twitter
                    11 janvier 2015 à 13:43:36

                    sinon, je sais pas si ça a été dit dans le post, tu peux utiliser les librairies ethernet de ta carte arduino, et donner les données à ton site via un formulaire sur une page que lui seul connait...

                    -
                    Edité par remace 11 janvier 2015 à 13:44:15

                    • Partager sur Facebook
                    • Partager sur Twitter

                    oui. non. enfin je regarde et je te dis.

                      11 janvier 2015 à 13:48:47

                      Oui, j'ai déjà évoqué cela ;)

                      lorrio a écrit:

                      [...]

                      Pour cela, on peut imaginer un chargement de page PHP en transmettant la valeur reçue sur le port COM.

                      Cela donne donc une URL du genre : http://tonsite.com/reccord.php?T=25

                      La page PHP se chargera elle d'ajouter une ligne dans la base de données de façon à enregistrer qu'il faut 25°C

                      Tu peux là encore faire ça avec Qt et sa classe QNetworkAccessManager ainsi que ses dérivées.

                      [...]

                      Notons quand même que l'emploie d'un shield Ethernet te permettrait de ne pas utiliser de PC.

                      En effet, avec ce shield, l'arduino aura accès à internet et pourra fait lui même les requêtes de chargement de l'URL.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        11 janvier 2015 à 14:19:07

                        ha bah tl;dr désolé :p
                        • Partager sur Facebook
                        • Partager sur Twitter

                        oui. non. enfin je regarde et je te dis.

                          11 janvier 2015 à 20:14:31

                          salut,

                          il y a peut être plus simple qu'un délimiteur, peut être qu'en envoyant un caractère a chaque fois depuis ton interface graphique et la récupéré dans un switch du côté de l'Arduino non? Perso j'ai fais comme ça pour récupéré les infos sur mon IHM que j'ai fais avec Visual Studio et ça fonctionne pas mal :).

                          • Partager sur Facebook
                          • Partager sur Twitter
                            11 janvier 2015 à 20:30:57

                            Ne pas mettre de délimiteur, cela va bien pour l'envoie de commandes (du genre A=AllumerLed1, B=StoperMoteur, C=ModeVeille ...)

                            Mais pour envoyer une température, cela risque d'être un peu plus compliqué...

                            A la limite, on pourrait associer une lettre pour chaque degré (du genre A=0, B=1, C=2, D=3 ...)

                            Mais ce n'est pas très pratique et assez limité (de 0 à 25°C voir 0 à +51°C si l'on continue avec les lettres minuscules).

                            Et si jamais il veut envoyer une autre infos en plus, c'est mort.

                            • Partager sur Facebook
                            • Partager sur Twitter
                              12 janvier 2015 à 10:27:18

                              Pourquoi faire? si il veut juste récuperer une valeur, il envoi par exemple 'a' a l'arduino, de son côté l'arduino va réagir  car quand on lui envoi 'a' c'est que l'on veut une temperature, donc il l'envoi.

                              exemple provenant de mon code :

                              char carlu = 0; //variable contenant le caractère à lire
                                  int cardispo = 0; //variable contenant le nombre de caractère disponibles dans le buffer
                                  
                                  cardispo = Serial.available();
                                  
                                  while(cardispo > 0) //tant qu'il y a des caractères à lire
                                  {
                                      carlu = Serial.read(); //on lit le caractère
                                      switch(carlu)
                                      {
                                        case 't':
                                          Serial.println(tempD);
                                        break;
                                        
                                        case 'p' :
                                          Serial.println(Pvalue);
                                        break;
                                        
                                        case 'i':
                                          Serial.println(Ivalue);
                                        break;
                                          
                                        case 's':
                                          Serial.println(PIsum);
                                        break;
                                          
                                        case 'd':
                                          Serial.println(PIdelta);
                                          break;
                                        
                                        case 'C':
                                          Serial.println(Pcoeff);
                                          break;
                                        
                                        case 'c':
                                          Serial.println(Icoeff);
                                          break;
                                          
                                        case 'o':
                                          Serial.println(consigne);
                                          break;  
                                        case 'D':
                                          Serial.println(tempC);
                                          break;  
                                      }
                                      
                                      cardispo = Serial.available(); //on relit le nombre de caractères dispo
                                  }



                              • Partager sur Facebook
                              • Partager sur Twitter
                                12 janvier 2015 à 10:45:08

                                Ouai, ça marche aussi, sauf que cela pose quand même 2 autres problèmes :

                                - le PC est obligé d'envoyer ses commandes en boucles

                                - le PC est obligé de respecter des temps de pause pour être sur de récupérer la bonne donnée.

                                D'ailleurs, si le PC envoie 2 commandes sans respecter un temps de pause (du genre envoyer Di d'un coup), il va recevoir 256 et donc impossible pour lui de savoir si la réponse est 25°/6A ou si la réponse est 2°/56A

                                Ce n'est donc pas pratique non plus, même avec des commandes, il vaut mieux aussi utiliser des délimiteurs dans la réponse.

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  12 janvier 2015 à 12:36:23

                                  C'est peut être le cas sur des programmes assez lourd, mais personnellement je n'ai jamais eu ce soucis avec mon programme. Je récupère les infos de température et de régulation (PID)  pour mon incubateur et j'ai laisser le programme tourné plusieurs jours sans problème. Et je suis sur qu'il n'y a pas de loupé vu que le programme n'a jamais planté et que j'enregistre mes valeurs toutes les minutes.

                                  Par contre du côté HMI, j'envoi tous les caractères en même temps du moins via une boucle for, et je fait un split de la chaîne récupéré pour les affiché correctement. 

                                  -
                                  Edité par steph02590 12 janvier 2015 à 12:38:47

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    12 janvier 2015 à 12:49:42

                                    Tu viens de te trahir toi même :D Le split tu le fais avec quoi ?

                                    => Grâce au caractère saut de ligne \n qu'aura ajouté le println.

                                    Donc sans t'en rendre compte, tu utilises bien un délimiteur : le caractère \n

                                    Affaire classée, il faut un délimiteur ;)

                                    Celui-ci peut être \n (en utilisant println) ou n'importe quel autre caractère (en utilisant deux print).

                                    -
                                    Edité par lorrio 12 janvier 2015 à 12:52:50

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      12 janvier 2015 à 13:06:29

                                      Oui au temps pour moi ^^ ce que je voulais dire, c'est qu'il n'est pas forcement nécessaire d'en rajouter un alors que le println fais le boulot ^^

                                      -
                                      Edité par steph02590 12 janvier 2015 à 13:06:48

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        14 janvier 2015 à 20:30:26

                                        Merci beaucoup pour vos réponses,

                                        Juste pour savoir, si j’utilise la lib ethernet, me sera t'il possible tout de même de les stocker dans un document txt directement, ou je devrais plutôt le faire côté php dès que j'aurais reçu les variables ? :)

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          14 janvier 2015 à 20:52:49

                                          Coté serveur, une page HTML n'est pas exécutée mais juste envoyée en brut à celui qui en fait la demande.

                                          Si tu as une action à faire (consulter une base de données, écrire un fichier, générer du contenu dynamique...), il faut forcément un script CGI associé au serveur HTTP et c'est généralement PHP que l'on utilise pour ça.

                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          [Arduino] Inscrire la variable sur le PC

                                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                          • Editeur
                                          • Markdown