//Dialogue_Arduino_Smartphone_18_11_17 //Deux fonctions: AttendreLigne() et VoirSiLignePresente() //**************** AttendreLigne())********************** //Pour échanger une ligne de texte entre Smartphone et Arduinor //ligne entrée au clavier du Smartphone //Necessite un module HC 05 ou 06 connecté à l'Arduino en 9600bps //Pour s'affranchir des caractères de controle ( CR,LF,...) qui diffèrent suivant les applications Bluetooth //Certaines applis comme BlueTerm+ n'ont pas de buffer, un car tapé part tout de suite //Suivant les applis,on émet la chaine par une touche "Send ASCII" ou "Submit" ou "Enter" ... // La String "Ligne recevra" la chaine entrée sans le ou les car de fin de ligne //Application recommandée: "Bluetooth Terminal HC-05 " (OK aussi pour le HC06) //Autres applis: "Bluetooth Terminal-Domolin"," BlueTerm+",... //********************VoirSiLignePresente()*************** //Pour tester "au vol" si une ligne a été entré au clavier du smartphone. //On recupère Ligne ="" si aucun car tapé //*****************Comportement du buffer****************** //BT.available() a pour valeur le nombre de car dans le buffer //compris les car de fin de ligne CR(13) LF(10) //BT.read() retourne le premier car non lu et -1 si BT.available()=0 //c'est à dire si le buffer est vide //******************************************** #include SoftwareSerial BT(10, 11); // RX,TX respectivement vers le HC05/06 à 9600bps String Ligne; //On y accumule les car valides mais non les fin de ligne char carLu;//Recoit le car entré int intLigne = 0; //Ligne convertie en entier, à tout hasard /////////////////////////////////////////// void AttendreLigne()/////////////////////////////////// { //On n'en ressort qu'avec Ligne remplie while (BT.available() == 0); //on attend qu'un car soit present dans le buffer VoirSiLignePresente();//On va remplir Ligne } void monDelay_ms(int unsigned long delai)///////////////////////////// { //Attente en ms, remplace delay(), interdite avec les IT volatile float ct = 0; volatile float duree = delai * 100 / 1.25; //100 pour 1.25ms environ while (ct < duree) ct++ ;//Pour ne pas manquer un car } void VoirSiLignePresente()////////////////////////////////////// { //Si aucun car dans le buffer d'entrée, on ressort immediatement Ligne = ""; //String donc double quote while (BT.available() > 0) // BT.available()= nombre de car dans le buffer { monDelay_ms(300);//Pour ne pas manquer un car.Assez lent pour l'appli BlueTerm +,par exemple //qui envoie chaque car immediatement, sans touche "Envoi". Qd on entre 2 chiffres, il faut ces 300ms char carLu; carLu = BT.read(); //Si pas de car en attente ds buffer on sort tt de suite // if ((carLu >= 32 ////Car valable,alphabetique, on le garde // ) && (carLu <= 122))Ligne = Ligne + carLu; // Tous les autres car, tels CR,LF, !,&, + etc sont ignorés if ((carLu == 13) || (carLu == 10)); //ignorer CR et LF uniquement, garder les autres car else Ligne = Ligne + carLu; //Car valable,alphabetique ou autre, on le garde } //Le buffer est vide intLigne = Ligne.toInt(); //Convertir en entier a tout hasard } void setup() { //Pour tester AttendreLigne() BT.begin(9600);//La liaison série soft D10 et D11 vers module Bt HC05 ou 06 Serial.begin(9600);//!!!VERIFIER cette vitesse!! Serial.println("Salut, entrer une ligne depuis le sphone "); AttendreLigne(); Serial.println(Ligne); delay(1000); } /////////////////////////// void loop() { //Pour tester VoirSiLignePresente() Serial.println("On attend une ligne"); VoirSiLignePresente();// Si buffer vide on ressort tout de suitre Serial.println(Ligne); delay(1000); }