Partage
  • Partager sur Facebook
  • Partager sur Twitter

Besoin d'aide(s) pour une connection arduino/BdD

    26 avril 2017 à 19:46:58

    Qui a parlé de site WEB ?

    Pour le moment, tu veux que ta RPi enregistre les données de l'arduino dans sa base de données non ?

    Pour cela, je te propose de faire un script PHP que tu lance en mode console sur ta RPi.

    Script qui pourra (et devrait) d'ailleurs être lancé automatiquement en tache de fond au démarrage de la RPi.

    Il n'y a rien de WEB là dedans.

    Une fois que tes données sont dans la base de données, tu en fais ce que tu veux.

    Si tu veux faire un site WEB qui permet de les lires, c'est ton choix.

    Mais ce site WEB n'a aucun rapport avec le script PHP en mode console, ce sont 2 choses bien distinctes.

    -
    Edité par lorrio 26 avril 2017 à 19:47:48

    • Partager sur Facebook
    • Partager sur Twitter
      26 avril 2017 à 21:22:39

      A ok je n'avais pas compris ça ^^ Oui effectivement c'est pas bête du tout, je vais voir si je trouve des infos là-dessus parce que je ne connais pas les fonctions PHP concernant le Serial.

      Pour être sûr : le fameux script en php qui tournera sur la RPi, on l'écrit dans n'importe quel éditeur de texte sur la RPi ou alors il faut quelque chose en particulier ? Ça peut paraitre débile comme question mais sur PC j'utilise Sublim Text et je sais pas si la RPi à un équivalent ^^'

      Merci !

      • Partager sur Facebook
      • Partager sur Twitter
        26 avril 2017 à 22:09:19

        Des éditeurs de texte sur RPi, ce n'est pas ce qu'il manque.

        Peut-être même qu'il y a sublime texte de dispo.

        Mais au pire des cas, tu peux toujours coder ton script sous windows avec sublime texte puis le transférer à la RPi par SSH.

        • Partager sur Facebook
        • Partager sur Twitter
          26 avril 2017 à 23:38:11

          Donc, j'ai suivi t'es conseils et j'ai cherché sur internet comment faire.

          J'ai d'abord fais des test sur la console de ma RPi pour essayer d'afficher un mot venant d'un script php, et ça à fonctionné, reste plus qu'à le faire avec l'arduino.

          J'ai trouvé ce script : https://www.phpclasses.org/package/3679-PHP-Communicate-with-a-serial-port.html (je met le lien car il y à un dossier à télécharger et un des script clés est beaucoup trop long pour que je le mette ici ^^) avec ce script que j'ai modifié pour qu'il affiche le $read :

          <?php
          include "php_serial.class.php";
          
          // Let's start the class
          $serial = new phpSerial;
          
          // First we must specify the device. This works on both linux and windows (if
          // your linux serial device is /dev/ttyS0 for COM1, etc)
          $serial->deviceSet("/dev/ttyACM0");
          
          // Then we need to open it
          $serial->deviceOpen();
          
          // To write into
          $serial->sendMessage("Hello !");
          
          // Or to read from
          $read = $serial->readPort();
          print($read);
          // If you want to change the configuration, the device must be closed
          $serial->deviceClose();
          
          // We can change the baud rate
          $serial->confBaudRate(2400);
          
          // etc...
          ?>
          

          Script qui est sensé lire et/ou écrire via une connexion série. J'ai donc rapidement écris un programme sur arduino :

          void setup(){
          
            Serial.begin(9600);
          }
          void loop(){
          
          Serial.print("toto");
          
          }

          Et j'ai connecté mon arduino à ma RPi. J'ai ensuite utilisé cette commande (src : http://www.skilly.com/mag/cli-php-en-ligne-commande/ ):

          #!/cli/php /var/www/toto.php

          puis

          php /var/www/toto.php

          (comme je l'avais fais pour mon premier test)

          Seulement, rien ne s'affiche sur ma console. Donc je ne sais pas d'où peut venir le problème, sûrement du script php mais je ne sais pas trop.

          Si tu as une idée ^^

          Merci d'avance !



          -
          Edité par Netsch 27 avril 2017 à 12:16:05

          • Partager sur Facebook
          • Partager sur Twitter
            28 avril 2017 à 9:50:40

            petit up pour qu'on voit que j'ai écrit quelque chose ^^
            • Partager sur Facebook
            • Partager sur Twitter
              28 avril 2017 à 19:44:24

              Tu devrais paramétrer la vitesse avant d'ouvrir le serial.

              <?php
              
              include "php_serial.class.php";
               
              $serial = new phpSerial;
              
              $serial->deviceSet("/dev/ttyACM0");
              
              $serial->confBaudRate(9600);
              
              $serial->deviceOpen();
               
              while (1) {
              	$read = $serial->readPort();
              	print($read);
              }
              
              $serial->deviceClose();
              
              ?>



              • Partager sur Facebook
              • Partager sur Twitter
                29 avril 2017 à 10:37:59

                Merci du conseil, ça à effectivement changé un petit peu : maintenant, la console lance le script mais n'affiche rien du tout comme si elle était dans une boucle infinie. Je me suis demandé si cela pouvait pas venir d'un problème que j'ai vu sur d'autres post, à savoir que l'arduino se reset entièrement à l'ouverture du port serie ?
                • Partager sur Facebook
                • Partager sur Twitter
                  29 avril 2017 à 21:18:26

                  while (1) {
                      $read = $serial->readPort();
                      print($read);
                  }

                  Un while 1, c'est une boucle infinie.

                  Ce programme lit en permanence le port série et affiche ce qu'il lit.

                  -----

                  Quand au reset de l'arduino quand tu ouvres le port, c'est tout à fait normale.

                  C'est une fonction spécial de l'arduino qui permet entre autre de pouvoir le reprogrammer.

                  Il est possible de la désactiver mais il faudra la réactiver si tu veux uploader un nouveau sketch.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    30 avril 2017 à 10:34:02

                    Ok je ne savais pas que while(1) est une boucle infinie ^^

                    Du coup j'ai cherché sur internet des infos pour pouvoir désactiver ce fameux reset automatique et je pense avoir trouvé cette commande :

                    stty --file=/dev/ttyUSB0 crtscts -hupcl

                    Mais le truc c'est que je sais pas comment revenir à la normale et réactiver le reset (car mon projet n'est pas fini et il va falloir modifier le code de la carte arduino encore et encore :) ). Ainsi, je n'ai pas osé essayer cette commande par peur d'être bloqué ^^
                    Et j'ai beau chercher, je ne trouve pas grand chose d'utile, Donc situ sais comment faire, je suis preneur

                    Merci d'avance !

                    • Partager sur Facebook
                    • Partager sur Twitter
                      30 avril 2017 à 19:33:23

                      Sur les dernières vers de arduino, il y a un jumper "RESET EN" spécialement prévu pour ça ;)

                      Si tu coupes la piste entre les 2 pads de soudure à l'aide d'un cutter, tu vas désactiver la fonction de reset automatique.

                      Et si tu rétablis la piste en faisant une boule de soudure reliant les 2 pads, alors tu vas réactiver la fonction de reset automatique.

                      Après, il est peut-être possible de le faire par logiciel avec une ligne de commande puisqu'il suffit de désactiver la ligne DTR sur le serial émulé.

                      Sinon, tu peux aussi la désactiver en plaçant une résistance de 120 ohm entre la pin 5V et la pin "RESET".

                      Mais est-ce vraiment dérangeant que la fonction de reset automatique soit activée ???

                      Pour la mise au point de ton programme, je ne pense pas que cela soit dérangeant.

                      Une fois que ton programme marche et que tu es prêt à faire une démo à tes profs, alors tu pourras la désactiver.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        1 mai 2017 à 10:55:30

                        Disons que si je la désactive, il va m'être un peu plus compliqué de tester tous les programmes à venir non ?

                        J'ai repéré sur la carte tout ce dont tu m'a parlé, le cas de la résistance est peut être le moins impactant pour la carte ?

                        Le problème que je vois avec ta proposition c'est qu'il faut que je sois sûr que mon programme fonction le jour J ^^

                        • Partager sur Facebook
                        • Partager sur Twitter
                          3 mai 2017 à 16:09:05

                          Salut,

                          Du coup j'ai fait un truc auquel nous n'avions pas pensé mais qui est tout bête : installer l'IDE d'arduino directement sur la Raspberry ^^ Ce qui fait que on a juste besoin de mettre le programme dans l'arduino via la raspberry et le tour est joué. Donc ce problème = résolu :)

                          Maintenant, je suis sur l'insertion de cette donnée envoyé par l'arduino dans ma base de données. Pour ça j'ai codé le bon truc en PHP mais j'ai à nouveau un petit problème : les délais...

                          Je m'explique : ma carte arduino envoi en permanence un nombre "42" et le programme qu'on a vu précédemment s'occupe de lire ce chiffre et de l'envoyer à la base de données :

                          <?php
                          include "php_serial.class.php";
                          
                          // Let's start the class
                          $serial = new phpSerial;
                          
                          // First we must specify the device. This works on both linux and windows (if
                          // your linux serial device is /dev/ttyS0 for COM1, etc)
                          $serial->deviceSet("/dev/ttyACM0");
                          
                          $serial->confBaudRate(9600);
                          
                          
                          // Then we need to open it
                          $serial->deviceOpen();
                          
                          // To write into
                          //$serial->sendMessage("Hello !");
                          
                          while (1) {
                          	// Or to read from
                          	$read = $serial->readPort();
                          	print("$read");
                          	mysql_connect("ip_serveur", "name", "mdp") or die (mysql_error ());
                          	mysql_select_db("name") or die(mysql_error());
                          	$strSQL = "INSERT INTO test(id,heure,temp_int,temp_ext,lum,pluie,humValor) VALUES('','','$read','','','','')";
                          	mysql_query($strSQL) or die (mysql_error());
                          	mysql_close();
                          	
                          }
                          // If you want to change the configuration, the device must be closed
                          $serial->deviceClose();
                          
                          // We can change the baud rate
                          //$serial->confBaudRate(2400);
                          
                          ?>
                          

                          (Notez que j'ai laissé plein de ' ' dans ma requête pour ma BdD car il y a plusieurs colonnes que je n'utilise pas pour mon test)

                          Et le truc c'est que ça va trop vite ^^ et que le script php à le temps de créer 300 lignes dans ma BdD entre chaque insertion du chiffre "42"... Donc c'est pas vraiment bon tout ça... Ducoup j'ai essayé de mettre un "break;" à la fin de la boucle mais là pour le coup, le script de l'arduino est trop lent est aucune données ne peut être rentrées dans la BdD.

                          Donc si tu as une idée..

                          Merci d'avance !

                          Edit : je suis peut-être plus dans le bon forum pour ce genre de question ?

                          -
                          Edité par Netsch 3 mai 2017 à 16:16:50

                          • Partager sur Facebook
                          • Partager sur Twitter
                            3 mai 2017 à 17:28:14

                            Est-ce que ce ne serait pas ton programme arduino qui spam des 42 trop vite par hasard ???

                            D'ailleurs, quel est ton code arduino ?

                            • Partager sur Facebook
                            • Partager sur Twitter
                              3 mai 2017 à 18:35:42

                              Peut être...

                              mon code est on ne peu plus simple :

                              void setup(){
                               
                                Serial.begin(9600);
                              }
                              void loop(){
                               
                              Serial.print("42");
                               
                              }



                              • Partager sur Facebook
                              • Partager sur Twitter
                                3 mai 2017 à 19:22:38

                                Sur arduino, la fonction loop s'exécute en boucle.

                                Donc une fois qu'il a finit de faire le Serial.print, il recommence un nouveau Serial.print...

                                A noter qu'à 9600b, chaque caractère prend environ 1ms à envoyer au PC donc ton arduino envoie environ 500 fois "42" par secondes.

                                Il ne faut pas s'étonner que tu te retrouve avec 300 enregistrements dans ta base de données.

                                Tu pourrais ajouter un delay pour que l'arduino n'envoie que un seul 42 par seconde.

                                void setup(){
                                  Serial.begin(9600);
                                }
                                
                                void loop(){
                                  Serial.print("42");
                                  delay(1000);
                                }



                                • Partager sur Facebook
                                • Partager sur Twitter
                                  3 mai 2017 à 22:30:10

                                  Oui j'ai déjà essayé cette méthode mais je pense que le problème vient plus de mon script php qui boucle à l'infini et surtout qui effectue beaucoup de chose très vite. Ducoup, dans ma BdD, je me retrouve avec plein de lignes de "0" et de temps en temps une ligne avec "42" ^^ Donc peut être que la solution serait de "contrôler" le while(0) du script php ?
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    3 mai 2017 à 23:01:18

                                    Je ne connais pas la classe php_serial.class.php mais si celle-ci ne bloque pas le script temps qu'il n'y a pas de données de disponible, alors tu vas effectivement avoir un problème car tu vas insérer du vide dans ta base de données.

                                    Et comme ta colonne doit être un type int, ce vide se transforme en 0.

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      4 mai 2017 à 19:11:56

                                      Tu crois qu'en changeants le type de ma colonne je pourrais contrôler mon script ? Ou alors il faut voir plus en détails la classe php ?
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        4 mai 2017 à 19:17:11

                                        La base de donnée n'a rien à voir là dedans.

                                        C'est le script PHP que tu dois adapter pour n'insérer une donnée que lorsque celle-ci est complète.

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          4 mai 2017 à 19:28:43

                                          ok c'est bien ce cque je ppensais.

                                          J'ai vaguement essayé ça :

                                          while(!empty($read)){
                                          	$read = $serial->readPort();
                                          	print("$read");
                                          	mysql_connect("ip", "name", "mdp") or die (mysql_error ());
                                          	mysql_select_db("name") or die(mysql_error());
                                          	$strSQL = "INSERT INTO test(id,heure,temp_int,temp_ext,lum,pluie,humValor) VALUES('','','$read','','','','')";
                                          	mysql_query($strSQL) or die (mysql_error());
                                          	mysql_close();
                                          	break;
                                          }

                                          Mais ça n'a pas fonctionné, enfin du moins, il n'y a aucun bug mais je n'ai aucun "42" dans ma BdD donc je pense que ce n'est pas la bonne méthode...

                                          -
                                          Edité par Netsch 4 mai 2017 à 19:29:12

                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          Besoin d'aide(s) pour une connection arduino/BdD

                                          × 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